threads.spec.jsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import Threads from 'sentry/components/events/interfaces/threads';
  3. import {OrganizationContext} from 'sentry/views/organizationContext';
  4. import {RouteContext} from 'sentry/views/routeContext';
  5. describe('Threads', () => {
  6. const entries = TestStubs.Entries()[0];
  7. const event = TestStubs.Event({entries});
  8. const organization = TestStubs.Organization();
  9. const router = TestStubs.router();
  10. const exceptionEntry = entries[0];
  11. const data = exceptionEntry.data;
  12. const type = exceptionEntry.type;
  13. it('Display multiple frames', () => {
  14. const newEvent = {
  15. ...event,
  16. entries: [
  17. {
  18. ...event.entries[0],
  19. data: {
  20. ...event.entries[0].data,
  21. values: [
  22. event.entries[0].data.values[0],
  23. {
  24. module: 'example.application',
  25. type: 'Error',
  26. value: 'an error occurred',
  27. stacktrace: {
  28. frames: [
  29. {
  30. function: 'main',
  31. module: 'example.application',
  32. lineNo: 1,
  33. filename: 'application',
  34. },
  35. {
  36. function: 'doThing',
  37. module: 'example.application',
  38. lineNo: 2,
  39. filename: 'application',
  40. },
  41. ],
  42. },
  43. },
  44. ],
  45. },
  46. },
  47. event.entries[1],
  48. event.entries[2],
  49. ],
  50. };
  51. const wrapper = mountWithTheme(
  52. <OrganizationContext.Provider value={organization}>
  53. <RouteContext.Provider
  54. value={{
  55. router,
  56. location: router.location,
  57. params: {},
  58. routes: [],
  59. }}
  60. >
  61. <Threads
  62. type={type}
  63. data={data}
  64. orgId="org-slug"
  65. projectId="project-id"
  66. event={newEvent}
  67. />
  68. </RouteContext.Provider>
  69. </OrganizationContext.Provider>
  70. );
  71. // Total frames passed
  72. const totalFramesPasses =
  73. newEvent.entries[0].data.values[0].stacktrace.frames.length +
  74. newEvent.entries[0].data.values[1].stacktrace.frames.length;
  75. expect(wrapper.find('Line').length).toBe(totalFramesPasses);
  76. });
  77. it('Display no frame', () => {
  78. const wrapper = mountWithTheme(
  79. <OrganizationContext.Provider value={organization}>
  80. <RouteContext.Provider
  81. value={{
  82. router,
  83. location: router.location,
  84. params: {},
  85. routes: [],
  86. }}
  87. >
  88. <Threads
  89. type={type}
  90. data={{...data, values: [{...data.values[0], stacktrace: null}]}}
  91. orgId="org-slug"
  92. projectId="project-id"
  93. event={{
  94. ...event,
  95. entries: [
  96. {
  97. ...event.entries[0],
  98. data: {
  99. ...event.entries[0].data,
  100. values: [
  101. {...event.entries[0].data.values[0], id: 0, stacktrace: null},
  102. ],
  103. },
  104. },
  105. event.entries[1],
  106. event.entries[2],
  107. ],
  108. }}
  109. />
  110. </RouteContext.Provider>
  111. </OrganizationContext.Provider>
  112. );
  113. // no exceptions or stacktraces have been found
  114. expect(wrapper.find('Line').length).toBe(0);
  115. });
  116. describe('Displays the stack trace of an exception if all threadIds of exceptionEntry.data.values do not match the threadId of the active thread and if the active thread has crashed equals true', () => {
  117. const threadsEntry = entries[1];
  118. it('Displays the exception stacktrace', () => {
  119. const wrapper = mountWithTheme(
  120. <OrganizationContext.Provider value={organization}>
  121. <RouteContext.Provider
  122. value={{
  123. router,
  124. location: router.location,
  125. params: {},
  126. routes: [],
  127. }}
  128. >
  129. <Threads
  130. type={threadsEntry.type}
  131. data={threadsEntry.data}
  132. orgId="org-slug"
  133. projectId="project-id"
  134. event={event}
  135. />
  136. </RouteContext.Provider>
  137. </OrganizationContext.Provider>
  138. );
  139. // envent.entries[0].data.values[0].stacktrace is defined
  140. expect(wrapper.find('Line').length).toBe(1);
  141. });
  142. it('Displays the the active thread stacktrace', () => {
  143. const wrapper = mountWithTheme(
  144. <OrganizationContext.Provider value={organization}>
  145. <RouteContext.Provider
  146. value={{
  147. router,
  148. location: router.location,
  149. params: {},
  150. routes: [],
  151. }}
  152. >
  153. <Threads
  154. type={threadsEntry.type}
  155. data={threadsEntry.data}
  156. orgId="org-slug"
  157. projectId="project-id"
  158. event={{
  159. ...event,
  160. entries: [
  161. {
  162. ...event.entries[0],
  163. data: {
  164. ...event.entries[0].data,
  165. values: [{...event.entries[0].data.values[0], stacktrace: null}],
  166. },
  167. },
  168. event.entries[1],
  169. event.entries[2],
  170. ],
  171. }}
  172. />
  173. </RouteContext.Provider>
  174. </OrganizationContext.Provider>
  175. );
  176. // the 'threads' entry has a stack trace with 23 frames, but as one of them is duplicated, we only display 22
  177. expect(wrapper.find('Line').length).toBe(22);
  178. });
  179. });
  180. });