import {render, screen, within} from 'sentry-test/reactTestingLibrary'; import {getFormat} from 'sentry/utils/dates'; import {JobTickTooltip} from 'sentry/views/monitors/components/overviewTimeline/jobTickTooltip'; import type {TimeWindowConfig} from 'sentry/views/monitors/components/overviewTimeline/types'; type StatusCounts = [ in_progress: number, ok: number, missed: number, timeout: number, error: number, ]; export function generateEnvMapping(name: string, counts: StatusCounts) { const [in_progress, ok, missed, timeout, error] = counts; return { [name]: {in_progress, ok, missed, timeout, error}, }; } const tickConfig: TimeWindowConfig = { start: new Date('2023-06-15T11:00:00Z'), end: new Date('2023-06-15T12:00:00Z'), dateLabelFormat: getFormat({timeOnly: true, seconds: true}), elapsedMinutes: 60, timeMarkerInterval: 10, dateTimeProps: {timeOnly: true}, }; describe('JobTickTooltip', function () { it('renders tooltip representing single job run', async function () { const startTs = new Date('2023-06-15T11:00:00Z').valueOf(); const endTs = startTs; const envMapping = generateEnvMapping('prod', [0, 0, 1, 0, 0]); const jobTick = { startTs, envMapping, roundedLeft: false, roundedRight: false, endTs, width: 4, }; render( ); // Skip the header row const statusRow = (await screen.findAllByRole('row'))[1]; expect(within(statusRow).getByText('Missed')).toBeInTheDocument(); expect(within(statusRow).getByText('prod')).toBeInTheDocument(); expect(within(statusRow).getByText('1')).toBeInTheDocument(); }); it('renders tooltip representing multiple job runs 1 env', async function () { const startTs = new Date('2023-06-15T11:00:00Z').valueOf(); const endTs = startTs; const envMapping = generateEnvMapping('prod', [0, 1, 1, 1, 1]); const jobTick = { startTs, envMapping, roundedLeft: false, roundedRight: false, endTs, width: 4, }; render( ); const okayRow = (await screen.findAllByRole('row'))[1]; expect(within(okayRow).getByText('Okay')).toBeInTheDocument(); expect(within(okayRow).getByText('prod')).toBeInTheDocument(); expect(within(okayRow).getByText('1')).toBeInTheDocument(); const missedRow = screen.getAllByRole('row')[2]; expect(within(missedRow).getByText('Missed')).toBeInTheDocument(); expect(within(missedRow).getByText('prod')).toBeInTheDocument(); expect(within(missedRow).getByText('1')).toBeInTheDocument(); const timeoutRow = screen.getAllByRole('row')[3]; expect(within(timeoutRow).getByText('Timed Out')).toBeInTheDocument(); expect(within(timeoutRow).getByText('prod')).toBeInTheDocument(); expect(within(timeoutRow).getByText('1')).toBeInTheDocument(); const errorRow = screen.getAllByRole('row')[4]; expect(within(errorRow).getByText('Failed')).toBeInTheDocument(); expect(within(errorRow).getByText('prod')).toBeInTheDocument(); expect(within(errorRow).getByText('1')).toBeInTheDocument(); }); it('renders tooltip representing multiple job runs multiple envs', async function () { const startTs = new Date('2023-06-15T11:00:00Z').valueOf(); const endTs = startTs; const prodEnvMapping = generateEnvMapping('prod', [0, 0, 1, 0, 0]); const devEnvMapping = generateEnvMapping('dev', [0, 1, 2, 1, 0]); const envMapping = {...prodEnvMapping, ...devEnvMapping}; const jobTick = { startTs, envMapping, roundedLeft: false, roundedRight: false, endTs, width: 4, }; render( ); const missedProdRow = (await screen.findAllByRole('row'))[1]; expect(within(missedProdRow).getByText('Missed')).toBeInTheDocument(); expect(within(missedProdRow).getByText('prod')).toBeInTheDocument(); expect(within(missedProdRow).getByText('1')).toBeInTheDocument(); const okDevRow = screen.getAllByRole('row')[2]; expect(within(okDevRow).getByText('Okay')).toBeInTheDocument(); expect(within(okDevRow).getByText('dev')).toBeInTheDocument(); expect(within(okDevRow).getByText('1')).toBeInTheDocument(); const missedDevRow = screen.getAllByRole('row')[3]; expect(within(missedDevRow).getByText('Missed')).toBeInTheDocument(); expect(within(missedDevRow).getByText('dev')).toBeInTheDocument(); expect(within(missedDevRow).getByText('2')).toBeInTheDocument(); const timeoutDevRow = screen.getAllByRole('row')[4]; expect(within(timeoutDevRow).getByText('Timed Out')).toBeInTheDocument(); expect(within(timeoutDevRow).getByText('dev')).toBeInTheDocument(); expect(within(timeoutDevRow).getByText('1')).toBeInTheDocument(); }); });