utils.spec.jsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import {initializeOrg} from 'sentry-test/initializeOrg';
  2. import {
  3. Dataset,
  4. Datasource,
  5. SessionsAggregate,
  6. } from 'app/views/alerts/incidentRules/types';
  7. import {
  8. alertAxisFormatter,
  9. alertTooltipValueFormatter,
  10. getQueryDatasource,
  11. isSessionAggregate,
  12. } from 'app/views/alerts/utils';
  13. import {getIncidentDiscoverUrl} from 'app/views/alerts/utils/getIncidentDiscoverUrl';
  14. describe('Alert utils', function () {
  15. const {org, projects} = initializeOrg();
  16. const mockStats = {
  17. eventStats: {
  18. data: [
  19. [0, 10],
  20. [120, 10],
  21. ],
  22. },
  23. };
  24. describe('getIncidentDiscoverUrl', function () {
  25. it('creates a discover query url for errors', function () {
  26. const incident = {
  27. title: 'Test error alert',
  28. discoverQuery: 'id:test',
  29. projects,
  30. alertRule: {
  31. timeWindow: 1,
  32. dataset: Dataset.ERRORS,
  33. aggregate: 'count()',
  34. },
  35. };
  36. const to = getIncidentDiscoverUrl({
  37. orgSlug: org.slug,
  38. projects,
  39. incident,
  40. stats: mockStats,
  41. });
  42. expect(to).toEqual({
  43. query: expect.objectContaining({
  44. name: 'Test error alert',
  45. field: ['issue', 'count()', 'count_unique(user)'],
  46. sort: ['-count'],
  47. query: 'id:test',
  48. yAxis: 'count()',
  49. start: '1970-01-01T00:00:00.000',
  50. end: '1970-01-01T00:02:00.000',
  51. interval: '1m',
  52. }),
  53. pathname: '/organizations/org-slug/discover/results/',
  54. });
  55. });
  56. it('creates a discover query url for transactions', function () {
  57. const incident = {
  58. title: 'Test transaction alert',
  59. discoverQuery: 'id:test',
  60. projects,
  61. alertRule: {
  62. timeWindow: 1,
  63. dataset: Dataset.TRANSACTIONS,
  64. aggregate: 'p90()',
  65. },
  66. };
  67. const to = getIncidentDiscoverUrl({
  68. orgSlug: org.slug,
  69. projects,
  70. incident,
  71. stats: mockStats,
  72. });
  73. expect(to).toEqual({
  74. query: expect.objectContaining({
  75. name: 'Test transaction alert',
  76. field: ['transaction', 'p90()'],
  77. sort: ['-p90'],
  78. query: 'id:test',
  79. yAxis: 'p90()',
  80. }),
  81. pathname: '/organizations/org-slug/discover/results/',
  82. });
  83. });
  84. });
  85. describe('getQuerySource', () => {
  86. it('should parse event type error or default', () => {
  87. expect(getQueryDatasource('event.type:default OR event.type:error')).toEqual({
  88. source: Datasource.ERROR_DEFAULT,
  89. query: '',
  90. });
  91. expect(
  92. getQueryDatasource(
  93. 'event.type:error OR event.type:default transaction.duration:<30s'
  94. )
  95. ).toEqual({
  96. source: Datasource.ERROR_DEFAULT,
  97. query: 'transaction.duration:<30s',
  98. });
  99. expect(
  100. getQueryDatasource('event.type:error OR (event.type:default event.level:fatal)')
  101. ).toEqual({
  102. source: Datasource.ERROR_DEFAULT,
  103. query: 'event.level:fatal)',
  104. });
  105. expect(
  106. getQueryDatasource('(event.type:error OR event.type:default) event.level:fatal')
  107. ).toEqual({
  108. source: Datasource.ERROR_DEFAULT,
  109. query: 'event.level:fatal',
  110. });
  111. });
  112. it('should not allow event type transaction with anything else', () => {
  113. expect(getQueryDatasource('event.type:error OR event.type:transaction')).toBeNull();
  114. expect(
  115. getQueryDatasource('event.type:transaction OR event.type:default')
  116. ).toBeNull();
  117. });
  118. it('should not allow boolean event types', () => {
  119. expect(getQueryDatasource('!event.type:error')).toBeNull();
  120. expect(getQueryDatasource('!event.type:transaction something')).toBeNull();
  121. expect(getQueryDatasource('!event.type:default')).toBeNull();
  122. });
  123. it('should allow error, transaction, default alone', () => {
  124. expect(getQueryDatasource('event.type:error test')).toEqual({
  125. source: Datasource.ERROR,
  126. query: 'test',
  127. });
  128. expect(getQueryDatasource('event.type:default test')).toEqual({
  129. source: Datasource.DEFAULT,
  130. query: 'test',
  131. });
  132. expect(getQueryDatasource('event.type:transaction test')).toEqual({
  133. source: Datasource.TRANSACTION,
  134. query: 'test',
  135. });
  136. expect(
  137. getQueryDatasource(
  138. 'event.type:error explode OR (event.type:default event.level:fatal)'
  139. )
  140. ).toEqual({
  141. source: Datasource.ERROR,
  142. query: 'explode OR (event.type:default event.level:fatal)',
  143. });
  144. });
  145. });
  146. describe('isSessionAggregate', () => {
  147. it('accepts session aggregate', () => {
  148. Object.values(SessionsAggregate).forEach(aggregate => {
  149. expect(isSessionAggregate(aggregate)).toBeTruthy();
  150. });
  151. });
  152. it('rejects other aggregates', () => {
  153. expect(isSessionAggregate('p95(transaction.duration)')).toBeFalsy();
  154. });
  155. });
  156. describe('alertAxisFormatter', () => {
  157. it('formatts', () => {
  158. expect(
  159. alertAxisFormatter(
  160. 98.312,
  161. 'Crash Free Rate',
  162. SessionsAggregate.CRASH_FREE_SESSIONS
  163. )
  164. ).toBe('98.31%');
  165. expect(alertAxisFormatter(0.1234, 'failure_rate()', 'failure_rate()')).toBe('12%');
  166. });
  167. });
  168. describe('alertTooltipValueFormatter', () => {
  169. it('formatts', () => {
  170. expect(
  171. alertTooltipValueFormatter(
  172. 98.312,
  173. 'Crash Free Rate',
  174. SessionsAggregate.CRASH_FREE_SESSIONS
  175. )
  176. ).toBe('98.312%');
  177. expect(alertTooltipValueFormatter(0.1234, 'failure_rate()', 'failure_rate()')).toBe(
  178. '12.34%'
  179. );
  180. });
  181. });
  182. });