import {initializeData as _initializeData} from 'sentry-test/performance/initializePerformanceData';
import {act, render, screen, waitFor} from 'sentry-test/reactTestingLibrary';
import ProjectsStore from 'sentry/stores/projectsStore';
import SpanMetricsTable from 'sentry/views/performance/transactionSummary/transactionSpans/spanMetricsTable';
const initializeData = () => {
const data = _initializeData({
features: ['performance-view'],
});
act(() => ProjectsStore.loadInitialData(data.projects));
return data;
};
describe('SuspectSpansTable', () => {
it('should render the table and rows of data', async () => {
const {organization, project} = initializeData();
const mockRequest = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/events/`,
method: 'GET',
body: {
data: [
{
'span.group': 'abc123',
'span.op': 'db',
'span.description': 'SELECT thing FROM my_cool_db',
'spm()': 4.448963396488444,
'sum(span.duration)': 1236071121.5044901,
'avg(span.duration)': 30900.700924083318,
},
],
},
});
render(
);
await waitFor(() =>
expect(screen.queryByTestId('loading-indicator')).not.toBeInTheDocument()
);
expect(mockRequest).toHaveBeenCalled();
const {
opHeader,
descriptionHeader,
throughputHeader,
avgDurationHeader,
timeSpentHeader,
} = await findTableHeaders();
expect(opHeader).toHaveTextContent('Span Operation');
expect(descriptionHeader).toHaveTextContent('Span Description');
expect(throughputHeader).toHaveTextContent('Throughput');
expect(avgDurationHeader).toHaveTextContent('Avg Duration');
expect(timeSpentHeader).toHaveTextContent('Time Spent');
const {opCell, descriptionCell, throughputCell, avgDurationCell, timeSpentCell} =
await findFirstRowCells();
expect(opCell).toHaveTextContent('db');
expect(descriptionCell).toHaveTextContent('SELECT thing FROM my_cool_db');
expect(throughputCell).toHaveTextContent('4.45/s');
expect(avgDurationCell).toHaveTextContent('30.90s');
expect(timeSpentCell).toHaveTextContent('2.04wk');
});
it('should handle the case when there is no span grouping', async () => {
const {organization, project} = initializeData();
const mockRequest = MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/events/`,
method: 'GET',
body: {
data: [
{
'span.op': 'db',
'spm()': 5000,
'sum(span.self_time)': 12346071121.5044901,
'avg(span.duration)': 30900.700924083318,
},
],
},
});
render(
);
await waitFor(() =>
expect(screen.queryByTestId('loading-indicator')).not.toBeInTheDocument()
);
expect(mockRequest).toHaveBeenCalled();
const {opCell, descriptionCell} = await findFirstRowCells();
expect(opCell).toHaveTextContent('db');
expect(descriptionCell).toHaveTextContent('\u2014');
});
});
async function findTableHeaders() {
const tableHeaders = await screen.findAllByTestId('grid-head-cell');
const [
opHeader,
descriptionHeader,
throughputHeader,
avgDurationHeader,
timeSpentHeader,
] = tableHeaders;
return {
opHeader,
descriptionHeader,
throughputHeader,
avgDurationHeader,
timeSpentHeader,
};
}
async function findFirstRowCells() {
const bodyCells = await screen.findAllByTestId('grid-body-cell');
const [opCell, descriptionCell, throughputCell, avgDurationCell, timeSpentCell] =
bodyCells;
return {
opCell,
descriptionCell,
throughputCell,
avgDurationCell,
timeSpentCell,
};
}