import {mountWithTheme} from 'sentry-test/enzyme'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {mountGlobalModal} from 'sentry-test/modal'; import ProjectSourceMapsDetail from 'sentry/views/settings/projectSourceMaps/detail'; import ProjectSourceMaps from 'sentry/views/settings/projectSourceMaps/list'; describe('ProjectSourceMaps', function () { const {organization, project, routerContext, router} = initializeOrg({}); const endpoint = `/projects/${organization.slug}/${project.slug}/files/source-maps/`; const props = { organization, project, params: {orgId: organization.slug, projectId: project.slug}, location: routerContext.context.location, router, }; it('renders', function () { MockApiClient.addMockResponse({ url: endpoint, body: [ TestStubs.SourceMapArchive(), TestStubs.SourceMapArchive({id: 2, name: 'abc'}), ], }); const wrapper = mountWithTheme(); const items = wrapper.find('SourceMapsArchiveRow'); expect(items).toHaveLength(2); expect(items.at(0).find('VersionText').text()).toBe('1234'); }); it('renders empty', function () { MockApiClient.addMockResponse({ url: endpoint, body: [], }); const wrapper = mountWithTheme(); expect(wrapper.find('EmptyStateWarning').text()).toBe( 'There are no archives for this project.' ); }); it('deletes the archive', async function () { const archive = TestStubs.SourceMapArchive(); MockApiClient.addMockResponse({ url: endpoint, body: [archive], }); const deleteMock = MockApiClient.addMockResponse({ method: 'DELETE', url: endpoint, }); const wrapper = mountWithTheme(); wrapper.find('button[aria-label="Remove All Artifacts"]').simulate('click'); // Confirm Modal const modal = await mountGlobalModal(); modal.find('Button[data-test-id="confirm-button"]').simulate('click'); expect(deleteMock).toHaveBeenCalledWith( endpoint, expect.objectContaining({query: {name: archive.name}}) ); }); it('filters archives', function () { const mockRouter = {push: jest.fn()}; const mock = MockApiClient.addMockResponse({ url: endpoint, body: [], }); const wrapper = mountWithTheme( ); expect(mock).toHaveBeenCalledWith( endpoint, expect.objectContaining({ query: {query: 'abc'}, }) ); wrapper .find('SearchBar input') .simulate('change', {target: {value: 'defg'}}) .simulate('submit', {preventDefault() {}}); expect(mockRouter.push).toHaveBeenCalledWith({ query: {cursor: undefined, query: 'defg'}, }); }); }); describe('ProjectSourceMapsDetail', function () { const {organization, project, routerContext, router} = initializeOrg({}); const archiveName = '1234'; const endpoint = `/projects/${organization.slug}/${project.slug}/releases/${archiveName}/files/`; const props = { organization, project, params: {orgId: organization.slug, projectId: project.slug, name: archiveName}, location: routerContext.context.location, router, }; it('renders', function () { MockApiClient.addMockResponse({ url: endpoint, body: [ TestStubs.SourceMapArtifact(), TestStubs.SourceMapArtifact({name: 'abc', id: '2'}), ], }); const wrapper = mountWithTheme(); const items = wrapper.find('SourceMapsArtifactRow'); expect(items).toHaveLength(2); expect(items.at(1).find('Name').text()).toBe('abc'); }); it('renders empty', function () { MockApiClient.addMockResponse({ url: endpoint, body: [], }); const wrapper = mountWithTheme(); expect(wrapper.find('EmptyStateWarning').text()).toBe( 'There are no artifacts in this archive.' ); }); it('links to release', function () { MockApiClient.addMockResponse({ url: endpoint, body: [], }); const wrapper = mountWithTheme(); expect(wrapper.find('Link[aria-label="Go to Release"]').prop('to')).toBe( `/organizations/${organization.slug}/releases/${archiveName}/?project=${project.id}` ); }); it('deletes all artifacts', async function () { MockApiClient.addMockResponse({ url: endpoint, body: [], }); const archiveDeleteEndpoint = `/projects/${organization.slug}/${project.slug}/files/source-maps/`; const deleteMock = MockApiClient.addMockResponse({ method: 'DELETE', url: archiveDeleteEndpoint, }); const wrapper = mountWithTheme(); wrapper.find('button[aria-label="Remove All Artifacts"]').simulate('click'); // Confirm Modal const modal = await mountGlobalModal(); modal.find('Button[data-test-id="confirm-button"]').simulate('click'); expect(deleteMock).toHaveBeenCalledWith( archiveDeleteEndpoint, expect.objectContaining({ query: {name: archiveName}, }) ); }); it('filters artifacts', function () { const mockRouter = {push: jest.fn()}; const mock = MockApiClient.addMockResponse({ url: endpoint, body: [], }); const wrapper = mountWithTheme( ); expect(mock).toHaveBeenCalledWith( endpoint, expect.objectContaining({ query: {query: 'abc'}, }) ); wrapper .find('SearchBar input') .simulate('change', {target: {value: 'defg'}}) .simulate('submit', {preventDefault() {}}); expect(mockRouter.push).toHaveBeenCalledWith({ query: {cursor: undefined, query: 'defg'}, }); }); it('deletes single artifact', async function () { const artifact = TestStubs.SourceMapArtifact(); MockApiClient.addMockResponse({ url: endpoint, body: [artifact], }); const deleteMock = MockApiClient.addMockResponse({ method: 'DELETE', url: `${endpoint}${artifact.id}/`, }); const wrapper = mountWithTheme(); wrapper .find('SourceMapsArtifactRow button[aria-label="Remove Artifact"]') .simulate('click'); // Confirm Modal const modal = await mountGlobalModal(); modal.find('Button[data-test-id="confirm-button"]').simulate('click'); expect(deleteMock).toHaveBeenCalled(); }); });