import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import ProjectCspReports from 'sentry/views/settings/projectSecurityHeaders/csp';
describe('ProjectCspReports', function () {
const {project, organization, router} = initializeOrg();
const projectUrl = `/projects/${organization.slug}/${project.slug}/`;
const routeUrl = `/projects/${organization.slug}/${project.slug}/csp/`;
beforeEach(function () {
MockApiClient.clearMockResponses();
MockApiClient.addMockResponse({
url: `/projects/${organization.slug}/${project.slug}/keys/`,
method: 'GET',
body: [],
});
MockApiClient.addMockResponse({
url: projectUrl,
method: 'GET',
body: {
options: {},
},
});
});
it('renders', function () {
const {container} = render(
);
expect(container).toSnapshot();
});
it('can enable default ignored sources', async function () {
render(
);
const mock = MockApiClient.addMockResponse({
url: projectUrl,
method: 'PUT',
});
expect(mock).not.toHaveBeenCalled();
// Click Regenerate Token
await userEvent.click(
screen.getByRole('checkbox', {name: 'Use default ignored sources'})
);
expect(mock).toHaveBeenCalledWith(
projectUrl,
expect.objectContaining({
method: 'PUT',
data: {
options: {
'sentry:csp_ignored_sources_defaults': true,
},
},
})
);
});
it('can set additional ignored sources', async function () {
render(
);
const mock = MockApiClient.addMockResponse({
url: projectUrl,
method: 'PUT',
});
expect(mock).not.toHaveBeenCalled();
await userEvent.type(
screen.getByRole('textbox', {name: 'Additional ignored sources'}),
'test\ntest2'
);
// Focus on other element, trigerring onBlur
await userEvent.tab();
expect(mock).toHaveBeenCalledWith(
projectUrl,
expect.objectContaining({
method: 'PUT',
data: {
// XXX: Org details endpoints accept these multiline inputs as a list, where as it looks like project details accepts it as a string with newlines
options: {
'sentry:csp_ignored_sources': `test\ntest2`,
},
},
})
);
});
});