index.spec.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import {TransactionEventFixture} from 'sentry-fixture/event';
  2. import {LocationFixture} from 'sentry-fixture/locationFixture';
  3. import {OrganizationFixture} from 'sentry-fixture/organization';
  4. import {render, screen} from 'sentry-test/reactTestingLibrary';
  5. import type {Organization} from 'sentry/types/organization';
  6. import EventView from 'sentry/utils/discover/eventView';
  7. import {useLocation} from 'sentry/utils/useLocation';
  8. import {
  9. TraceMetaDataHeader,
  10. type TraceMetadataHeaderProps,
  11. } from 'sentry/views/performance/newTraceDetails/traceHeader';
  12. import {TraceViewSources} from 'sentry/views/performance/newTraceDetails/traceHeader/breadcrumbs';
  13. import {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
  14. jest.mock('sentry/views/performance/newTraceDetails/traceState/traceStateProvider');
  15. jest.mock('sentry/utils/useLocation');
  16. const baseProps: Partial<TraceMetadataHeaderProps> = {
  17. metaResults: {
  18. data: {
  19. errors: 1,
  20. performance_issues: 1,
  21. projects: 1,
  22. transactions: 1,
  23. transaction_child_count_map: {span1: 1},
  24. span_count: 0,
  25. span_count_map: {},
  26. },
  27. errors: [],
  28. status: 'success',
  29. },
  30. rootEventResults: {
  31. data: TransactionEventFixture(),
  32. } as any,
  33. tree: new TraceTree().build(),
  34. traceEventView: EventView.fromSavedQuery({
  35. id: '1',
  36. name: 'test',
  37. fields: ['title', 'event.type', 'project', 'timestamp'],
  38. projects: [],
  39. version: 2,
  40. }),
  41. };
  42. let organization: Organization;
  43. const useLocationMock = jest.mocked(useLocation);
  44. describe('TraceMetaDataHeader', () => {
  45. beforeEach(() => {
  46. jest.resetAllMocks();
  47. organization = OrganizationFixture();
  48. });
  49. describe('breadcrumbs', () => {
  50. it('should render module breadcrumbs', () => {
  51. useLocationMock.mockReturnValue(
  52. LocationFixture({
  53. pathname: '/organizations/org-slug/insights/backend/trace/123',
  54. query: {
  55. source: TraceViewSources.REQUESTS_MODULE,
  56. },
  57. })
  58. );
  59. const props = {...baseProps} as TraceMetadataHeaderProps;
  60. render(<TraceMetaDataHeader {...props} organization={organization} />);
  61. const breadcrumbs = screen.getByTestId('breadcrumb-list');
  62. const breadcrumbsLinks = screen.getAllByTestId('breadcrumb-link');
  63. const breadcrumbsItems = screen.getAllByTestId('breadcrumb-item');
  64. expect(breadcrumbs.childElementCount).toBe(5);
  65. expect(breadcrumbsLinks).toHaveLength(2);
  66. expect(breadcrumbsLinks[0]).toHaveTextContent('Backend');
  67. expect(breadcrumbsLinks[1]).toHaveTextContent('Domain Summary');
  68. expect(breadcrumbsItems).toHaveLength(1);
  69. expect(breadcrumbsItems[0]).toHaveTextContent('Trace View');
  70. });
  71. it('should show insights from transaction summary with perf removal feature', () => {
  72. useLocationMock.mockReturnValue(
  73. LocationFixture({
  74. pathname: '/organizations/org-slug/traces/trace/123',
  75. query: {
  76. source: TraceViewSources.PERFORMANCE_TRANSACTION_SUMMARY,
  77. transaction: 'transaction-name',
  78. },
  79. })
  80. );
  81. const props = {...baseProps} as TraceMetadataHeaderProps;
  82. organization.features.push('insights-performance-landing-removal');
  83. render(<TraceMetaDataHeader {...props} organization={organization} />);
  84. const breadcrumbs = screen.getByTestId('breadcrumb-list');
  85. const breadcrumbsLinks = screen.getAllByTestId('breadcrumb-link');
  86. const breadcrumbsItems = screen.getAllByTestId('breadcrumb-item');
  87. expect(breadcrumbs.childElementCount).toBe(5);
  88. expect(breadcrumbsLinks).toHaveLength(1);
  89. expect(breadcrumbsLinks[0]).toHaveTextContent('Transaction Summary');
  90. expect(breadcrumbsLinks[0]).toHaveAttribute(
  91. 'href',
  92. '/organizations/org-slug/insights/summary?source=performance_transaction_summary&transaction=transaction-name'
  93. );
  94. expect(breadcrumbsItems).toHaveLength(2);
  95. expect(breadcrumbsItems[0]).toHaveTextContent('Insights');
  96. expect(breadcrumbsItems[1]).toHaveTextContent('Trace View');
  97. });
  98. it('should show performance from transaction summary', () => {
  99. useLocationMock.mockReturnValue(
  100. LocationFixture({
  101. pathname: '/organizations/org-slug/traces/trace/123',
  102. query: {
  103. source: TraceViewSources.PERFORMANCE_TRANSACTION_SUMMARY,
  104. transaction: 'transaction-name',
  105. },
  106. })
  107. );
  108. const props = {...baseProps} as TraceMetadataHeaderProps;
  109. render(<TraceMetaDataHeader {...props} organization={organization} />);
  110. const breadcrumbs = screen.getByTestId('breadcrumb-list');
  111. const breadcrumbsLinks = screen.getAllByTestId('breadcrumb-link');
  112. const breadcrumbsItems = screen.getAllByTestId('breadcrumb-item');
  113. expect(breadcrumbs.childElementCount).toBe(5);
  114. expect(breadcrumbsLinks).toHaveLength(2);
  115. expect(breadcrumbsLinks[0]).toHaveTextContent('Performance');
  116. expect(breadcrumbsLinks[0]).toHaveAttribute(
  117. 'href',
  118. '/organizations/org-slug/performance?source=performance_transaction_summary&transaction=transaction-name'
  119. );
  120. expect(breadcrumbsLinks[1]).toHaveTextContent('Transaction Summary');
  121. expect(breadcrumbsLinks[1]).toHaveAttribute(
  122. 'href',
  123. '/organizations/org-slug/performance/summary?source=performance_transaction_summary&transaction=transaction-name'
  124. );
  125. expect(breadcrumbsItems).toHaveLength(1);
  126. expect(breadcrumbsItems[0]).toHaveTextContent('Trace View');
  127. });
  128. it('should render domain overview breadcrumbs', () => {
  129. useLocationMock.mockReturnValue(
  130. LocationFixture({
  131. pathname: '/organizations/org-slug/insights/frontend/trace/123',
  132. query: {
  133. source: TraceViewSources.PERFORMANCE_TRANSACTION_SUMMARY,
  134. },
  135. })
  136. );
  137. const props = {...baseProps} as TraceMetadataHeaderProps;
  138. render(<TraceMetaDataHeader {...props} organization={organization} />);
  139. const breadcrumbs = screen.getByTestId('breadcrumb-list');
  140. const breadcrumbsLinks = screen.getAllByTestId('breadcrumb-link');
  141. const breadcrumbsItems = screen.getAllByTestId('breadcrumb-item');
  142. expect(breadcrumbs.childElementCount).toBe(5);
  143. expect(breadcrumbsLinks).toHaveLength(2);
  144. expect(breadcrumbsLinks[0]).toHaveTextContent('Frontend');
  145. expect(breadcrumbsLinks[1]).toHaveTextContent('Transaction Summary');
  146. expect(breadcrumbsItems).toHaveLength(1);
  147. expect(breadcrumbsItems[0]).toHaveTextContent('Trace View');
  148. });
  149. });
  150. });