import {SourceMapArchiveFixture} from 'sentry-fixture/sourceMapArchive'; import {SourceMapsDebugIDBundlesFixture} from 'sentry-fixture/sourceMapsDebugIDBundles'; import {initializeOrg} from 'sentry-test/initializeOrg'; import { render, renderGlobalModal, screen, userEvent, waitFor, } from 'sentry-test/reactTestingLibrary'; import {textWithMarkupMatcher} from 'sentry-test/utils'; import {SourceMapsList} from 'sentry/views/settings/projectSourceMaps/sourceMapsList'; function renderReleaseBundlesMockRequests({ orgSlug, projectSlug, empty, }: { orgSlug: string; projectSlug: string; empty?: boolean; }) { const sourceMaps = MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${projectSlug}/files/source-maps/`, body: empty ? [] : [ SourceMapArchiveFixture(), SourceMapArchiveFixture({ id: 2, name: 'abc', fileCount: 3, date: '2023-05-06T13:41:00Z', }), ], }); return {sourceMaps}; } function renderDebugIdBundlesMockRequests({ orgSlug, projectSlug, empty, }: { orgSlug: string; projectSlug: string; empty?: boolean; }) { const artifactBundles = MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${projectSlug}/files/artifact-bundles/`, body: empty ? [] : SourceMapsDebugIDBundlesFixture(), }); const artifactBundlesDeletion = MockApiClient.addMockResponse({ url: `/projects/${orgSlug}/${projectSlug}/files/artifact-bundles/`, method: 'DELETE', }); return {artifactBundles, artifactBundlesDeletion}; } describe('ProjectSourceMaps', function () { describe('Artifact Bundles', function () { it('renders default state', async function () { const {organization, project, router, routerProps} = initializeOrg({ router: { location: { query: {}, pathname: `/settings/${initializeOrg().organization.slug}/projects/${ initializeOrg().project.slug }/source-maps/`, }, }, }); renderReleaseBundlesMockRequests({ orgSlug: organization.slug, projectSlug: project.slug, empty: true, }); const mockRequests = renderDebugIdBundlesMockRequests({ orgSlug: organization.slug, projectSlug: project.slug, }); render(, { router, organization, }); expect(mockRequests.artifactBundles).toHaveBeenCalledTimes(1); // Title expect( screen.getByRole('heading', {name: 'Source Map Uploads'}) ).toBeInTheDocument(); // Search bar expect( screen.getByPlaceholderText('Filter by Debug ID or Upload ID') ).toBeInTheDocument(); // Artifacts expect(await screen.findByText('Upload ID')).toBeInTheDocument(); // Release information expect(await screen.findByText('Found in Releases')).toBeInTheDocument(); expect(await screen.findByText(textWithMarkupMatcher('v2.0'))).toBeInTheDocument(); expect( await screen.findByText(textWithMarkupMatcher('2e318148eac9')) ).toBeInTheDocument(); expect( await screen.findByText(textWithMarkupMatcher('(Dist: android, iOS)')) ).toBeInTheDocument(); // Date Uploaded expect(screen.getByText('Mar 8, 2023 9:53 AM')).toBeInTheDocument(); expect(screen.getByText('(39 files)')).toBeInTheDocument(); // Delete button expect(screen.getByRole('button', {name: 'Delete Source Maps'})).toBeEnabled(); renderGlobalModal(); // Delete item displays a confirmation modal await userEvent.click(screen.getByRole('button', {name: 'Delete Source Maps'})); expect( await screen.findByText('Are you sure you want to delete Source Maps?') ).toBeInTheDocument(); // Close modal await userEvent.click(screen.getByRole('button', {name: 'Confirm'})); await waitFor(() => { expect(mockRequests.artifactBundlesDeletion).toHaveBeenLastCalledWith( '/projects/org-slug/project-slug/files/artifact-bundles/', expect.objectContaining({ query: expect.objectContaining({ bundleId: 'b916a646-2c6b-4e45-af4c-409830a44e0e', }), }) ); }); }); it('renders empty state', async function () { const {organization, project, routerProps, router} = initializeOrg({ router: { location: { query: {}, pathname: `/settings/${initializeOrg().organization.slug}/projects/${ initializeOrg().project.slug }/source-maps/artifact-bundles/`, }, }, }); renderReleaseBundlesMockRequests({ orgSlug: organization.slug, projectSlug: project.slug, empty: true, }); renderDebugIdBundlesMockRequests({ orgSlug: organization.slug, projectSlug: project.slug, empty: true, }); render(, { router, organization, }); expect(await screen.findByText('No source map uploads found')).toBeInTheDocument(); }); }); });