|
import { describe, it, expect } from 'vitest'; |
|
import { allow } from 'graphql-shield'; |
|
import { isAuthenticated, authenticationRules } from './authentication.js'; |
|
import { createUser } from '../../test/factories/user.js'; |
|
import createAuthTokenByUserId from '../helpers/create-auth-token-by-user-id.js'; |
|
|
|
describe('isAuthenticated', () => { |
|
it('should return false if no token is provided', async () => { |
|
const req = { headers: {} }; |
|
expect(await isAuthenticated(null, null, req)).toBe(false); |
|
}); |
|
|
|
it('should return false if token is invalid', async () => { |
|
const req = { headers: { authorization: 'invalidToken' } }; |
|
expect(await isAuthenticated(null, null, req)).toBe(false); |
|
}); |
|
|
|
it('should return true if token is valid and there is a user', async () => { |
|
const user = await createUser(); |
|
const token = await createAuthTokenByUserId(user.id); |
|
|
|
const req = { headers: { authorization: token } }; |
|
expect(await isAuthenticated(null, null, req)).toBe(true); |
|
}); |
|
|
|
it('should return false if token is valid and but there is no user', async () => { |
|
const user = await createUser(); |
|
const token = await createAuthTokenByUserId(user.id); |
|
await user.$query().delete(); |
|
|
|
const req = { headers: { authorization: token } }; |
|
expect(await isAuthenticated(null, null, req)).toBe(false); |
|
}); |
|
}); |
|
|
|
describe('authentication rules', () => { |
|
const getQueryAndMutationNames = (rules) => { |
|
const queries = Object.keys(rules.Query || {}); |
|
const mutations = Object.keys(rules.Mutation || {}); |
|
return { queries, mutations }; |
|
}; |
|
|
|
const { queries, mutations } = getQueryAndMutationNames(authenticationRules); |
|
|
|
if (queries.length) { |
|
describe('for queries', () => { |
|
queries.forEach((query) => { |
|
it(`should apply correct rule for query: ${query}`, () => { |
|
const ruleApplied = authenticationRules.Query[query]; |
|
|
|
if (query === '*') { |
|
expect(ruleApplied.func).toBe(isAuthenticated); |
|
} else { |
|
expect(ruleApplied).toEqual(allow); |
|
} |
|
}); |
|
}); |
|
}); |
|
} |
|
|
|
describe('for mutations', () => { |
|
mutations.forEach((mutation) => { |
|
it(`should apply correct rule for mutation: ${mutation}`, () => { |
|
const ruleApplied = authenticationRules.Mutation[mutation]; |
|
|
|
if (mutation === '*') { |
|
expect(ruleApplied.func).toBe(isAuthenticated); |
|
} else { |
|
expect(ruleApplied).toBe(allow); |
|
} |
|
}); |
|
}); |
|
}); |
|
}); |
|
|