import Cookies from 'js-cookie';
import * as qs from 'query-string';
import {AccountEmailsFixture} from 'sentry-fixture/accountEmails';
import {AuthenticatorsFixture} from 'sentry-fixture/authenticators';
import {OrganizationsFixture} from 'sentry-fixture/organizations';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen} from 'sentry-test/reactTestingLibrary';
import TwoFactorRequired from 'sentry/views/settings/account/accountSecurity/';
import AccountSecurityWrapper from 'sentry/views/settings/account/accountSecurity/accountSecurityWrapper';
const ENDPOINT = '/users/me/authenticators/';
const ORG_ENDPOINT = '/organizations/';
const INVITE_COOKIE = 'pending-invite';
const ACCOUNT_EMAILS_ENDPOINT = '/users/me/emails/';
describe('TwoFactorRequired', function () {
beforeEach(function () {
MockApiClient.clearMockResponses();
MockApiClient.addMockResponse({
url: ENDPOINT,
body: [AuthenticatorsFixture().Totp({isEnrolled: false})],
});
MockApiClient.addMockResponse({
url: ORG_ENDPOINT,
body: OrganizationsFixture(),
});
MockApiClient.addMockResponse({
url: ACCOUNT_EMAILS_ENDPOINT,
body: AccountEmailsFixture(),
});
});
const {router, routerProps} = initializeOrg();
const baseProps = {
authenticators: null,
countEnrolled: 0,
deleteDisabled: false,
handleRefresh: () => {},
hasVerifiedEmail: false,
onDisable: () => {},
orgsRequire2fa: [],
...routerProps,
};
it('renders empty', async function () {
MockApiClient.addMockResponse({
url: ORG_ENDPOINT,
body: [],
});
render(
,
{router}
);
expect(await screen.findByText('Your current password')).toBeInTheDocument();
expect(screen.queryByTestId('require-2fa')).not.toBeInTheDocument();
});
it('does not render when 2FA is disabled and no pendingInvite cookie', async function () {
render(
,
{router}
);
expect(await screen.findByText('Your current password')).toBeInTheDocument();
expect(screen.queryByTestId('require-2fa')).not.toBeInTheDocument();
});
it('does not render when 2FA is enrolled and no pendingInvite cookie', async function () {
MockApiClient.addMockResponse({
url: ENDPOINT,
body: [AuthenticatorsFixture().Totp({isEnrolled: true})],
});
render(
,
{router}
);
expect(await screen.findByText('Your current password')).toBeInTheDocument();
expect(screen.queryByTestId('require-2fa')).not.toBeInTheDocument();
});
it('does not render when 2FA is enrolled and has pendingInvite cookie', async function () {
const cookieData = {
memberId: 5,
token: 'abcde',
url: '/accept/5/abcde/',
};
Cookies.set(INVITE_COOKIE, qs.stringify(cookieData));
MockApiClient.addMockResponse({
url: ENDPOINT,
body: [AuthenticatorsFixture().Totp({isEnrolled: true})],
});
MockApiClient.addMockResponse({
url: ORG_ENDPOINT,
body: OrganizationsFixture({require2FA: true}),
});
render(
,
{router}
);
expect(await screen.findByText('Your current password')).toBeInTheDocument();
expect(screen.queryByTestId('require-2fa')).not.toBeInTheDocument();
Cookies.remove(INVITE_COOKIE);
});
it('renders when 2FA is disabled and has pendingInvite cookie', async function () {
Cookies.set(INVITE_COOKIE, '/accept/5/abcde/');
MockApiClient.addMockResponse({
url: ORG_ENDPOINT,
body: OrganizationsFixture({require2FA: true}),
});
render(
,
{router}
);
expect(await screen.findByTestId('require-2fa')).toBeInTheDocument();
Cookies.remove(INVITE_COOKIE);
});
});