spanEvidencePreview.spec.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import {
  2. MockSpan,
  3. ProblemSpan,
  4. TransactionEventBuilder,
  5. } from 'sentry-test/performance/utils';
  6. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  7. import * as useApi from 'sentry/utils/useApi';
  8. import {SpanEvidencePreview} from './spanEvidencePreview';
  9. describe('SpanEvidencePreview', () => {
  10. beforeEach(() => {
  11. jest.useFakeTimers();
  12. jest.resetAllMocks();
  13. MockApiClient.clearMockResponses();
  14. MockApiClient.addMockResponse({
  15. url: '/organizations/org-slug/issues/group-id/',
  16. });
  17. });
  18. it('does not fetch before hover', () => {
  19. const api = new MockApiClient();
  20. jest.spyOn(useApi, 'default').mockReturnValue(api);
  21. const spy = jest.spyOn(api, 'requestPromise');
  22. render(<SpanEvidencePreview groupId="group-id">Hover me</SpanEvidencePreview>);
  23. jest.runAllTimers();
  24. expect(spy).not.toHaveBeenCalled();
  25. });
  26. it('shows error when request fails', async () => {
  27. const api = new MockApiClient();
  28. jest.spyOn(useApi, 'default').mockReturnValue(api);
  29. jest.spyOn(api, 'requestPromise').mockRejectedValue(new Error());
  30. render(<SpanEvidencePreview groupId="group-id">Hover me</SpanEvidencePreview>);
  31. await userEvent.hover(screen.getByText('Hover me'), {delay: null});
  32. await screen.findByText('Failed to load preview');
  33. });
  34. it('renders the span evidence correctly when request succeeds', async () => {
  35. const event = new TransactionEventBuilder()
  36. .addSpan(
  37. new MockSpan({
  38. startTimestamp: 0,
  39. endTimestamp: 100,
  40. op: 'http',
  41. description: 'do a thing',
  42. })
  43. )
  44. .addSpan(
  45. new MockSpan({
  46. startTimestamp: 100,
  47. endTimestamp: 200,
  48. op: 'db',
  49. description: 'SELECT col FROM table',
  50. })
  51. )
  52. .addSpan(
  53. new MockSpan({
  54. startTimestamp: 200,
  55. endTimestamp: 300,
  56. op: 'db',
  57. description: 'SELECT col2 FROM table',
  58. })
  59. )
  60. .addSpan(
  61. new MockSpan({
  62. startTimestamp: 200,
  63. endTimestamp: 300,
  64. op: 'db',
  65. description: 'SELECT col3 FROM table',
  66. })
  67. )
  68. .addSpan(
  69. new MockSpan({
  70. startTimestamp: 300,
  71. endTimestamp: 600,
  72. op: 'db',
  73. description: 'connect',
  74. problemSpan: ProblemSpan.PARENT,
  75. }).addChild(
  76. {
  77. startTimestamp: 300,
  78. endTimestamp: 600,
  79. op: 'db',
  80. description: 'group me',
  81. problemSpan: ProblemSpan.OFFENDER,
  82. },
  83. 9
  84. )
  85. )
  86. .getEvent();
  87. MockApiClient.addMockResponse({
  88. url: `/organizations/org-slug/issues/group-id/events/recommended/`,
  89. body: event,
  90. });
  91. render(<SpanEvidencePreview groupId="group-id">Hover me</SpanEvidencePreview>);
  92. await userEvent.hover(screen.getByText('Hover me'), {delay: null});
  93. await screen.findByTestId('span-evidence-preview-body');
  94. expect(screen.getByRole('cell', {name: 'Transaction'})).toBeInTheDocument();
  95. expect(screen.getByRole('cell', {name: event.title})).toBeInTheDocument();
  96. expect(screen.getByRole('cell', {name: 'Parent Span'})).toBeInTheDocument();
  97. expect(screen.getByRole('cell', {name: 'connect'})).toBeInTheDocument();
  98. expect(screen.getByRole('cell', {name: 'Repeating Spans (9)'})).toBeInTheDocument();
  99. // SQLish formatter uppercases group
  100. expect(screen.getByRole('cell', {name: 'GROUP me'})).toBeInTheDocument();
  101. });
  102. });