import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
import ProjectIssues from 'sentry/views/projectDetail/projectIssues';
describe('ProjectDetail > ProjectIssues', function () {
let endpointMock, filteredEndpointMock, newIssuesEndpointMock;
const {organization, router, routerContext} = initializeOrg({
organization: {
features: ['discover-basic'],
},
});
beforeEach(function () {
endpointMock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/issues/?limit=5&query=error.unhandled%3Atrue%20is%3Aunresolved&sort=freq&statsPeriod=14d`,
body: [TestStubs.Group(), TestStubs.Group({id: '2'})],
});
filteredEndpointMock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/issues/?environment=staging&limit=5&query=error.unhandled%3Atrue%20is%3Aunresolved&sort=freq&statsPeriod=7d`,
body: [TestStubs.Group(), TestStubs.Group({id: '2'})],
});
newIssuesEndpointMock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/issues/?limit=5&query=is%3Aunresolved%20is%3Afor_review&sort=freq&statsPeriod=14d`,
body: [TestStubs.Group(), TestStubs.Group({id: '2'})],
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/users/`,
body: [],
});
});
afterEach(function () {
MockApiClient.clearMockResponses();
jest.clearAllMocks();
});
it('renders a list', async function () {
MockApiClient.addMockResponse({
url: `/organizations/org-slug/issues/?limit=5&query=error.unhandled%3Atrue%20is%3Aunresolved&sort=freq&statsPeriod=14d`,
body: [TestStubs.Group(), TestStubs.Group({id: '2'})],
});
render(, {
context: routerContext,
organization,
});
expect(await screen.findAllByTestId('group')).toHaveLength(2);
});
it('renders a link to Issues', async function () {
render(, {
context: routerContext,
organization,
});
const link = screen.getByLabelText('Open in Issues');
expect(link).toBeInTheDocument();
await userEvent.click(link);
expect(router.push).toHaveBeenCalledWith({
pathname: '/organizations/org-slug/issues/',
query: {
limit: 5,
query: 'error.unhandled:true is:unresolved',
sort: 'freq',
statsPeriod: '14d',
},
});
});
it('renders a segmented control', async function () {
render(, {
context: routerContext,
organization,
});
// "Unhandled" segment is selected
const unhandledSegment = screen.getByRole('radio', {name: 'Unhandled 0'});
expect(unhandledSegment).toBeInTheDocument();
expect(unhandledSegment).toBeChecked();
// Select "New Issues" segment
const newIssuesSegment = screen.getByRole('radio', {name: 'New Issues 0'});
expect(newIssuesSegment).toBeInTheDocument();
expect(newIssuesSegment).not.toBeChecked();
await userEvent.click(newIssuesSegment);
await waitFor(() => expect(newIssuesSegment).toBeChecked());
expect(newIssuesEndpointMock).toHaveBeenCalled();
});
it('renders a link to Discover', async function () {
render(, {
context: routerContext,
organization,
});
const link = screen.getByLabelText('Open in Discover');
expect(link).toBeInTheDocument();
await userEvent.click(link);
expect(router.push).toHaveBeenCalledWith({
pathname: `/organizations/${organization.slug}/discover/results/`,
query: {
display: 'top5',
field: ['issue', 'title', 'count()', 'count_unique(user)', 'project'],
name: 'Frequent Unhandled Issues',
query: 'event.type:error error.unhandled:true',
sort: ['-count'],
statsPeriod: '14d',
},
});
});
it('changes according to global header', async function () {
render(
,
{context: routerContext, organization}
);
expect(endpointMock).toHaveBeenCalledTimes(0);
expect(filteredEndpointMock).toHaveBeenCalledTimes(1);
const link = screen.getByLabelText('Open in Issues');
expect(link).toBeInTheDocument();
await userEvent.click(link);
expect(router.push).toHaveBeenCalledWith({
pathname: `/organizations/${organization.slug}/issues/`,
query: {
limit: 5,
environment: 'staging',
statsPeriod: '7d',
query: 'error.unhandled:true is:unresolved',
sort: 'freq',
},
});
});
});