index.spec.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. import {EventsStatsFixture} from 'sentry-fixture/events';
  2. import {initializeOrg} from 'sentry-test/initializeOrg';
  3. import {render, screen} from 'sentry-test/reactTestingLibrary';
  4. import TriggersChart from 'sentry/views/alerts/rules/metric/triggers/chart';
  5. import {
  6. AlertRuleComparisonType,
  7. AlertRuleThresholdType,
  8. Dataset,
  9. } from 'sentry/views/alerts/rules/metric/types';
  10. describe('Incident Rules Create', () => {
  11. let eventStatsMock: jest.Func;
  12. let eventCountsMock: jest.Func;
  13. beforeEach(() => {
  14. eventStatsMock = MockApiClient.addMockResponse({
  15. url: '/organizations/org-slug/events-stats/',
  16. body: EventsStatsFixture(),
  17. });
  18. eventCountsMock = MockApiClient.addMockResponse({
  19. url: '/organizations/org-slug/events-meta/',
  20. body: {count: 5},
  21. });
  22. MockApiClient.addMockResponse({
  23. url: '/organizations/org-slug/events/',
  24. body: {},
  25. });
  26. });
  27. afterEach(() => {
  28. MockApiClient.clearMockResponses();
  29. });
  30. const api = new MockApiClient();
  31. it('renders a metric', async () => {
  32. const {organization, project, router} = initializeOrg();
  33. render(
  34. <TriggersChart
  35. api={api}
  36. anomalies={[]}
  37. location={router.location}
  38. organization={organization}
  39. projects={[project]}
  40. query="event.type:error"
  41. timeWindow={1}
  42. aggregate="count()"
  43. dataset={Dataset.ERRORS}
  44. triggers={[]}
  45. environment={null}
  46. comparisonType={AlertRuleComparisonType.COUNT}
  47. resolveThreshold={null}
  48. thresholdType={AlertRuleThresholdType.BELOW}
  49. newAlertOrQuery
  50. onDataLoaded={() => {}}
  51. isQueryValid
  52. showTotalCount
  53. />
  54. );
  55. expect(await screen.findByTestId('area-chart')).toBeInTheDocument();
  56. expect(await screen.findByTestId('alert-total-events')).toBeInTheDocument();
  57. expect(eventStatsMock).toHaveBeenCalledWith(
  58. expect.anything(),
  59. expect.objectContaining({
  60. query: {
  61. interval: '1m',
  62. project: [2],
  63. query: 'event.type:error',
  64. statsPeriod: '9998m',
  65. yAxis: 'count()',
  66. referrer: 'api.organization-event-stats',
  67. },
  68. })
  69. );
  70. expect(eventCountsMock).toHaveBeenCalledWith(
  71. expect.anything(),
  72. expect.objectContaining({
  73. query: {
  74. project: ['2'],
  75. query: 'event.type:error',
  76. statsPeriod: '9998m',
  77. environment: [],
  78. },
  79. })
  80. );
  81. });
  82. it('does not show & query total count if showTotalCount === false', async () => {
  83. const {organization, project, router} = initializeOrg();
  84. render(
  85. <TriggersChart
  86. api={api}
  87. location={router.location}
  88. organization={organization}
  89. projects={[project]}
  90. query="event.type:error"
  91. timeWindow={1}
  92. aggregate="count()"
  93. dataset={Dataset.ERRORS}
  94. triggers={[]}
  95. environment={null}
  96. comparisonType={AlertRuleComparisonType.COUNT}
  97. resolveThreshold={null}
  98. thresholdType={AlertRuleThresholdType.BELOW}
  99. newAlertOrQuery
  100. onDataLoaded={() => {}}
  101. isQueryValid
  102. />
  103. );
  104. expect(await screen.findByTestId('area-chart')).toBeInTheDocument();
  105. expect(screen.queryByTestId('alert-total-events')).not.toBeInTheDocument();
  106. expect(eventStatsMock).toHaveBeenCalledWith(
  107. expect.anything(),
  108. expect.objectContaining({
  109. query: {
  110. interval: '1m',
  111. project: [2],
  112. query: 'event.type:error',
  113. statsPeriod: '9998m',
  114. yAxis: 'count()',
  115. referrer: 'api.organization-event-stats',
  116. },
  117. })
  118. );
  119. expect(eventCountsMock).not.toHaveBeenCalledWith(
  120. expect.anything(),
  121. expect.objectContaining({
  122. query: {
  123. project: ['2'],
  124. query: 'event.type:error',
  125. statsPeriod: '9998m',
  126. environment: [],
  127. },
  128. })
  129. );
  130. });
  131. it('queries the errors dataset if dataset is errors', async () => {
  132. const {organization, project, router} = initializeOrg({
  133. organization: {features: ['performance-discover-dataset-selector']},
  134. });
  135. render(
  136. <TriggersChart
  137. api={api}
  138. location={router.location}
  139. organization={organization}
  140. projects={[project]}
  141. query="event.type:error"
  142. timeWindow={1}
  143. aggregate="count()"
  144. dataset={Dataset.ERRORS}
  145. triggers={[]}
  146. environment={null}
  147. comparisonType={AlertRuleComparisonType.COUNT}
  148. resolveThreshold={null}
  149. thresholdType={AlertRuleThresholdType.BELOW}
  150. newAlertOrQuery
  151. onDataLoaded={() => {}}
  152. isQueryValid
  153. showTotalCount
  154. />
  155. );
  156. expect(await screen.findByTestId('area-chart')).toBeInTheDocument();
  157. expect(await screen.findByTestId('alert-total-events')).toBeInTheDocument();
  158. expect(eventStatsMock).toHaveBeenCalledWith(
  159. expect.anything(),
  160. expect.objectContaining({
  161. query: {
  162. interval: '1m',
  163. project: [2],
  164. query: 'event.type:error',
  165. statsPeriod: '9998m',
  166. yAxis: 'count()',
  167. referrer: 'api.organization-event-stats',
  168. dataset: 'errors',
  169. },
  170. })
  171. );
  172. expect(eventCountsMock).toHaveBeenCalledWith(
  173. expect.anything(),
  174. expect.objectContaining({
  175. query: {
  176. project: ['2'],
  177. query: 'event.type:error',
  178. statsPeriod: '9998m',
  179. environment: [],
  180. dataset: 'errors',
  181. },
  182. })
  183. );
  184. });
  185. it('queries custom metrics using the metricsEnhanced dataset and metrics layer', async () => {
  186. const {organization, project, router} = initializeOrg({
  187. organization: {features: ['custom-metrics']},
  188. });
  189. render(
  190. <TriggersChart
  191. api={api}
  192. location={router.location}
  193. organization={organization}
  194. projects={[project]}
  195. query=""
  196. timeWindow={1}
  197. aggregate="count(d:custom/my_metric@seconds)"
  198. dataset={Dataset.GENERIC_METRICS}
  199. triggers={[]}
  200. environment={null}
  201. comparisonType={AlertRuleComparisonType.COUNT}
  202. resolveThreshold={null}
  203. thresholdType={AlertRuleThresholdType.BELOW}
  204. newAlertOrQuery
  205. onDataLoaded={() => {}}
  206. isQueryValid
  207. showTotalCount
  208. />
  209. );
  210. expect(await screen.findByTestId('area-chart')).toBeInTheDocument();
  211. expect(await screen.findByTestId('alert-total-events')).toBeInTheDocument();
  212. expect(eventStatsMock).toHaveBeenCalledWith(
  213. expect.anything(),
  214. expect.objectContaining({
  215. query: {
  216. interval: '1m',
  217. project: [2],
  218. query: '',
  219. statsPeriod: '9998m',
  220. yAxis: 'count(d:custom/my_metric@seconds)',
  221. referrer: 'api.organization-event-stats',
  222. forceMetricsLayer: 'true',
  223. dataset: 'metricsEnhanced',
  224. },
  225. })
  226. );
  227. });
  228. it('does a 7 day query for confidence data on the EAP dataset', async () => {
  229. const {organization, project, router} = initializeOrg({
  230. organization: {features: ['alerts-eap']},
  231. });
  232. render(
  233. <TriggersChart
  234. api={api}
  235. location={router.location}
  236. organization={organization}
  237. projects={[project]}
  238. query=""
  239. timeWindow={1}
  240. aggregate="count(span.duration)"
  241. dataset={Dataset.EVENTS_ANALYTICS_PLATFORM}
  242. triggers={[]}
  243. environment={null}
  244. comparisonType={AlertRuleComparisonType.COUNT}
  245. resolveThreshold={null}
  246. thresholdType={AlertRuleThresholdType.BELOW}
  247. newAlertOrQuery
  248. onDataLoaded={() => {}}
  249. isQueryValid
  250. showTotalCount
  251. includeConfidence
  252. />
  253. );
  254. expect(await screen.findByTestId('area-chart')).toBeInTheDocument();
  255. expect(await screen.findByTestId('alert-total-events')).toBeInTheDocument();
  256. expect(eventStatsMock).toHaveBeenCalledWith(
  257. '/organizations/org-slug/events-stats/',
  258. expect.objectContaining({
  259. query: expect.objectContaining({
  260. dataset: 'spans',
  261. statsPeriod: '9998m',
  262. yAxis: 'count(span.duration)',
  263. }),
  264. })
  265. );
  266. });
  267. });