import {mountWithTheme} from 'sentry-test/enzyme';
import {initializeOrg} from 'sentry-test/initializeOrg';
import ProjectLatestAlerts from 'sentry/views/projectDetail/projectLatestAlerts';
describe('ProjectDetail > ProjectLatestAlerts', function () {
let endpointMock, rulesEndpointMock;
const {organization, project, router} = initializeOrg();
beforeEach(function () {
endpointMock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/incidents/`,
body: [
TestStubs.Incident({id: 1, status: 20}), // critical
TestStubs.Incident({id: 2, status: 10}), // warning
TestStubs.Incident({id: 3, status: 2}), // closed
],
});
rulesEndpointMock = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/alert-rules/`,
body: [TestStubs.MetricRule()],
});
});
afterEach(function () {
MockApiClient.clearMockResponses();
});
it('renders a list', function () {
const wrapper = mountWithTheme(
);
expect(endpointMock).toHaveBeenCalledTimes(2); // one for closed, one for open
expect(rulesEndpointMock).toHaveBeenCalledTimes(0);
expect(endpointMock).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
query: {per_page: 3, status: expect.anything()},
})
);
expect(wrapper.find('SectionHeading').text()).toBe('Latest Alerts');
expect(wrapper.find('AlertRowLink').length).toBe(3);
expect(wrapper.find('AlertRowLink Link').at(0).prop('to')).toBe(
'/organizations/org-slug/alerts/123/'
);
expect(wrapper.find('AlertRowLink AlertTitle').at(0).text()).toBe(
'Too many Chrome errors'
);
expect(wrapper.find('AlertRowLink AlertDate').at(0).text()).toBe(
'Triggered 2 years ago'
);
expect(wrapper.find('AlertRowLink AlertDate').at(2).text()).toBe(
'Resolved a year ago'
);
expect(wrapper.find('AlertRowLink').at(0).find('IconFire').exists()).toBeTruthy();
expect(
wrapper.find('AlertRowLink').at(0).find('IconExclamation').exists()
).toBeFalsy();
expect(
wrapper.find('AlertRowLink').at(1).find('IconExclamation').exists()
).toBeTruthy();
expect(
wrapper.find('AlertRowLink').at(2).find('IconCheckmark').exists()
).toBeTruthy();
});
it('shows the empty state', async function () {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/incidents/`,
body: [],
});
const wrapper = mountWithTheme(
);
await tick();
wrapper.update();
expect(rulesEndpointMock).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
query: {per_page: 1},
})
); // if there are no alerts, we check if any rules are set
expect(wrapper.text()).toContain('No alerts found');
});
it('shows configure alerts buttons', async function () {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/incidents/`,
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/alert-rules/`,
body: [],
});
const wrapper = mountWithTheme(
);
await tick();
wrapper.update();
const createRuleButton = wrapper.find('Button').at(0);
const learnMoreButton = wrapper.find('Button').at(1);
expect(createRuleButton.text()).toBe('Create Alert');
expect(createRuleButton.prop('to')).toBe(
`/organizations/${organization.slug}/alerts/${project.slug}/wizard/?referrer=project_detail`
);
expect(learnMoreButton.text()).toBe('Learn More');
expect(learnMoreButton.prop('href')).toBe(
'https://docs.sentry.io/product/alerts-notifications/metric-alerts/'
);
});
it('calls API with the right params', function () {
mountWithTheme(
);
expect(endpointMock).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
query: {per_page: 3, statsPeriod: '7d', environment: 'staging', status: 'open'},
})
);
});
it('handles null dateClosed with resolved alerts', function () {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/incidents/`,
body: [
TestStubs.Incident({id: 1, status: 20}), // critical
TestStubs.Incident({id: 2, status: 10}), // warning
TestStubs.Incident({id: 3, status: 2, dateClosed: null}), // closed with null dateClosed
],
});
const wrapper = mountWithTheme(
);
expect(wrapper.find('AlertRowLink AlertDate').at(2).text()).toBe('Resolved ');
});
it('does not call API if project is not stabilized yet', function () {
mountWithTheme(
);
expect(endpointMock).toHaveBeenCalledTimes(0);
});
});