stackTracePreview.spec.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  2. import {EventError} from 'sentry/types';
  3. import {EntryType, Event, ExceptionType, ExceptionValue, Frame} from 'sentry/types/event';
  4. import {StackTracePreview} from './stackTracePreview';
  5. const makeEvent = (event: Partial<Event> = {}): Event => {
  6. const evt: Event = {
  7. ...TestStubs.Event(),
  8. ...event,
  9. };
  10. return evt;
  11. };
  12. beforeEach(() => {
  13. MockApiClient.clearMockResponses();
  14. MockApiClient.addMockResponse({
  15. url: '/organizations/org-slug/issues/123/',
  16. });
  17. });
  18. describe('StackTracePreview', () => {
  19. it('renders error message', async () => {
  20. MockApiClient.addMockResponse({
  21. url: `/organizations/org-slug/issues/123/events/recommended/`,
  22. statusCode: 400,
  23. });
  24. render(<StackTracePreview groupId="123">Preview Trigger</StackTracePreview>);
  25. await userEvent.hover(screen.getByText(/Preview Trigger/));
  26. expect(await screen.findByText(/Failed to load stack trace/)).toBeInTheDocument();
  27. });
  28. it('warns about no stacktrace', async () => {
  29. MockApiClient.addMockResponse({
  30. url: `/organizations/org-slug/issues/123/events/recommended/`,
  31. body: makeEvent({id: '456', entries: []}),
  32. });
  33. render(<StackTracePreview groupId="123">Preview Trigger</StackTracePreview>);
  34. await userEvent.hover(screen.getByText(/Preview Trigger/));
  35. expect(
  36. await screen.findByText(/There is no stack trace available for this issue./)
  37. ).toBeInTheDocument();
  38. });
  39. it.each([
  40. ['stack-trace-content', []],
  41. ['stack-trace-content-v2', ['grouping-stacktrace-ui']],
  42. ])('renders %s', async (component, features) => {
  43. const frame: Frame = {
  44. colNo: 0,
  45. filename: 'file.js',
  46. function: 'throwError',
  47. lineNo: 0,
  48. absPath: null,
  49. context: [],
  50. errors: null,
  51. inApp: false,
  52. instructionAddr: null,
  53. module: null,
  54. package: null,
  55. platform: null,
  56. rawFunction: null,
  57. symbol: null,
  58. symbolAddr: null,
  59. trust: undefined,
  60. vars: null,
  61. };
  62. const thread: ExceptionValue = {
  63. stacktrace: {
  64. hasSystemFrames: false,
  65. registers: {},
  66. framesOmitted: 0,
  67. frames: [frame],
  68. },
  69. mechanism: null,
  70. module: null,
  71. rawStacktrace: null,
  72. threadId: null,
  73. type: '',
  74. value: '',
  75. };
  76. const exceptionValue: ExceptionType = {
  77. values: [thread],
  78. excOmitted: undefined,
  79. hasSystemFrames: false,
  80. };
  81. const errorEvent: EventError = {
  82. id: '456',
  83. entries: [
  84. {
  85. type: EntryType.EXCEPTION,
  86. data: exceptionValue,
  87. },
  88. ],
  89. } as EventError;
  90. MockApiClient.addMockResponse({
  91. url: `/organizations/org-slug/issues/123/events/recommended/`,
  92. body: makeEvent(errorEvent),
  93. });
  94. render(<StackTracePreview groupId="123">Preview Trigger</StackTracePreview>, {
  95. organization: {features},
  96. });
  97. await userEvent.hover(screen.getByText(/Preview Trigger/));
  98. expect(await screen.findByTestId(component)).toBeInTheDocument();
  99. });
  100. });