issueFieldRenderers.spec.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import {Group as GroupFixture} from 'sentry-fixture/group';
  2. import {Project as ProjectFixture} from 'sentry-fixture/project';
  3. import {User} from 'sentry-fixture/user';
  4. import {initializeOrg} from 'sentry-test/initializeOrg';
  5. import {act, render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  6. import GroupStore from 'sentry/stores/groupStore';
  7. import MemberListStore from 'sentry/stores/memberListStore';
  8. import ProjectsStore from 'sentry/stores/projectsStore';
  9. import {getIssueFieldRenderer} from 'sentry/utils/dashboards/issueFieldRenderers';
  10. describe('getIssueFieldRenderer', function () {
  11. let location, context, project, organization, data, user;
  12. beforeEach(function () {
  13. context = initializeOrg({
  14. organization,
  15. router: {},
  16. project: ProjectFixture(),
  17. projects: [ProjectFixture()],
  18. });
  19. organization = context.organization;
  20. project = context.project;
  21. act(() => ProjectsStore.loadInitialData([project]));
  22. user = 'email:text@example.com';
  23. location = {
  24. pathname: '/events',
  25. query: {},
  26. };
  27. data = {
  28. id: '1',
  29. team_key_transaction: 1,
  30. title: 'ValueError: something bad',
  31. transaction: 'api.do_things',
  32. boolValue: 1,
  33. numeric: 1.23,
  34. createdAt: new Date(2019, 9, 3, 12, 13, 14),
  35. url: '/example',
  36. project: project.slug,
  37. release: 'F2520C43515BD1F0E8A6BD46233324641A370BF6',
  38. user,
  39. 'span_ops_breakdown.relative': '',
  40. 'spans.browser': 10,
  41. 'spans.db': 30,
  42. 'spans.http': 15,
  43. 'spans.resource': 20,
  44. 'spans.total.time': 75,
  45. 'transaction.duration': 75,
  46. 'timestamp.to_day': '2021-09-05T00:00:00+00:00',
  47. lifetimeEvents: 10000,
  48. filteredEvents: 3000,
  49. events: 6000,
  50. period: '7d',
  51. links: ['<a href="sentry.io">ANNO-123</a>'],
  52. };
  53. MockApiClient.addMockResponse({
  54. url: `/organizations/${organization.slug}/projects/${project.slug}/`,
  55. body: project,
  56. });
  57. MockApiClient.addMockResponse({
  58. url: `/organizations/${organization.slug}/key-transactions/`,
  59. method: 'POST',
  60. });
  61. MockApiClient.addMockResponse({
  62. url: `/organizations/${organization.slug}/key-transactions/`,
  63. method: 'DELETE',
  64. });
  65. });
  66. describe('Issue fields', () => {
  67. it('can render assignee', async function () {
  68. MemberListStore.loadInitialData([
  69. User({
  70. name: 'Test User',
  71. email: 'test@sentry.io',
  72. avatar: {
  73. avatarType: 'letter_avatar',
  74. avatarUuid: null,
  75. },
  76. }),
  77. ]);
  78. const group = GroupFixture({project});
  79. GroupStore.add([
  80. {
  81. ...group,
  82. owners: [
  83. {owner: 'user:1', type: 'suspectCommit', date_added: '2020-01-01T00:00:00'},
  84. ],
  85. assignedTo: {
  86. email: 'test@sentry.io',
  87. type: 'user',
  88. id: '1',
  89. name: 'Test User',
  90. },
  91. },
  92. ]);
  93. const renderer = getIssueFieldRenderer('assignee');
  94. render(
  95. renderer!(data, {
  96. location,
  97. organization,
  98. }) as React.ReactElement
  99. );
  100. expect(screen.getByText('TU')).toBeInTheDocument();
  101. await userEvent.hover(screen.getByText('TU'));
  102. expect(await screen.findByText('Assigned to Test User')).toBeInTheDocument();
  103. expect(screen.getByText('Based on')).toBeInTheDocument();
  104. expect(screen.getByText('commit data')).toBeInTheDocument();
  105. });
  106. it('can render counts', async function () {
  107. const renderer = getIssueFieldRenderer('events');
  108. render(
  109. renderer!(data, {
  110. location,
  111. organization,
  112. }) as React.ReactElement
  113. );
  114. expect(screen.getByText('3k')).toBeInTheDocument();
  115. expect(screen.getByText('6k')).toBeInTheDocument();
  116. await userEvent.hover(screen.getByText('3k'));
  117. expect(await screen.findByText('Total in last 7 days')).toBeInTheDocument();
  118. expect(screen.getByText('Matching search filters')).toBeInTheDocument();
  119. expect(screen.getByText('Since issue began')).toBeInTheDocument();
  120. });
  121. });
  122. it('can render links', function () {
  123. const renderer = getIssueFieldRenderer('links');
  124. render(
  125. renderer!(data, {
  126. location,
  127. organization,
  128. }) as React.ReactElement
  129. );
  130. expect(screen.getByText('ANNO-123')).toBeInTheDocument();
  131. });
  132. it('can render multiple links', function () {
  133. const renderer = getIssueFieldRenderer('links');
  134. render(
  135. renderer!(
  136. {
  137. data,
  138. ...{
  139. links: [
  140. '<a href="sentry.io">ANNO-123</a>',
  141. '<a href="sentry.io">ANNO-456</a>',
  142. ],
  143. },
  144. },
  145. {
  146. location,
  147. organization,
  148. }
  149. ) as React.ReactElement
  150. );
  151. expect(screen.getByText('ANNO-123')).toBeInTheDocument();
  152. expect(screen.getByText('ANNO-456')).toBeInTheDocument();
  153. });
  154. });