import {EventFixture} from 'sentry-fixture/event';
import {LocationFixture} from 'sentry-fixture/locationFixture';
import {ProjectFixture} from 'sentry-fixture/project';
import {render, screen, userEvent, within} from 'sentry-test/reactTestingLibrary';
import {QueryError} from 'sentry/utils/discover/genericDiscoverQuery';
import type {
QuickTraceQueryChildrenProps,
TraceMeta,
} from 'sentry/utils/performance/quickTrace/types';
import QuickTraceMeta from 'sentry/views/performance/transactionDetails/quickTraceMeta';
describe('QuickTraceMeta', function () {
const location = LocationFixture();
const project = ProjectFixture({platform: 'javascript'});
const event = EventFixture({contexts: {trace: {trace_id: 'a'.repeat(32)}}});
const emptyQuickTrace: QuickTraceQueryChildrenProps = {
isLoading: false,
error: null,
trace: [],
type: 'empty',
currentEvent: null,
};
const emptyTraceMeta: TraceMeta = {
projects: 0,
transactions: 0,
errors: 0,
performance_issues: 0,
transactiontoSpanChildrenCount: {},
};
it('renders basic UI', function () {
render(
);
expect(screen.getByRole('heading', {name: 'Trace Navigator'})).toBeInTheDocument();
expect(screen.getByTestId('quick-trace-body')).toBeInTheDocument();
});
it('renders placeholder while loading', function () {
render(
);
expect(screen.getByRole('heading', {name: 'Trace Navigator'})).toBeInTheDocument();
const qtBody = screen.getByTestId('quick-trace-body');
expect(within(qtBody).getByTestId('loading-placeholder')).toBeInTheDocument();
});
it('renders errors', function () {
render(
);
expect(screen.getByRole('heading', {name: 'Trace Navigator'})).toBeInTheDocument();
expect(screen.getByTestId('quick-trace-body')).toHaveTextContent('\u2014');
});
it('renders footer', function () {
render(
);
expect(screen.getByRole('heading', {name: 'Trace Navigator'})).toBeInTheDocument();
expect(screen.getByTestId('quick-trace-body')).toBeInTheDocument();
expect(screen.getByTestId('quick-trace-footer')).toHaveTextContent(
`View Full Trace: ${'a'.repeat(8)} (1 event)`
);
});
it('renders missing trace when trace id is not present', function () {
const newEvent = EventFixture();
render(
);
expect(screen.getByRole('heading', {name: 'Trace Navigator'})).toBeInTheDocument();
expect(screen.getByTestId('quick-trace-body')).toHaveTextContent('Missing Trace');
expect(screen.getByTestId('quick-trace-footer')).toHaveTextContent('Read the docs');
});
it('renders missing trace with hover card when feature disabled', async function () {
const newEvent = EventFixture();
render(
);
expect(screen.getByRole('heading', {name: 'Trace Navigator'})).toBeInTheDocument();
expect(screen.getByTestId('quick-trace-body')).toHaveTextContent('Missing Trace');
const qtFooter = screen.getByTestId('quick-trace-footer');
expect(qtFooter).toHaveTextContent('Read the docs');
const child = qtFooter.firstChild;
if (!child) {
throw new Error('child is null');
}
await userEvent.hover(child as HTMLElement);
expect(await screen.findByText('Requires tracing.')).toBeInTheDocument();
});
it('does not render when platform does not support tracing', function () {
const newProject = ProjectFixture();
const newEvent = EventFixture();
const result = render(
);
expect(result.container).toBeEmptyDOMElement();
});
});