import {OrganizationFixture} from 'sentry-fixture/organization'; import {render, screen} from 'sentry-test/reactTestingLibrary'; import {textWithMarkupMatcher} from 'sentry-test/utils'; import type {MetricsSummary} from 'sentry/components/events/interfaces/spans/types'; import type { MetricsQueryApiResponse, MetricsQueryApiResponseLastMeta, } from 'sentry/types/metrics'; import {CustomMetricsEventData} from 'sentry/views/metrics/customMetricsEventData'; const organization = OrganizationFixture({features: ['custom-metrics']}); describe('CustomMetricsEventData', () => { beforeEach(() => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/metrics/query/`, method: 'POST', body: { data: [[{by: {}, series: [], totals: 2}]], meta: [ [ { unit: 'nanoseconds', scaling_factor: 1000000, group_bys: {}, limit: null, order: 'asc', } as MetricsQueryApiResponseLastMeta, ], ], end: '2023-09-01T01:00:00Z', intervals: [], start: '2023-09-01T00:00:00Z', } satisfies MetricsQueryApiResponse, }); }); it('renders empty (no feature flag)', () => { const metricsSummary: MetricsSummary = { 'd:custom/my.metric@second': [ { count: 2, min: 1, max: 2, sum: 3, tags: { foo: 'bar', }, }, ], }; const {container} = render( ); expect(container).toBeEmptyDOMElement(); }); it('renders empty (no data)', () => { const {container} = render( , { organization, } ); expect(container).toBeEmptyDOMElement(); }); it('renders (all information)', () => { const metricsSummary: MetricsSummary = { 'd:custom/my.metric@second': [ { count: 2, min: 1, max: 2, sum: 3, tags: { foo: 'bar', }, }, ], }; render( , { organization, } ); expect(screen.getByText('Emitted Metrics')).toBeInTheDocument(); expect(screen.getByText(/Name:/)).toBeInTheDocument(); expect(screen.getByRole('link', {name: 'my.metric'})).toBeInTheDocument(); expect(screen.getByText(textWithMarkupMatcher(/Value: 1\.5s/))).toBeInTheDocument(); expect(screen.getByText(/Tags: foo:bar/)).toBeInTheDocument(); }); it('renders (counter metric)', () => { const metricsSummary: MetricsSummary = { 'c:custom/my.metric@second': [ { count: 1, min: 1, max: 1, sum: 1, tags: { foo: 'bar', }, }, ], }; render( , {organization} ); expect(screen.getByText('Emitted Metrics')).toBeInTheDocument(); expect(screen.getByText(/Name:/)).toBeInTheDocument(); expect(screen.getByRole('link', {name: 'my.metric'})).toBeInTheDocument(); expect(screen.getByText(textWithMarkupMatcher(/Count: 1/))).toBeInTheDocument(); expect(screen.getByText(/Tags: foo:bar/)).toBeInTheDocument(); }); it('renders (no tags)', async () => { const metricsSummary: MetricsSummary = { 'c:custom/my.metric@second': [ { count: 1, min: 1, max: 1, sum: 1, tags: null, }, ], }; render( , { organization, } ); expect(screen.getByText('Emitted Metrics')).toBeInTheDocument(); expect(screen.getByText(/Name:/)).toBeInTheDocument(); expect(screen.getByRole('link', {name: 'my.metric'})).toBeInTheDocument(); expect(screen.getByText(textWithMarkupMatcher(/Count: 1/))).toBeInTheDocument(); expect( await screen.findByText(textWithMarkupMatcher(/Tags: \(none\)/)) ).toBeInTheDocument(); }); it('renders (empty tags)', async () => { const metricsSummary: MetricsSummary = { 'c:custom/my.metric@second': [ { count: 1, min: 1, max: 1, sum: 1, tags: {}, }, ], }; render( , { organization, } ); expect(screen.getByText('Emitted Metrics')).toBeInTheDocument(); expect(screen.getByText(/Name:/)).toBeInTheDocument(); expect(screen.getByRole('link', {name: 'my.metric'})).toBeInTheDocument(); expect(screen.getByText(textWithMarkupMatcher(/Count: 1/))).toBeInTheDocument(); expect( await screen.findByText(textWithMarkupMatcher(/Tags: \(none\)/)) ).toBeInTheDocument(); }); it('renders (multiple)', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/metrics/query/`, method: 'POST', body: { data: [ [{by: {}, series: [], totals: 2}], [{by: {}, series: [], totals: 2}], [{by: {}, series: [], totals: 2}], ], meta: [ [ { unit: 'nanoseconds', scaling_factor: 1000000, group_bys: {}, limit: null, order: 'asc', } as MetricsQueryApiResponseLastMeta, ], [ { unit: 'nanoseconds', scaling_factor: null, group_bys: {}, limit: null, order: 'asc', } as MetricsQueryApiResponseLastMeta, ], [ { unit: 'nanoseconds', scaling_factor: 1000000, group_bys: {}, limit: null, order: 'asc', } as MetricsQueryApiResponseLastMeta, ], ], end: '2023-09-01T01:00:00Z', intervals: [], start: '2023-09-01T00:00:00Z', } satisfies MetricsQueryApiResponse, }); const metricsSummary: MetricsSummary = { 'd:custom/my.distribution@second': [ { count: 2, min: 1, max: 2, sum: 3, tags: { foo: 'bar', }, }, { count: 1, min: 1, max: 1, sum: 1, tags: null, }, ], 'c:custom/my.counter@second': [ { count: 2, min: 1, max: 2, sum: 3, tags: { foo: 'bar', }, }, ], }; render( , { organization, } ); expect(screen.getByText('Emitted Metrics')).toBeInTheDocument(); expect(screen.getAllByText(/Name:/)).toHaveLength(1); expect(screen.getAllByRole('link', {name: 'my.distribution'})).toHaveLength(2); expect(screen.getAllByRole('link', {name: 'my.counter'})).toHaveLength(1); }); });