Ocelot-Social/webapp/store/auth.test.js
2019-05-23 19:40:39 +02:00

214 lines
5.8 KiB
JavaScript

import { getters, actions } from './auth.js'
let state
let commit
let dispatch
const token =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwic2x1ZyI6Implbm55LXJvc3RvY2siLCJuYW1lIjoiSmVubnkgUm9zdG9jayIsImF2YXRhciI6Imh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS91aWZhY2VzL2ZhY2VzL3R3aXR0ZXIvbXV0dV9rcmlzaC8xMjguanBnIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUub3JnIiwicm9sZSI6InVzZXIiLCJpYXQiOjE1NDUxNDQ2ODgsImV4cCI6MTYzMTU0NDY4OCwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo0MDAwIiwic3ViIjoidTMifQ.s5_JeQN9TaUPfymAXPOpbMAwhmTIg9cnOvNEcj4z75k'
const currentUser = {
id: 'u3',
name: 'Jenny Rostock',
slug: 'jenny-rostock',
email: 'user@example.org',
avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/mutu_krish/128.jpg',
role: 'user',
}
const successfulLoginResponse = { data: { login: token } }
const successfulCurrentUserResponse = { data: { currentUser } }
/*
const incorrectPasswordResponse = {
data: {
login: null,
},
errors: [
{
message: 'Incorrect password.',
locations: [
{
line: 2,
column: 3,
},
],
path: ['login'],
},
],
}
*/
beforeEach(() => {
commit = jest.fn()
dispatch = jest.fn(() => Promise.resolve())
})
describe('getters', () => {
describe('isAuthenticated', () => {
describe('given JWT Bearer token', () => {
test('true', () => {
state = { token }
expect(getters.isAuthenticated(state)).toBe(true)
})
})
})
})
describe('actions', () => {
let action
describe('init', () => {
const theAction = () => {
const module = {
app: {
$apolloHelpers: {
getToken: () => token,
},
},
}
action = actions.init.bind(module)
return action({ commit, dispatch })
}
describe('client-side', () => {
beforeEach(() => {
process.server = false
})
it('returns', async () => {
await theAction()
expect(dispatch.mock.calls).toEqual([])
expect(commit.mock.calls).toEqual([])
})
})
describe('server-side', () => {
beforeEach(() => {
process.server = true
})
it('fetches the current user', async () => {
await theAction()
expect(dispatch.mock.calls).toEqual([['fetchCurrentUser']])
})
it('saves the JWT Bearer token', async () => {
await theAction()
expect(commit.mock.calls).toEqual(expect.arrayContaining([['SET_TOKEN', token]]))
})
})
})
describe('fetchCurrentUser', () => {
describe('given a successful response', () => {
beforeEach(async () => {
const module = {
app: {
apolloProvider: {
defaultClient: {
query: jest.fn(() => Promise.resolve(successfulCurrentUserResponse)),
},
},
},
}
action = actions.fetchCurrentUser.bind(module)
await action({ commit })
})
it('saves user data without token', () => {
expect(commit.mock.calls).toEqual(
expect.arrayContaining([
[
'SET_USER',
{
id: 'u3',
name: 'Jenny Rostock',
slug: 'jenny-rostock',
email: 'user@example.org',
avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/mutu_krish/128.jpg',
role: 'user',
},
],
]),
)
})
})
})
describe('login', () => {
describe('given valid credentials and a successful response', () => {
beforeEach(async () => {
const module = {
app: {
apolloProvider: {
defaultClient: {
mutate: jest.fn(() => Promise.resolve(successfulLoginResponse)),
},
},
$apolloHelpers: {
onLogin: jest.fn(() => Promise.resolve()),
},
},
}
action = actions.login.bind(module)
await action({ commit, dispatch }, { email: 'user@example.org', password: '1234' })
})
afterEach(() => {
action = null
})
it('saves the JWT Bearer token', () => {
expect(commit.mock.calls).toEqual(expect.arrayContaining([['SET_TOKEN', token]]))
})
it('fetches the user', () => {
expect(dispatch.mock.calls).toEqual([['fetchCurrentUser']])
})
it('saves pending flags in order', () => {
expect(commit.mock.calls).toEqual(
expect.arrayContaining([['SET_PENDING', true], ['SET_PENDING', false]]),
)
})
})
describe('given invalid credentials and incorrect password response', () => {
let onLogin
let mutate
beforeEach(() => {
mutate = jest.fn(() => Promise.reject('This error is expected.')) // eslint-disable-line prefer-promise-reject-errors
onLogin = jest.fn(() => Promise.resolve())
const module = {
app: {
apolloProvider: { defaultClient: { mutate } },
$apolloHelpers: { onLogin },
},
}
action = actions.login.bind(module)
})
afterEach(() => {
action = null
})
it('populates error messages', async () => {
expect(
action({ commit }, { email: 'user@example.org', password: 'wrong' }),
).rejects.toThrowError('This error is expected.')
expect(mutate).toHaveBeenCalled()
expect(onLogin).not.toHaveBeenCalled()
})
it('saves pending flags in order', async () => {
try {
await action({ commit }, { email: 'user@example.org', password: 'wrong' })
} catch (err) {} // ignore
expect(commit.mock.calls).toEqual(
expect.arrayContaining([['SET_PENDING', true], ['SET_PENDING', false]]),
)
})
})
})
})