import {EventFixture} from 'sentry-fixture/event'; import {GroupFixture} from 'sentry-fixture/group'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {RouterFixture} from 'sentry-fixture/routerFixture'; import {UptimeCheckFixture} from 'sentry-fixture/uptimeCheck'; import {render, screen} from 'sentry-test/reactTestingLibrary'; import GroupStore from 'sentry/stores/groupStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import {IssueCategory, IssueType} from 'sentry/types/group'; import {getShortEventId} from 'sentry/utils/events'; import {statusToText} from 'sentry/views/insights/uptime/timelineConfig'; import GroupUptimeChecks from 'sentry/views/issueDetails/groupUptimeChecks'; describe('GroupUptimeChecks', () => { const uptimeRuleId = '123'; const event = EventFixture({ tags: [ { key: 'uptime_rule', value: uptimeRuleId, }, ], }); const group = GroupFixture({ issueCategory: IssueCategory.UPTIME, issueType: IssueType.UPTIME_DOMAIN_FAILURE, }); const organization = OrganizationFixture(); const project = ProjectFixture(); const router = RouterFixture({ params: {groupId: group.id}, }); beforeEach(() => { GroupStore.init(); GroupStore.add([group]); ProjectsStore.init(); ProjectsStore.loadInitialData([project]); MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/issues/${group.id}/`, body: group, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/issues/${group.id}/events/recommended/`, body: event, }); }); it('renders the empty uptime check table', async () => { MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/uptime/${uptimeRuleId}/checks/`, body: [], }); render(, {organization, router}); expect(await screen.findByText('All Uptime Checks')).toBeInTheDocument(); for (const column of ['Timestamp', 'Status', 'Duration', 'Trace', 'Region', 'ID']) { expect(screen.getByText(column)).toBeInTheDocument(); } expect(screen.getByText('No matching uptime checks found')).toBeInTheDocument(); }); it('renders the uptime check table with data', async () => { const uptimeCheck = UptimeCheckFixture(); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${project.slug}/uptime/${uptimeRuleId}/checks/`, body: [uptimeCheck], }); render(, {organization, router}); expect(await screen.findByText('All Uptime Checks')).toBeInTheDocument(); expect(screen.queryByText('No matching uptime checks found')).not.toBeInTheDocument(); expect(screen.getByText('Showing 1-1 matching uptime checks')).toBeInTheDocument(); expect(screen.getByRole('button', {name: 'Previous Page'})).toBeInTheDocument(); expect(screen.getByRole('button', {name: 'Next Page'})).toBeInTheDocument(); expect(screen.getByRole('time')).toHaveTextContent(/Jan 1, 2025/); expect(screen.getByText(statusToText[uptimeCheck.checkStatus])).toBeInTheDocument(); expect(screen.getByText(`${uptimeCheck.durationMs}ms`)).toBeInTheDocument(); expect( screen.getByRole('link', {name: getShortEventId(uptimeCheck.traceId)}) ).toHaveAttribute('href', `/performance/trace/${uptimeCheck.traceId}/`); expect(screen.getByText(uptimeCheck.region)).toBeInTheDocument(); expect(screen.getByText(uptimeCheck.uptimeCheckId)).toBeInTheDocument(); }); });