import {mountWithTheme} from 'sentry-test/enzyme'; import ProjectCspReports from 'sentry/views/settings/projectSecurityHeaders/csp'; describe('ProjectCspReports', function () { const org = TestStubs.Organization(); const project = TestStubs.Project(); const projectUrl = `/projects/${org.slug}/${project.slug}/`; const routeUrl = `/projects/${org.slug}/${project.slug}/csp/`; beforeEach(function () { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/projects/${org.slug}/${project.slug}/keys/`, method: 'GET', body: [], }); MockApiClient.addMockResponse({ url: projectUrl, method: 'GET', body: { options: {}, }, }); }); it('renders', function () { const wrapper = mountWithTheme( ); expect(wrapper).toSnapshot(); }); it('can enable default ignored sources', function () { const wrapper = mountWithTheme( ); const mock = MockApiClient.addMockResponse({ url: projectUrl, method: 'PUT', }); expect(mock).not.toHaveBeenCalled(); // Click Regenerate Token wrapper.find('Switch').simulate('click'); expect(mock).toHaveBeenCalledWith( projectUrl, expect.objectContaining({ method: 'PUT', data: { options: { 'sentry:csp_ignored_sources_defaults': true, }, }, }) ); }); it('can set additional ignored sources', function () { const wrapper = mountWithTheme( ); const mock = MockApiClient.addMockResponse({ url: projectUrl, method: 'PUT', }); expect(mock).not.toHaveBeenCalled(); // Click Regenerate Token wrapper .find('textarea') .simulate('change', { target: { value: `test test2`, }, }) .simulate('blur'); 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 test2`, }, }, }) ); }); });