import {OrganizationFixture} from 'sentry-fixture/organization';
import {ProjectFixture} from 'sentry-fixture/project';
import {TeamFixture} from 'sentry-fixture/team';
import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
import {processInitQueue} from 'sentry/bootstrap/processInitQueue';
import AlertStore from 'sentry/stores/alertStore';
import IndicatorStore from 'sentry/stores/indicatorStore';
import {SentryInitRenderReactComponent} from 'sentry/types/system';
describe('processInitQueue', function () {
describe('renderReact', function () {
it('renders password strength input', async () => {
window.__onSentryInit = [
{
name: 'passwordStrength',
input: '#password',
element: '#password-strength',
},
];
render(
);
processInitQueue();
// Assert that password strength renders and reacts to user input
await userEvent.type(screen.getByPlaceholderText('password'), '!');
expect(await screen.findByText('Very Weak')).toBeInTheDocument();
// Type the rest of the password
await userEvent.type(
screen.getByPlaceholderText('password'),
'!!!!!supersecretpassword!!!!!!'
);
expect(await screen.findByText('Very Strong')).toBeInTheDocument();
});
it('renders indicators', async () => {
window.__onSentryInit = [
{
component: SentryInitRenderReactComponent.INDICATORS,
container: '#indicator-container',
name: 'renderReact',
},
];
IndicatorStore.add('Indicator Alert', 'success');
render();
processInitQueue();
expect(await screen.findByText('Indicator Alert')).toBeInTheDocument();
});
it('renders system alerts', async () => {
window.__onSentryInit = [
{
component: SentryInitRenderReactComponent.SYSTEM_ALERTS,
container: '#system-alerts-container',
name: 'renderReact',
},
];
AlertStore.addAlert({
message: 'System Alert',
type: 'success',
});
render();
processInitQueue();
expect(await screen.findByText('System Alert')).toBeInTheDocument();
});
it('renders setup wizard', async () => {
window.__onSentryInit = [
{
component: SentryInitRenderReactComponent.SETUP_WIZARD,
container: '#setup-wizard-container',
name: 'renderReact',
props: {
enableProjectSelection: true,
hash: '1',
},
},
];
MockApiClient.addMockResponse({
url: '/organizations/',
body: [
OrganizationFixture({
id: '1',
slug: 'organization-1',
name: 'Organization 1',
access: [],
features: [],
}),
],
});
MockApiClient.addMockResponse({
url: '/organizations/organization-1/',
body: OrganizationFixture({
id: '1',
slug: 'organization-1',
name: 'Organization 1',
features: [],
access: [],
}),
});
MockApiClient.addMockResponse({
url: '/organizations/organization-1/projects/',
body: [
ProjectFixture({
id: '1',
slug: 'project-1',
name: 'Project 1',
}),
],
});
MockApiClient.addMockResponse({
url: '/organizations/organization-1/user-teams/',
body: [TeamFixture({id: '1', slug: 'team-1', name: 'Team 1'})],
});
render();
processInitQueue();
expect(await screen.findByText('Select your Sentry project')).toBeInTheDocument();
});
it('renders u2f sign', async () => {
window.__onSentryInit = [
{
component: SentryInitRenderReactComponent.U2F_SIGN,
container: '#u2f-sign-container',
name: 'renderReact',
props: {
displayMode: 'signin',
},
},
];
render();
processInitQueue();
// U2F is not supported in the test environment
expect(
await screen.findByText(/Unfortunately your browser does not support U2F/)
).toBeInTheDocument();
});
it('renders superuser staff access form', async () => {
window.__onSentryInit = [
{
component: SentryInitRenderReactComponent.SU_STAFF_ACCESS_FORM,
container: '#su-staff-access-form-container',
name: 'renderReact',
},
];
const authenticatorsResponse = MockApiClient.addMockResponse({
url: '/authenticators/',
body: [],
});
render();
processInitQueue();
await waitFor(() => {
expect(authenticatorsResponse).toHaveBeenCalled();
});
expect(await screen.findByText('COPS/CSM')).toBeInTheDocument();
});
});
it('processes queued up items', function () {
const mock = jest.fn();
const init = {
name: 'onReady',
onReady: mock,
} as const;
window.__onSentryInit = [init];
processInitQueue();
expect(mock).toHaveBeenCalledTimes(1);
processInitQueue();
expect(mock).toHaveBeenCalledTimes(1);
window.__onSentryInit.push(init);
expect(mock).toHaveBeenCalledTimes(2);
});
it('is called after `processInitQueue` has already run', function () {
processInitQueue();
const mock = jest.fn();
const init = {
name: 'onReady',
onReady: mock,
} as const;
window.__onSentryInit.push(init);
expect(mock).toHaveBeenCalledTimes(1);
processInitQueue();
expect(mock).toHaveBeenCalledTimes(1);
});
});