import {SourceMapArchive} from 'sentry-fixture/sourceMapArchive';
import {SourceMapArtifact} from 'sentry-fixture/sourceMapArtifact';
import {SourceMapsDebugIDBundlesArtifacts} from 'sentry-fixture/sourceMapsDebugIDBundlesArtifacts';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import {textWithMarkupMatcher} from 'sentry-test/utils';
import ConfigStore from 'sentry/stores/configStore';
import {ProjectSourceMapsArtifacts} from 'sentry/views/settings/projectSourceMaps/projectSourceMapsArtifacts';
function renderReleaseBundlesMockRequests({
orgSlug,
projectSlug,
empty,
}: {
orgSlug: string;
projectSlug: string;
empty?: boolean;
}) {
const sourceMaps = MockApiClient.addMockResponse({
url: `/projects/${orgSlug}/${projectSlug}/files/source-maps/`,
body: empty
? []
: [
SourceMapArchive(),
SourceMapArchive({
id: 2,
name: 'abc',
fileCount: 3,
date: '2023-05-06T13:41:00Z',
}),
],
});
const sourceMapsFiles = MockApiClient.addMockResponse({
url: `/projects/${orgSlug}/${projectSlug}/releases/bea7335dfaebc0ca6e65a057/files/`,
body: empty ? [] : [SourceMapArtifact()],
});
return {sourceMaps, sourceMapsFiles};
}
function renderDebugIdBundlesMockRequests({
orgSlug,
projectSlug,
empty,
}: {
orgSlug: string;
projectSlug: string;
empty?: boolean;
}) {
const artifactBundlesFiles = MockApiClient.addMockResponse({
url: `/projects/${orgSlug}/${projectSlug}/artifact-bundles/7227e105-744e-4066-8c69-3e5e344723fc/files/`,
body: empty ? {} : SourceMapsDebugIDBundlesArtifacts(),
});
return {artifactBundlesFiles};
}
describe('ProjectSourceMapsArtifacts', function () {
describe('Release Bundles', function () {
it('renders default state', async function () {
const {organization, routerContext, project, routerProps} = initializeOrg({
router: {
location: {
query: {},
},
params: {},
},
});
ConfigStore.config = {
...ConfigStore.config,
user: {...ConfigStore.config.user, isSuperuser: true},
};
renderReleaseBundlesMockRequests({
orgSlug: organization.slug,
projectSlug: project.slug,
});
render(
,
{context: routerContext, organization}
);
// Title
expect(screen.getByRole('heading')).toHaveTextContent('Release Bundle');
// Subtitle
expect(screen.getByText('bea7335dfaebc0ca6e65a057')).toBeInTheDocument();
// Search bar
expect(screen.getByPlaceholderText('Filter by Path')).toBeInTheDocument();
// Path
expect(
await screen.findByText('https://example.com/AcceptOrganizationInvite.js')
).toBeInTheDocument();
// Time
expect(screen.getByText(/in 3 year/)).toBeInTheDocument();
// File size
expect(screen.getByText('8.1 KiB')).toBeInTheDocument();
// Download button
expect(screen.getByRole('button', {name: 'Download Artifact'})).toHaveAttribute(
'href',
'/projects/org-slug/project-slug/releases/bea7335dfaebc0ca6e65a057/files/5678/?download=1'
);
});
it('renders empty state', async function () {
const {organization, routerProps, project, routerContext} = initializeOrg({
router: {
location: {
query: {},
},
params: {},
},
});
renderReleaseBundlesMockRequests({
orgSlug: organization.slug,
projectSlug: project.slug,
empty: true,
});
render(
,
{context: routerContext, organization}
);
expect(
await screen.findByText('There are no artifacts in this archive.')
).toBeInTheDocument();
});
});
describe('Artifact Bundles', function () {
it('renders default state', async function () {
const {organization, project, routerProps, routerContext} = initializeOrg({
router: {
location: {
pathname: `/settings/${initializeOrg().organization.slug}/projects/${
initializeOrg().project.slug
}/source-maps/artifact-bundles/7227e105-744e-4066-8c69-3e5e344723fc/`,
query: {},
},
params: {},
},
});
ConfigStore.config = {
...ConfigStore.config,
user: {...ConfigStore.config.user, isSuperuser: true},
};
renderDebugIdBundlesMockRequests({
orgSlug: organization.slug,
projectSlug: project.slug,
});
render(
,
{context: routerContext, organization}
);
// Title
expect(screen.getByRole('heading')).toHaveTextContent('Artifact Bundle');
// Subtitle
expect(
screen.getByText('7227e105-744e-4066-8c69-3e5e344723fc')
).toBeInTheDocument();
// Release information
expect(
await screen.findByText(textWithMarkupMatcher('2 Releases associated'))
).toBeInTheDocument();
await userEvent.hover(screen.getByText('2 Releases'));
expect(
await screen.findByText('frontend@2e318148eac9298ec04a662ae32b4b093b027f0a')
).toBeInTheDocument();
// Search bar
expect(screen.getByPlaceholderText('Filter by Path or ID')).toBeInTheDocument();
// Path
expect(await screen.findByText('files/_/_/main.js')).toBeInTheDocument();
// Debug Id
expect(
screen.getByText('69ac68eb-cc62-44c0-a5dc-b67f219a3696')
).toBeInTheDocument();
// Type
expect(screen.getByText('Minified')).toBeInTheDocument();
// Download Button
expect(screen.getByRole('button', {name: 'Download Artifact'})).toHaveAttribute(
'href',
'/projects/org-slug/project-slug/artifact-bundles/7227e105-744e-4066-8c69-3e5e344723fc/files/ZmlsZXMvXy9fL21haW4uanM=/?download=1'
);
});
it('renders empty state', async function () {
const {organization, project, routerProps, routerContext} = initializeOrg({
router: {
location: {
pathname: `/settings/${initializeOrg().organization.slug}/projects/${
initializeOrg().project.slug
}/source-maps/artifact-bundles/7227e105-744e-4066-8c69-3e5e344723fc/`,
query: {},
},
params: {},
},
});
renderDebugIdBundlesMockRequests({
orgSlug: organization.slug,
projectSlug: project.slug,
empty: true,
});
render(
,
{context: routerContext, organization}
);
expect(
await screen.findByText('There are no artifacts in this bundle.')
).toBeInTheDocument();
// TODO(Pri): Uncomment once fully transitioned to associations.
// expect(
// screen.getByText('No releases associated with this bundle')
// ).toBeInTheDocument();
});
});
});