Files
remark42/frontend/app/store/user/reducers.test.ts
T
2019-04-28 19:27:36 +03:00

88 lines
2.2 KiB
TypeScript

import api from '@app/common/api';
import { User } from '@app/common/types';
import { fetchUser, logIn, logout } from './actions';
import { user } from './reducers';
import { USER_SET } from './types';
jest.mock('@app/common/api');
afterEach(() => {
jest.resetModules();
});
describe('user', () => {
it('should return null by default', () => {
const action = { type: 'OTHER' };
const newState = user(null, action as any);
expect(newState).toEqual(null);
});
it('should set state of user on fetchUser', async () => {
(api.getUser as any).mockImplementation(
async (): Promise<User> =>
({
id: 'john',
name: 'John',
admin: true,
} as User)
);
const dispatch = jest.fn();
const getState = jest.fn();
await fetchUser()(dispatch, getState, undefined);
expect(dispatch).toBeCalledWith({
type: USER_SET,
user: {
id: 'john',
name: 'John',
admin: true,
},
});
});
it('should set state of user on logIn', async () => {
(api.logIn as any).mockImplementation(
async (): Promise<User> =>
({
id: 'john',
name: 'John',
admin: true,
} as User)
);
const dispatch = jest.fn();
const getState = jest.fn();
await logIn({ name: 'google' })(dispatch, getState, undefined);
expect(dispatch).toBeCalledWith({
type: USER_SET,
user: {
id: 'john',
name: 'John',
admin: true,
},
});
});
it('should NOT set state of user on failed logIn', async () => {
(api.logIn as any).mockImplementation(
async (): Promise<User> => {
throw new Error('Unauthorized');
}
);
const dispatch = jest.fn();
const getState = jest.fn();
await logIn({ name: 'google' })(dispatch, getState, undefined).catch(() => {});
expect(dispatch).not.toBeCalled();
});
it('should unset user on logOut', async () => {
(api.logOut as any).mockImplementation(async (): Promise<void> => {});
const dispatch = jest.fn();
const getState = jest.fn();
await logout()(dispatch, getState, undefined);
expect(dispatch).toBeCalledWith({
type: USER_SET,
user: null,
});
});
});