query_ctrl.test.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import { StackdriverQueryCtrl } from '../query_ctrl';
  2. describe('StackdriverQueryCtrl', () => {
  3. let ctrl;
  4. let result;
  5. beforeEach(() => {
  6. ctrl = createCtrlWithFakes();
  7. });
  8. describe('group bys', () => {
  9. describe('when labels are fetched', () => {
  10. beforeEach(async () => {
  11. ctrl.metricLabels = { 'metric-key-1': ['metric-value-1'] };
  12. ctrl.resourceLabels = { 'resource-key-1': ['resource-value-1'] };
  13. result = await ctrl.getGroupBys();
  14. });
  15. it('should populate group bys segments', () => {
  16. expect(result.length).toBe(3);
  17. expect(result[0].value).toBe('metric.label.metric-key-1');
  18. expect(result[1].value).toBe('resource.label.resource-key-1');
  19. expect(result[2].value).toBe('-- remove group by --');
  20. });
  21. });
  22. describe('when a group by label is selected', () => {
  23. beforeEach(async () => {
  24. ctrl.metricLabels = {
  25. 'metric-key-1': ['metric-value-1'],
  26. 'metric-key-2': ['metric-value-2'],
  27. };
  28. ctrl.resourceLabels = {
  29. 'resource-key-1': ['resource-value-1'],
  30. 'resource-key-2': ['resource-value-2'],
  31. };
  32. ctrl.target.aggregation.groupBys = ['metric.label.metric-key-1', 'resource.label.resource-key-1'];
  33. result = await ctrl.getGroupBys();
  34. });
  35. it('should not be used to populate group bys segments', () => {
  36. expect(result.length).toBe(3);
  37. expect(result[0].value).toBe('metric.label.metric-key-2');
  38. expect(result[1].value).toBe('resource.label.resource-key-2');
  39. expect(result[2].value).toBe('-- remove group by --');
  40. });
  41. });
  42. describe('when a group by is selected', () => {
  43. beforeEach(() => {
  44. const removeSegment = { fake: true, value: '-- remove group by --' };
  45. const segment = { value: 'groupby1' };
  46. ctrl.groupBySegments = [segment, removeSegment];
  47. ctrl.groupByChanged(segment);
  48. });
  49. it('should be added to group bys list', () => {
  50. expect(ctrl.target.aggregation.groupBys.length).toBe(1);
  51. });
  52. });
  53. describe('when a selected group by is removed', () => {
  54. beforeEach(() => {
  55. const removeSegment = { fake: true, value: '-- remove group by --' };
  56. const segment = { value: 'groupby1' };
  57. ctrl.groupBySegments = [segment, removeSegment];
  58. ctrl.groupByChanged(removeSegment);
  59. });
  60. it('should be added to group bys list', () => {
  61. expect(ctrl.target.aggregation.groupBys.length).toBe(0);
  62. });
  63. });
  64. });
  65. describe('filters', () => {
  66. describe('when values for a condition filter part are fetched', () => {
  67. beforeEach(async () => {
  68. const segment = { type: 'condition' };
  69. result = await ctrl.getFilters(segment, 0);
  70. });
  71. it('should populate group bys segments', () => {
  72. expect(result.length).toBe(1);
  73. expect(result[0].value).toBe('AND');
  74. });
  75. });
  76. describe('when values for a operator filter part are fetched', () => {
  77. beforeEach(async () => {
  78. const segment = { type: 'operator' };
  79. result = await ctrl.getFilters(segment, 0);
  80. });
  81. it('should populate group bys segments', () => {
  82. expect(result.length).toBe(4);
  83. expect(result[0].value).toBe('=');
  84. expect(result[1].value).toBe('!=');
  85. expect(result[2].value).toBe('=~');
  86. expect(result[3].value).toBe('!=~');
  87. });
  88. });
  89. describe('when values for a key filter part are fetched', () => {
  90. beforeEach(async () => {
  91. ctrl.metricLabels = {
  92. 'metric-key-1': ['metric-value-1'],
  93. 'metric-key-2': ['metric-value-2'],
  94. };
  95. ctrl.resourceLabels = {
  96. 'resource-key-1': ['resource-value-1'],
  97. 'resource-key-2': ['resource-value-2'],
  98. };
  99. const segment = { type: 'key' };
  100. result = await ctrl.getFilters(segment, 0);
  101. });
  102. it('should populate group bys segments', () => {
  103. expect(result.length).toBe(5);
  104. expect(result[0].value).toBe('metric.label.metric-key-1');
  105. expect(result[1].value).toBe('metric.label.metric-key-2');
  106. expect(result[2].value).toBe('resource.label.resource-key-1');
  107. expect(result[3].value).toBe('resource.label.resource-key-2');
  108. expect(result[4].value).toBe('-- remove filter --');
  109. });
  110. });
  111. describe('when values for a value filter part are fetched', () => {
  112. beforeEach(async () => {
  113. ctrl.metricLabels = {
  114. 'metric-key-1': ['metric-value-1'],
  115. 'metric-key-2': ['metric-value-2'],
  116. };
  117. ctrl.resourceLabels = {
  118. 'resource-key-1': ['resource-value-1'],
  119. 'resource-key-2': ['resource-value-2'],
  120. };
  121. ctrl.filterSegments = [{ type: 'key', value: 'metric-key-1' }, { type: 'operator', value: '=' }];
  122. const segment = { type: 'value' };
  123. result = await ctrl.getFilters(segment, 2);
  124. });
  125. it('should populate group bys segments', () => {
  126. expect(result.length).toBe(1);
  127. expect(result[0].value).toBe('metric-value-1');
  128. });
  129. });
  130. });
  131. });
  132. function createCtrlWithFakes() {
  133. StackdriverQueryCtrl.prototype.panelCtrl = {
  134. events: { on: () => {} },
  135. panel: { scopedVars: [], targets: [] },
  136. refresh: () => {},
  137. };
  138. StackdriverQueryCtrl.prototype.target = createTarget();
  139. StackdriverQueryCtrl.prototype.getMetricTypes = () => {
  140. return Promise.resolve();
  141. };
  142. StackdriverQueryCtrl.prototype.getLabels = () => {
  143. return Promise.resolve();
  144. };
  145. const fakeSegmentServer = {
  146. newSegment: obj => {
  147. return { value: obj.value ? obj.value : obj };
  148. },
  149. newOperators: ops => {
  150. return ops.map(o => {
  151. return { type: 'operator', value: o, text: o };
  152. });
  153. },
  154. newPlusButton: () => {},
  155. };
  156. return new StackdriverQueryCtrl(null, null, fakeSegmentServer, null);
  157. }
  158. function createTarget() {
  159. return {
  160. project: {
  161. id: '',
  162. name: '',
  163. },
  164. metricType: 'ametric',
  165. refId: 'A',
  166. aggregation: {
  167. crossSeriesReducer: '',
  168. alignmentPeriod: '',
  169. perSeriesAligner: '',
  170. groupBys: [],
  171. },
  172. filters: [],
  173. };
  174. }