import {browserHistory} from 'react-router';
import {
render,
renderGlobalModal,
screen,
userEvent,
waitFor,
} from 'sentry-test/reactTestingLibrary';
import ReleaseActions from 'sentry/views/releases/detail/header/releaseActions';
describe('ReleaseActions', function () {
const organization = TestStubs.Organization();
const release = TestStubs.Release({projects: [{slug: 'project1'}, {slug: 'project2'}]});
const location = {
pathname: `/organizations/sentry/releases/${release.version}/`,
query: {
project: 1,
statsPeriod: '24h',
yAxis: 'events',
},
};
let mockUpdate;
beforeEach(function () {
mockUpdate = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/releases/`,
method: 'POST',
});
});
afterEach(function () {
MockApiClient.clearMockResponses();
});
it('archives a release', async function () {
render(
);
renderGlobalModal();
userEvent.click(screen.getByLabelText('Actions'));
const archiveAction = screen.getByTestId('archive');
expect(archiveAction).toBeInTheDocument();
expect(archiveAction).toHaveTextContent('Archive');
userEvent.click(archiveAction);
expect(await screen.findByText('Archive Release')).toBeInTheDocument();
const affectedProjects = screen.getAllByTestId('badge-display-name');
expect(affectedProjects.length).toBe(2);
// confirm modal
userEvent.click(screen.getByTestId('confirm-button'));
expect(mockUpdate).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
data: {
projects: [],
status: 'archived',
version: release.version,
},
})
);
await waitFor(() =>
expect(browserHistory.push).toHaveBeenCalledWith(
`/organizations/${organization.slug}/releases/`
)
);
});
it('restores a release', async function () {
const refetchDataMock = jest.fn();
render(
);
renderGlobalModal();
userEvent.click(screen.getByLabelText('Actions'));
const restoreAction = screen.getByTestId('restore');
expect(restoreAction).toBeInTheDocument(1);
expect(restoreAction).toHaveTextContent('Restore');
userEvent.click(restoreAction);
expect(await screen.findByText('Restore Release')).toBeInTheDocument();
const affectedProjects = screen.getAllByTestId('badge-display-name');
expect(affectedProjects.length).toBe(2);
// confirm modal
userEvent.click(screen.getByTestId('confirm-button'));
expect(mockUpdate).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
data: {
projects: [],
status: 'open',
version: release.version,
},
})
);
await waitFor(() => expect(refetchDataMock).toHaveBeenCalledTimes(1));
});
it('navigates to a next/prev release', function () {
const routerContext = TestStubs.routerContext();
const {rerender} = render(
,
{context: routerContext}
);
expect(screen.getByLabelText('Oldest')).toHaveAttribute(
'href',
'/organizations/sentry/releases/0/?project=1&statsPeriod=24h&yAxis=events'
);
expect(screen.getByLabelText('Older')).toHaveAttribute(
'href',
'/organizations/sentry/releases/123/?project=1&statsPeriod=24h&yAxis=events'
);
expect(screen.getByLabelText('Newer')).toHaveAttribute(
'href',
'/organizations/sentry/releases/456/?project=1&statsPeriod=24h&yAxis=events'
);
expect(screen.getByLabelText('Newest')).toHaveAttribute(
'href',
'/organizations/sentry/releases/999/?project=1&statsPeriod=24h&yAxis=events'
);
rerender(
,
{context: routerContext}
);
expect(screen.getByLabelText('Newer')).toHaveAttribute(
'href',
'/organizations/sentry/releases/456/files-changed/?project=1&statsPeriod=24h&yAxis=events'
);
});
});