issueDetailsEventNavigation.spec.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import {EventFixture} from 'sentry-fixture/event';
  2. import {GroupFixture} from 'sentry-fixture/group';
  3. import {LocationFixture} from 'sentry-fixture/locationFixture';
  4. import {RouterFixture} from 'sentry-fixture/routerFixture';
  5. import {initializeOrg} from 'sentry-test/initializeOrg';
  6. import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
  7. import * as useMedia from 'sentry/utils/useMedia';
  8. import {IssueDetailsEventNavigation} from './issueDetailsEventNavigation';
  9. describe('IssueDetailsEventNavigation', () => {
  10. const {organization, router} = initializeOrg();
  11. const group = GroupFixture({id: 'group-id'});
  12. const testEvent = EventFixture({
  13. id: 'event-id',
  14. size: 7,
  15. dateCreated: '2019-03-20T00:00:00.000Z',
  16. errors: [],
  17. entries: [],
  18. tags: [
  19. {key: 'environment', value: 'dev'},
  20. {key: 'replayId', value: 'replay-id'},
  21. ],
  22. previousEventID: 'prev-event-id',
  23. nextEventID: 'next-event-id',
  24. });
  25. const defaultProps: React.ComponentProps<typeof IssueDetailsEventNavigation> = {
  26. event: testEvent,
  27. group,
  28. };
  29. beforeEach(() => {
  30. jest.resetAllMocks();
  31. MockApiClient.addMockResponse({
  32. url: `/organizations/${organization.slug}/issues/${group.id}/tags/`,
  33. body: [],
  34. });
  35. });
  36. describe('recommended event tabs', () => {
  37. it('can navigate to the oldest event', async () => {
  38. jest.spyOn(useMedia, 'default').mockReturnValue(true);
  39. render(<IssueDetailsEventNavigation {...defaultProps} />, {router});
  40. await userEvent.click(await screen.findByRole('tab', {name: 'First'}));
  41. expect(router.push).toHaveBeenCalledWith({
  42. pathname: '/organizations/org-slug/issues/group-id/events/oldest/',
  43. query: {referrer: 'oldest-event'},
  44. });
  45. });
  46. it('can navigate to the latest event', async () => {
  47. jest.spyOn(useMedia, 'default').mockReturnValue(true);
  48. render(<IssueDetailsEventNavigation {...defaultProps} />, {router});
  49. await userEvent.click(await screen.findByRole('tab', {name: 'Last'}));
  50. expect(router.push).toHaveBeenCalledWith({
  51. pathname: '/organizations/org-slug/issues/group-id/events/latest/',
  52. query: {referrer: 'latest-event'},
  53. });
  54. });
  55. it('can navigate to the recommended event', async () => {
  56. jest.spyOn(useMedia, 'default').mockReturnValue(true);
  57. const recommendedEventRouter = RouterFixture({
  58. params: {eventId: 'latest'},
  59. location: LocationFixture({
  60. pathname: `/organizations/org-slug/issues/group-id/events/latest/`,
  61. }),
  62. });
  63. render(<IssueDetailsEventNavigation {...defaultProps} />, {
  64. router: recommendedEventRouter,
  65. });
  66. await userEvent.click(await screen.findByRole('tab', {name: 'Rec.'}));
  67. expect(recommendedEventRouter.push).toHaveBeenCalledWith({
  68. pathname: '/organizations/org-slug/issues/group-id/events/recommended/',
  69. query: {referrer: 'recommended-event'},
  70. });
  71. });
  72. });
  73. it('can navigate next/previous events', async () => {
  74. render(<IssueDetailsEventNavigation {...defaultProps} />);
  75. expect(await screen.findByRole('button', {name: 'Previous Event'})).toHaveAttribute(
  76. 'href',
  77. `/organizations/org-slug/issues/group-id/events/prev-event-id/?referrer=previous-event`
  78. );
  79. expect(screen.getByRole('button', {name: 'Next Event'})).toHaveAttribute(
  80. 'href',
  81. `/organizations/org-slug/issues/group-id/events/next-event-id/?referrer=next-event`
  82. );
  83. });
  84. it('can preload next/previous events', async () => {
  85. const event = EventFixture({
  86. nextEventID: 'next-event-id',
  87. previousEventID: 'prev-event-id',
  88. });
  89. const mockNextEvent = MockApiClient.addMockResponse({
  90. url: `/organizations/org-slug/issues/group-id/events/next-event-id/`,
  91. body: EventFixture(),
  92. });
  93. const mockPreviousEvent = MockApiClient.addMockResponse({
  94. url: `/organizations/org-slug/issues/group-id/events/prev-event-id/`,
  95. body: EventFixture(),
  96. });
  97. render(<IssueDetailsEventNavigation {...defaultProps} event={event} />);
  98. expect(mockNextEvent).not.toHaveBeenCalled();
  99. expect(mockPreviousEvent).not.toHaveBeenCalled();
  100. await userEvent.hover(await screen.findByRole('button', {name: 'Next Event'}));
  101. await waitFor(() => expect(mockNextEvent).toHaveBeenCalled());
  102. expect(mockPreviousEvent).not.toHaveBeenCalled();
  103. await userEvent.hover(screen.getByRole('button', {name: 'Previous Event'}));
  104. await waitFor(() => expect(mockPreviousEvent).toHaveBeenCalled());
  105. });
  106. });