import {browserHistory} from 'react-router'; import moment from 'moment'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import ProjectsStore from 'sentry/stores/projectsStore'; import RuleDetailsContainer from 'sentry/views/alerts/rules/issue/details/index'; import AlertRuleDetails from 'sentry/views/alerts/rules/issue/details/ruleDetails'; describe('AlertRuleDetails', () => { const context = initializeOrg(); const organization = context.organization; const project = TestStubs.Project(); const rule = TestStubs.ProjectAlertRule({ lastTriggered: moment().subtract(2, 'day').format(), }); const createWrapper = (props = {}) => { const params = { orgId: organization.slug, projectId: project.slug, ruleId: rule.id, }; return render( , {context: context.routerContext, organization} ); }; beforeEach(() => { browserHistory.push = jest.fn(); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/rules/${rule.id}/`, body: rule, match: [MockApiClient.matchQuery({expand: 'lastTriggered'})], }); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/rules/${rule.id}/stats/`, body: [], }); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/rules/${rule.id}/group-history/`, body: [ { count: 1, group: TestStubs.Group(), lastTriggered: moment('Apr 11, 2019 1:08:59 AM UTC').format(), }, ], headers: { Link: '; rel="previous"; results="false"; cursor="0:0:1", ' + '; rel="next"; results="true"; cursor="0:100:0"', }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/projects/`, body: [project], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/users/`, body: [], }); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); }); afterEach(() => { ProjectsStore.reset(); ProjectsStore.teardown(); MockApiClient.clearMockResponses(); }); it('displays alert rule with list of issues', async () => { createWrapper(); expect(await screen.findAllByText('My alert rule')).toHaveLength(2); expect(screen.getByText('RequestError:')).toBeInTheDocument(); expect(screen.getByText('Apr 11, 2019 1:08:59 AM UTC')).toBeInTheDocument(); }); it('should allow paginating results', async () => { createWrapper(); expect(await screen.findByLabelText('Next')).toBeEnabled(); userEvent.click(screen.getByLabelText('Next')); expect(browserHistory.push).toHaveBeenCalledWith({ pathname: '/mock-pathname/', query: { cursor: '0:100:0', }, }); }); it('should reset pagination cursor on date change', async () => { createWrapper(); expect(await screen.findByText('Last 7 days')).toBeInTheDocument(); userEvent.click(screen.getByText('Last 7 days')); userEvent.click(screen.getByText('Last 24 hours')); expect(context.router.push).toHaveBeenCalledWith({ query: { pageStatsPeriod: '24h', cursor: undefined, pageEnd: undefined, pageStart: undefined, pageUtc: undefined, }, }); }); it('should show the time since last triggered in sidebar', async () => { createWrapper(); expect(await screen.findAllByText('Last Triggered')).toHaveLength(2); expect(screen.getByText('2 days ago')).toBeInTheDocument(); }); it('renders not found on 404', async () => { MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/rules/${rule.id}/`, statusCode: 404, body: {}, match: [MockApiClient.matchQuery({expand: 'lastTriggered'})], }); createWrapper(); expect( await screen.findByText('The alert rule you were looking for was not found.') ).toBeInTheDocument(); }); });