import {InjectedRouter} from 'react-router';
import {Location} from 'history';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import GlobalModal from 'sentry/components/globalModal';
import {Organization} from 'sentry/types';
import {OrganizationContext} from 'sentry/views/organizationContext';
import {RouteContext} from 'sentry/views/routeContext';
import OrganizationSecurityAndPrivacy from 'sentry/views/settings/organizationSecurityAndPrivacy';
function ComponentProviders({
router,
location,
organization,
children,
}: {
children: React.ReactNode;
location: Location;
organization: Organization;
router: InjectedRouter;
}) {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/auth-provider/`,
method: 'GET',
body: {},
});
return (
{children}
);
}
describe('OrganizationSecurityAndPrivacy', function () {
it('shows require2fa switch', async function () {
const {organization, router} = initializeOrg();
render(
);
expect(
await screen.findByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
).toBeInTheDocument();
});
it('returns to "off" if switch enable fails (e.g. API error)', async function () {
const {organization, router} = initializeOrg();
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/`,
method: 'PUT',
statusCode: 500,
});
render(
);
userEvent.click(
await screen.findByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
);
// Hide console.error for this test
jest.spyOn(console, 'error').mockImplementation(() => {});
// Confirm but has API failure
userEvent.click(screen.getByRole('button', {name: 'Confirm'}));
expect(
await screen.findByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
).not.toBeChecked();
});
it('renders join request switch', async function () {
const {organization, router} = initializeOrg();
render(
);
expect(
await screen.findByRole('checkbox', {
name: 'Enable to allow users to request to join your organization',
})
).toBeInTheDocument();
});
it('enables require2fa but cancels confirm modal', async function () {
const {organization, router} = initializeOrg();
const mock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/`,
method: 'PUT',
});
render(
);
userEvent.click(
await screen.findByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
);
// Cancel
userEvent.click(screen.getByRole('button', {name: 'Cancel'}));
expect(
screen.getByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
).not.toBeChecked();
expect(mock).not.toHaveBeenCalled();
});
it('enables require2fa with confirm modal', async function () {
const {organization, router} = initializeOrg();
const mock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/`,
method: 'PUT',
});
render(
);
userEvent.click(
await screen.findByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
);
userEvent.click(screen.getByRole('button', {name: 'Confirm'}));
expect(
screen.getByRole('checkbox', {
name: 'Enable to require and enforce two-factor authentication for all members',
})
).toBeChecked();
expect(mock).toHaveBeenCalledWith(
'/organizations/org-slug/',
expect.objectContaining({
method: 'PUT',
data: {
require2FA: true,
},
})
);
});
});