import {mountWithTheme} from 'sentry-test/enzyme';
import {Client} from 'sentry/api';
import AccountSecurityEnroll from 'sentry/views/settings/account/accountSecurity/accountSecurityEnroll';
const ENDPOINT = '/users/me/authenticators/';
describe('AccountSecurityEnroll', function () {
let wrapper;
describe('Totp', function () {
Client.clearMockResponses();
const authenticator = TestStubs.Authenticators().Totp({
isEnrolled: false,
qrcode: 'otpauth://totp/test%40sentry.io?issuer=Sentry&secret=secret',
secret: 'secret',
form: [
{
type: 'string',
name: 'otp',
},
],
});
beforeAll(function () {
Client.addMockResponse({
url: `${ENDPOINT}${authenticator.authId}/enroll/`,
body: authenticator,
});
wrapper = mountWithTheme(
,
TestStubs.routerContext([
{
router: {
...TestStubs.router(),
params: {
authId: authenticator.authId,
},
},
},
])
);
});
it('does not have enrolled circle indicator', function () {
expect(wrapper.find('CircleIndicator').prop('enabled')).toBe(false);
});
it('has qrcode component', function () {
expect(wrapper.find('QRCodeCanvas')).toHaveLength(1);
});
it('can enroll', function () {
const enrollMock = Client.addMockResponse({
url: `${ENDPOINT}${authenticator.authId}/enroll/`,
method: 'POST',
});
wrapper.find('input[name="otp"]').simulate('change', {target: {value: 'otp'}});
wrapper.find('Form').simulate('submit');
expect(enrollMock).toHaveBeenCalledWith(
`${ENDPOINT}15/enroll/`,
expect.objectContaining({
method: 'POST',
data: expect.objectContaining({
secret: 'secret',
otp: 'otp',
}),
})
);
});
it('can redirect with already enrolled error', function () {
Client.addMockResponse({
url: `${ENDPOINT}${authenticator.authId}/enroll/`,
body: {details: 'Already enrolled'},
statusCode: 400,
});
const pushMock = jest.fn();
wrapper = mountWithTheme(
,
TestStubs.routerContext([
{
router: {
...TestStubs.router({
push: pushMock,
}),
params: {
authId: authenticator.authId,
},
},
},
])
);
expect(pushMock).toHaveBeenCalledWith('/settings/account/security/');
});
});
});