import {mountWithTheme} from 'sentry-test/enzyme';
import ReleaseIssues from 'sentry/views/releases/detail/overview/releaseIssues';
import {getReleaseBounds} from 'sentry/views/releases/utils';
describe('ReleaseIssues', function () {
let newIssuesEndpoint,
resolvedIssuesEndpoint,
unhandledIssuesEndpoint,
allIssuesEndpoint;
const props = {
orgId: 'org',
organization: TestStubs.Organization(),
version: '1.0.0',
selection: {projects: [], environments: [], datetime: {}},
location: {href: '', query: {}},
releaseBounds: getReleaseBounds(TestStubs.Release({version: '1.0.0'})),
};
beforeEach(function () {
MockApiClient.clearMockResponses();
MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/users/`,
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues-count/?end=2020-03-24T02%3A04%3A59Z&query=first-release%3A%221.0.0%22%20is%3Aunresolved&query=release%3A%221.0.0%22%20is%3Aunresolved&query=error.handled%3A0%20release%3A%221.0.0%22%20is%3Aunresolved&query=regressed_in_release%3A%221.0.0%22&start=2020-03-23T01%3A02%3A00Z`,
});
MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues-count/?query=first-release%3A%221.0.0%22%20is%3Aunresolved&query=release%3A%221.0.0%22%20is%3Aunresolved&query=error.handled%3A0%20release%3A%221.0.0%22%20is%3Aunresolved&query=regressed_in_release%3A%221.0.0%22&statsPeriod=24h`,
});
MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/releases/1.0.0/resolved/`,
});
newIssuesEndpoint = MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues/?end=2020-03-24T02%3A04%3A59Z&groupStatsPeriod=auto&limit=10&query=first-release%3A1.0.0%20is%3Aunresolved&sort=freq&start=2020-03-23T01%3A02%3A00Z`,
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues/?groupStatsPeriod=auto&limit=10&query=first-release%3A1.0.0%20is%3Aunresolved&sort=freq&statsPeriod=24h`,
body: [],
});
resolvedIssuesEndpoint = MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/releases/1.0.0/resolved/?end=2020-03-24T02%3A04%3A59Z&groupStatsPeriod=auto&limit=10&query=&sort=freq&start=2020-03-23T01%3A02%3A00Z`,
body: [],
});
unhandledIssuesEndpoint = MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues/?end=2020-03-24T02%3A04%3A59Z&groupStatsPeriod=auto&limit=10&query=release%3A1.0.0%20error.handled%3A0%20is%3Aunresolved&sort=freq&start=2020-03-23T01%3A02%3A00Z`,
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues/?groupStatsPeriod=auto&limit=10&query=release%3A1.0.0%20error.handled%3A0%20is%3Aunresolved&sort=freq&statsPeriod=24h`,
body: [],
});
allIssuesEndpoint = MockApiClient.addMockResponse({
url: `/organizations/${props.organization.slug}/issues/?end=2020-03-24T02%3A04%3A59Z&groupStatsPeriod=auto&limit=10&query=release%3A1.0.0%20is%3Aunresolved&sort=freq&start=2020-03-23T01%3A02%3A00Z`,
body: [],
});
});
const filterIssues = (wrapper, filter) => {
wrapper.find(`ButtonBar Button[data-test-id="filter-${filter}"]`).simulate('click');
};
it('shows an empty state', async function () {
const wrapper = mountWithTheme();
const wrapper2 = mountWithTheme(
);
await tick();
wrapper.update();
expect(wrapper.find('EmptyStateWarning').text()).toBe(
'No new issues in this release.'
);
wrapper2.update();
expect(wrapper2.find('EmptyStateWarning').text()).toBe(
'No new issues for the last 24 hours.'
);
filterIssues(wrapper, 'resolved');
await tick();
wrapper.update();
expect(wrapper.find('EmptyStateWarning').text()).toBe(
'No resolved issues in this release.'
);
filterIssues(wrapper2, 'unhandled');
await tick();
wrapper2.update();
expect(wrapper2.find('EmptyStateWarning').text()).toBe(
'No unhandled issues for the last 24 hours.'
);
});
it('filters the issues', function () {
const wrapper = mountWithTheme();
const filterOptions = wrapper.find('ButtonBar Button');
expect(filterOptions).toHaveLength(6); // sixth one is "Open Issues" button
expect(filterOptions.at(2).text()).toEqual('Unhandled');
filterIssues(wrapper, 'new');
expect(newIssuesEndpoint).toHaveBeenCalledTimes(1);
filterIssues(wrapper, 'resolved');
expect(resolvedIssuesEndpoint).toHaveBeenCalledTimes(1);
filterIssues(wrapper, 'unhandled');
expect(unhandledIssuesEndpoint).toHaveBeenCalledTimes(1);
filterIssues(wrapper, 'all');
expect(allIssuesEndpoint).toHaveBeenCalledTimes(1);
});
it('renders link to Issues', function () {
const wrapper = mountWithTheme();
expect(wrapper.find('Link[data-test-id="issues-button"]').prop('to')).toEqual({
pathname: `/organizations/${props.organization.slug}/issues/`,
query: {
sort: 'freq',
query: 'firstRelease:1.0.0',
cursor: undefined,
limit: undefined,
start: '2020-03-23T01:02:00Z',
end: '2020-03-24T02:04:59Z',
groupStatsPeriod: 'auto',
},
});
filterIssues(wrapper, 'resolved');
expect(wrapper.find('Link[data-test-id="issues-button"]').prop('to')).toEqual({
pathname: `/organizations/${props.organization.slug}/issues/`,
query: {
sort: 'freq',
query: 'release:1.0.0',
cursor: undefined,
limit: undefined,
start: '2020-03-23T01:02:00Z',
end: '2020-03-24T02:04:59Z',
groupStatsPeriod: 'auto',
},
});
filterIssues(wrapper, 'unhandled');
expect(wrapper.find('Link[data-test-id="issues-button"]').prop('to')).toEqual({
pathname: `/organizations/${props.organization.slug}/issues/`,
query: {
sort: 'freq',
query: 'release:1.0.0 error.handled:0',
cursor: undefined,
limit: undefined,
start: '2020-03-23T01:02:00Z',
end: '2020-03-24T02:04:59Z',
groupStatsPeriod: 'auto',
},
});
filterIssues(wrapper, 'all');
expect(wrapper.find('Link[data-test-id="issues-button"]').prop('to')).toEqual({
pathname: `/organizations/${props.organization.slug}/issues/`,
query: {
sort: 'freq',
query: 'release:1.0.0',
cursor: undefined,
limit: undefined,
start: '2020-03-23T01:02:00Z',
end: '2020-03-24T02:04:59Z',
groupStatsPeriod: 'auto',
},
});
});
});