dashboard.spec.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import type {MRI} from 'sentry/types';
  2. import {
  3. convertToDashboardWidget,
  4. getWidgetQuery,
  5. toDisplayType,
  6. toMetricDisplayType,
  7. } from 'sentry/utils/metrics/dashboard';
  8. import {MetricDisplayType} from 'sentry/utils/metrics/types';
  9. import {DisplayType} from 'sentry/views/dashboards/types';
  10. describe('convertToDashboardWidget', () => {
  11. it('should convert a metrics query to a dashboard widget (metrics mri, with grouping)', () => {
  12. expect(
  13. convertToDashboardWidget(
  14. {
  15. datetime: {
  16. start: '2021-06-01T00:00:00',
  17. end: '2021-06-02T00:00:00',
  18. period: '1d',
  19. utc: false,
  20. },
  21. groupBy: ['project'],
  22. query: 'event.type:transaction',
  23. projects: [1],
  24. environments: ['prod'],
  25. mri: 'c:custom/login@second',
  26. op: 'p95',
  27. },
  28. MetricDisplayType.AREA
  29. )
  30. ).toEqual({
  31. title: 'p95(login)',
  32. displayType: DisplayType.AREA,
  33. widgetType: 'custom-metrics',
  34. limit: 10,
  35. queries: [
  36. {
  37. name: '',
  38. aggregates: ['p95(c:custom/login@second)'],
  39. columns: ['project'],
  40. fields: ['p95(c:custom/login@second)'],
  41. conditions: 'event.type:transaction',
  42. orderby: '',
  43. },
  44. ],
  45. });
  46. });
  47. it('should convert a metrics query to a dashboard widget (transaction mri, with grouping)', () => {
  48. expect(
  49. convertToDashboardWidget(
  50. {
  51. datetime: {
  52. start: '2021-06-01T00:00:00',
  53. end: '2021-06-02T00:00:00',
  54. period: '1d',
  55. utc: false,
  56. },
  57. groupBy: [],
  58. query: '',
  59. projects: [1],
  60. environments: ['prod'],
  61. mri: 'd:transactions/measurements.duration@second',
  62. op: 'p95',
  63. },
  64. MetricDisplayType.BAR
  65. )
  66. ).toEqual({
  67. title: 'p95(measurements.duration)',
  68. displayType: DisplayType.BAR,
  69. widgetType: 'custom-metrics',
  70. limit: 1,
  71. queries: [
  72. {
  73. name: '',
  74. aggregates: ['p95(d:transactions/measurements.duration@second)'],
  75. columns: [],
  76. fields: ['p95(d:transactions/measurements.duration@second)'],
  77. conditions: '',
  78. orderby: '',
  79. },
  80. ],
  81. });
  82. });
  83. });
  84. describe('toMetricDisplayType', () => {
  85. it('should return the displayType if it is a valid MetricDisplayType', () => {
  86. expect(MetricDisplayType.BAR).toEqual(toMetricDisplayType(DisplayType.BAR));
  87. expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.LINE));
  88. expect(MetricDisplayType.AREA).toEqual(toMetricDisplayType(DisplayType.AREA));
  89. });
  90. it('should return MetricDisplayType.LINE if the displayType is invalid or unsupported', () => {
  91. expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.BIG_NUMBER));
  92. expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.TABLE));
  93. expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.TOP_N));
  94. expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(undefined));
  95. expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(''));
  96. });
  97. });
  98. describe('toDisplayType', () => {
  99. it('should return the displayType if it is a valid MetricDisplayType', () => {
  100. expect(DisplayType.BAR).toEqual(toDisplayType(DisplayType.BAR));
  101. expect(DisplayType.LINE).toEqual(toDisplayType(DisplayType.LINE));
  102. expect(DisplayType.AREA).toEqual(toDisplayType(DisplayType.AREA));
  103. expect(DisplayType.BIG_NUMBER).toEqual(toDisplayType(DisplayType.BIG_NUMBER));
  104. expect(DisplayType.TABLE).toEqual(toDisplayType(DisplayType.TABLE));
  105. expect(DisplayType.TOP_N).toEqual(toDisplayType(DisplayType.TOP_N));
  106. });
  107. it('should return DisplayType.LINE if the displayType is invalid or unsupported', () => {
  108. expect(DisplayType.LINE).toEqual(toDisplayType(undefined));
  109. expect(DisplayType.LINE).toEqual(toDisplayType(''));
  110. });
  111. });
  112. describe('getWidgetQuery', () => {
  113. const metricsQueryBase = {
  114. datetime: {start: '2022-01-01', end: '2022-01-31', period: null, utc: false},
  115. environments: ['production'],
  116. projects: [1],
  117. groupBy: [],
  118. query: '',
  119. };
  120. it('should return the correct widget query object', () => {
  121. // Arrange
  122. const metricsQuery = {
  123. ...metricsQueryBase,
  124. mri: 'd:custom/sentry.events.symbolicator.query_task@second' as MRI,
  125. op: 'sum',
  126. query: 'status = "success"',
  127. title: 'Example Widget',
  128. };
  129. const expectedWidgetQuery = {
  130. name: '',
  131. aggregates: ['sum(d:custom/sentry.events.symbolicator.query_task@second)'],
  132. columns: [],
  133. fields: ['sum(d:custom/sentry.events.symbolicator.query_task@second)'],
  134. conditions: 'status = "success"',
  135. orderby: '',
  136. };
  137. expect(getWidgetQuery(metricsQuery)).toEqual(expectedWidgetQuery);
  138. });
  139. });