issueFieldRenderers.spec.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {Group} from 'fixtures/js-stubs/group';
  2. import {Project} from 'fixtures/js-stubs/project';
  3. import {User} from 'fixtures/js-stubs/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: Project(),
  17. projects: [Project()],
  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 = Group({project});
  79. GroupStore.add([
  80. {
  81. ...group,
  82. owners: [{owner: 'user:1', type: 'suspectCommit'}],
  83. assignedTo: {
  84. email: 'test@sentry.io',
  85. type: 'user',
  86. id: '1',
  87. name: 'Test User',
  88. },
  89. },
  90. ]);
  91. const renderer = getIssueFieldRenderer('assignee');
  92. render(
  93. renderer!(data, {
  94. location,
  95. organization,
  96. }) as React.ReactElement
  97. );
  98. expect(screen.getByText('TU')).toBeInTheDocument();
  99. userEvent.hover(screen.getByText('TU'));
  100. expect(await screen.findByText('Assigned to')).toBeInTheDocument();
  101. expect(screen.getByText('Test User')).toBeInTheDocument();
  102. expect(screen.getByText('Based on')).toBeInTheDocument();
  103. expect(screen.getByText('commit data')).toBeInTheDocument();
  104. });
  105. it('can render counts', async function () {
  106. const renderer = getIssueFieldRenderer('events');
  107. render(
  108. renderer!(data, {
  109. location,
  110. organization,
  111. }) as React.ReactElement
  112. );
  113. expect(screen.getByText('3k')).toBeInTheDocument();
  114. expect(screen.getByText('6k')).toBeInTheDocument();
  115. userEvent.hover(screen.getByText('3k'));
  116. expect(await screen.findByText('Total in last 7 days')).toBeInTheDocument();
  117. expect(screen.getByText('Matching search filters')).toBeInTheDocument();
  118. expect(screen.getByText('Since issue began')).toBeInTheDocument();
  119. });
  120. });
  121. it('can render links', function () {
  122. const renderer = getIssueFieldRenderer('links');
  123. render(
  124. renderer!(data, {
  125. location,
  126. organization,
  127. }) as React.ReactElement
  128. );
  129. expect(screen.getByText('ANNO-123')).toBeInTheDocument();
  130. });
  131. it('can render multiple links', function () {
  132. const renderer = getIssueFieldRenderer('links');
  133. render(
  134. renderer!(
  135. {
  136. data,
  137. ...{
  138. links: [
  139. '<a href="sentry.io">ANNO-123</a>',
  140. '<a href="sentry.io">ANNO-456</a>',
  141. ],
  142. },
  143. },
  144. {
  145. location,
  146. organization,
  147. }
  148. ) as React.ReactElement
  149. );
  150. expect(screen.getByText('ANNO-123')).toBeInTheDocument();
  151. expect(screen.getByText('ANNO-456')).toBeInTheDocument();
  152. });
  153. });