import {initializeOrg} from 'sentry-test/initializeOrg';
import {
render,
renderGlobalModal,
screen,
userEvent,
} from 'sentry-test/reactTestingLibrary';
import ProjectSourceMapsDetail from 'sentry/views/settings/projectSourceMaps/detail';
describe('ProjectSourceMapsDetail', () => {
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,
};
afterEach(() => {
MockApiClient.clearMockResponses();
});
it('renders', () => {
MockApiClient.addMockResponse({
url: endpoint,
body: [
TestStubs.SourceMapArtifact(),
TestStubs.SourceMapArtifact({name: 'abc', id: '2'}),
],
});
render();
const items = screen.getAllByRole('button', {name: 'Remove Artifact'});
expect(items).toHaveLength(2);
expect(screen.getByText('abc')).toBeInTheDocument();
});
it('renders empty', () => {
MockApiClient.addMockResponse({
url: endpoint,
body: [],
});
render();
expect(
screen.getByText('There are no artifacts in this archive.')
).toBeInTheDocument();
});
it('links to release', () => {
MockApiClient.addMockResponse({
url: endpoint,
body: [],
});
render(, {context: routerContext});
expect(screen.getByRole('button', {name: 'Go to Release'})).toHaveAttribute(
'href',
`/organizations/${organization.slug}/releases/${archiveName}/?project=${project.id}`
);
});
it('deletes all artifacts', () => {
MockApiClient.addMockResponse({
url: endpoint,
body: [],
});
const archiveDeleteEndpoint = `/projects/${organization.slug}/${project.slug}/files/source-maps/`;
const deleteMock = MockApiClient.addMockResponse({
method: 'DELETE',
url: archiveDeleteEndpoint,
});
render();
renderGlobalModal();
userEvent.click(screen.getByRole('button', {name: 'Remove All Artifacts'}));
// Confirm Modal
userEvent.click(screen.getByRole('button', {name: 'Confirm'}));
expect(deleteMock).toHaveBeenCalledWith(
archiveDeleteEndpoint,
expect.objectContaining({
query: {name: archiveName},
})
);
});
it('filters artifacts', () => {
const mockRouter = {push: jest.fn()};
const mock = MockApiClient.addMockResponse({
url: endpoint,
body: [],
});
render(
);
expect(mock).toHaveBeenCalledWith(
endpoint,
expect.objectContaining({
query: {query: 'abc'},
})
);
const filterInput = screen.getByPlaceholderText('Filter artifacts');
userEvent.clear(filterInput);
userEvent.type(filterInput, 'defg{enter}');
expect(mockRouter.push).toHaveBeenCalledWith({
query: {cursor: undefined, query: 'defg'},
});
});
it('deletes single artifact', () => {
const artifact = TestStubs.SourceMapArtifact();
MockApiClient.addMockResponse({
url: endpoint,
body: [artifact],
});
const deleteMock = MockApiClient.addMockResponse({
method: 'DELETE',
url: `${endpoint}${artifact.id}/`,
});
render();
renderGlobalModal();
userEvent.click(screen.getByRole('button', {name: 'Remove Artifact'}));
// Confirm Modal
userEvent.click(screen.getByRole('button', {name: 'Confirm'}));
expect(deleteMock).toHaveBeenCalled();
});
});