convertBuilderStateToWidget.spec.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
  2. import type {WidgetBuilderState} from 'sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState';
  3. import {convertBuilderStateToWidget} from 'sentry/views/dashboards/widgetBuilder/utils/convertBuilderStateToWidget';
  4. import {FieldValueKind} from 'sentry/views/discover/table/types';
  5. describe('convertBuilderStateToWidget', function () {
  6. it('returns the widget with the provided widget queries state', function () {
  7. const mockState: WidgetBuilderState = {
  8. title: 'Test Widget',
  9. description: 'Test Description',
  10. dataset: WidgetType.ERRORS,
  11. displayType: DisplayType.LINE,
  12. limit: 5,
  13. fields: [{kind: 'field', field: 'geo.country'}],
  14. yAxis: [{kind: 'function', function: ['count', '', undefined, undefined]}],
  15. };
  16. const widget = convertBuilderStateToWidget(mockState);
  17. expect(widget).toEqual({
  18. title: 'Test Widget',
  19. description: 'Test Description',
  20. widgetType: WidgetType.ERRORS,
  21. displayType: DisplayType.LINE,
  22. interval: '1h',
  23. limit: 5,
  24. queries: [
  25. {
  26. fields: ['geo.country', 'count()'],
  27. fieldAliases: [''],
  28. aggregates: ['count()'],
  29. columns: ['geo.country'],
  30. conditions: '',
  31. name: '',
  32. orderby: 'geo.country',
  33. selectedAggregate: undefined,
  34. },
  35. ],
  36. thresholds: undefined,
  37. });
  38. });
  39. it('injects the orderby from the sort state into the widget queries', function () {
  40. const mockState: WidgetBuilderState = {
  41. query: ['transaction.duration:>100', 'transaction.duration:>50'],
  42. sort: [{field: 'geo.country', kind: 'desc'}],
  43. };
  44. const widget = convertBuilderStateToWidget(mockState);
  45. expect(widget.queries[0]!.orderby).toBe('-geo.country');
  46. expect(widget.queries[1]!.orderby).toBe('-geo.country');
  47. });
  48. it('does not convert aggregates to aliased format', function () {
  49. const mockState: WidgetBuilderState = {
  50. query: ['transaction.duration:>100', 'transaction.duration:>50'],
  51. sort: [{field: 'count()', kind: 'desc'}],
  52. };
  53. const widget = convertBuilderStateToWidget(mockState);
  54. expect(widget.queries[0]!.orderby).toBe('-count()');
  55. expect(widget.queries[1]!.orderby).toBe('-count()');
  56. });
  57. it('adds aliases to the widget queries', function () {
  58. const mockState: WidgetBuilderState = {
  59. fields: [
  60. {field: 'geo.country', alias: 'test', kind: FieldValueKind.FIELD},
  61. {field: 'geo.country', alias: undefined, kind: FieldValueKind.FIELD},
  62. {field: 'geo.country', alias: 'another one', kind: FieldValueKind.FIELD},
  63. ],
  64. };
  65. const widget = convertBuilderStateToWidget(mockState);
  66. expect(widget.queries[0]!.fieldAliases).toEqual(['test', '', 'another one']);
  67. });
  68. it('adds legend aliases to the widget queries', function () {
  69. const mockState: WidgetBuilderState = {
  70. legendAlias: ['test', 'test2'],
  71. query: ['transaction.duration:>100', 'transaction.duration:>50'],
  72. };
  73. const widget = convertBuilderStateToWidget(mockState);
  74. expect(widget.queries[0]!.name).toBe('test');
  75. expect(widget.queries[0]!.conditions).toBe('transaction.duration:>100');
  76. expect(widget.queries[1]!.name).toBe('test2');
  77. expect(widget.queries[1]!.conditions).toBe('transaction.duration:>50');
  78. });
  79. it('propagates the selected aggregate to the widget query', () => {
  80. const mockState: WidgetBuilderState = {
  81. selectedAggregate: 0,
  82. query: ['transaction.duration:>100'],
  83. };
  84. const widget = convertBuilderStateToWidget(mockState);
  85. expect(widget.queries[0]!.selectedAggregate).toBe(0);
  86. });
  87. it('sets selectedAggregate to undefined if not provided', () => {
  88. const mockState: WidgetBuilderState = {
  89. query: ['transaction.duration:>100'],
  90. };
  91. const widget = convertBuilderStateToWidget(mockState);
  92. expect(widget.queries[0]!.selectedAggregate).toBeUndefined();
  93. });
  94. it('applies the thresholds to the widget', () => {
  95. const mockState: WidgetBuilderState = {
  96. query: ['transaction.duration:>100'],
  97. thresholds: {
  98. max_values: {
  99. max1: 200,
  100. max2: 300,
  101. },
  102. unit: 'milliseconds',
  103. },
  104. };
  105. const widget = convertBuilderStateToWidget(mockState);
  106. expect(widget.thresholds).toEqual(mockState.thresholds);
  107. });
  108. it('uses the fields from widget state when displaying as a table', function () {
  109. const mockState: WidgetBuilderState = {
  110. fields: [
  111. {field: 'geo.country', kind: FieldValueKind.FIELD},
  112. {
  113. function: ['count', '', undefined, undefined],
  114. kind: FieldValueKind.FUNCTION,
  115. },
  116. ],
  117. displayType: DisplayType.TABLE,
  118. dataset: WidgetType.TRANSACTIONS,
  119. };
  120. const widget = convertBuilderStateToWidget(mockState);
  121. expect(widget.queries[0]!.fields).toEqual(['geo.country', 'count()']);
  122. });
  123. it('combines columns and aggregates into fields when producing the widget when not displayed as a table', function () {
  124. const mockState: WidgetBuilderState = {
  125. fields: [{field: 'geo.country', kind: FieldValueKind.FIELD}],
  126. yAxis: [
  127. {
  128. function: ['count', '', undefined, undefined],
  129. kind: FieldValueKind.FUNCTION,
  130. },
  131. ],
  132. displayType: DisplayType.LINE,
  133. dataset: WidgetType.TRANSACTIONS,
  134. };
  135. const widget = convertBuilderStateToWidget(mockState);
  136. expect(widget.queries[0]!.fields).toEqual(['geo.country', 'count()']);
  137. });
  138. it('ignores empty fields', function () {
  139. const mockState: WidgetBuilderState = {
  140. fields: [{field: '', kind: FieldValueKind.FIELD}],
  141. yAxis: [
  142. {function: ['count', '', undefined, undefined], kind: FieldValueKind.FUNCTION},
  143. ],
  144. };
  145. const widget = convertBuilderStateToWidget(mockState);
  146. expect(widget.queries[0]!.fields).toEqual(['count()']);
  147. expect(widget.queries[0]!.aggregates).toEqual(['count()']);
  148. expect(widget.queries[0]!.columns).toEqual([]);
  149. });
  150. it('ignores the sort state when producing a big number widget', function () {
  151. const mockState: WidgetBuilderState = {
  152. displayType: DisplayType.BIG_NUMBER,
  153. fields: [
  154. {function: ['count', '', undefined, undefined], kind: FieldValueKind.FUNCTION},
  155. ],
  156. dataset: WidgetType.TRANSACTIONS,
  157. query: ['transaction.duration:>100'],
  158. sort: [{field: 'count()', kind: 'desc'}],
  159. };
  160. const widget = convertBuilderStateToWidget(mockState);
  161. expect(widget.queries[0]!.orderby).toBe('');
  162. });
  163. });