accounts-frontend/packages/app/services/authFlow/MfaState.test.ts
2020-05-24 02:08:24 +03:00

103 lines
2.8 KiB
TypeScript

import expect from 'app/test/unexpected';
import sinon, { SinonMock } from 'sinon';
import MfaState from './MfaState';
import CompleteState from 'app/services/authFlow/CompleteState';
import PasswordState from 'app/services/authFlow/PasswordState';
import { bootstrap, expectState, expectNavigate, expectRun, MockedAuthContext } from './helpers';
describe('MfaState', () => {
let state: MfaState;
let context: MockedAuthContext;
let mock: SinonMock;
beforeEach(() => {
state = new MfaState();
const data = bootstrap();
context = data.context;
mock = data.mock;
});
afterEach(() => {
mock.verify();
});
describe('#enter', () => {
it('should navigate to /mfa', () => {
context.getState.returns({
auth: {
credentials: {
login: 'foo',
password: 'bar',
isTotpRequired: true,
},
},
});
expectNavigate(mock, '/mfa');
state.enter(context);
});
it('should transition to complete if no totp required', () => {
context.getState.returns({
auth: {
credentials: {
login: 'foo',
password: 'bar',
},
},
});
expectState(mock, CompleteState);
state.enter(context);
});
});
describe('#resolve', () => {
it('should call login with login and password', () => {
const expectedLogin = 'foo';
const expectedPassword = 'bar';
const expectedTotp = '111222';
const expectedRememberMe = true;
context.getState.returns({
auth: {
credentials: {
login: expectedLogin,
password: expectedPassword,
rememberMe: expectedRememberMe,
},
},
});
expectRun(
mock,
'login',
sinon.match({
totp: expectedTotp,
login: expectedLogin,
password: expectedPassword,
rememberMe: expectedRememberMe,
}),
).returns(Promise.resolve());
expectState(mock, CompleteState);
const payload = { totp: expectedTotp };
return expect(state.resolve(context, payload), 'to be fulfilled');
});
});
describe('#goBack', () => {
it('should transition to login state', () => {
expectState(mock, PasswordState);
state.goBack(context);
});
});
});