query_ctrl.test.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. jest.mock('./css/query_editor.css', () => {
  2. return {};
  3. });
  4. import { AzureMonitorQueryCtrl } from './query_ctrl';
  5. import Q from 'q';
  6. import { TemplateSrv } from 'app/features/templating/template_srv';
  7. describe('AzureMonitorQueryCtrl', () => {
  8. let queryCtrl: any;
  9. beforeEach(() => {
  10. AzureMonitorQueryCtrl.prototype.panelCtrl = {
  11. events: { on: () => {} },
  12. panel: { scopedVars: [], targets: [] },
  13. };
  14. AzureMonitorQueryCtrl.prototype.target = {} as any;
  15. AzureMonitorQueryCtrl.prototype.datasource = {
  16. $q: Q,
  17. appInsightsDatasource: { isConfigured: () => false },
  18. azureMonitorDatasource: { isConfigured: () => false },
  19. };
  20. queryCtrl = new AzureMonitorQueryCtrl({}, {}, new TemplateSrv());
  21. });
  22. describe('init query_ctrl variables', () => {
  23. it('should set default query type to Azure Monitor', () => {
  24. expect(queryCtrl.target.queryType).toBe('Azure Monitor');
  25. });
  26. it('should set default App Insights editor to be builder', () => {
  27. expect(queryCtrl.target.appInsights.rawQuery).toBe(false);
  28. });
  29. it('should set query parts to select', () => {
  30. expect(queryCtrl.target.azureMonitor.resourceGroup).toBe('select');
  31. expect(queryCtrl.target.azureMonitor.metricDefinition).toBe('select');
  32. expect(queryCtrl.target.azureMonitor.resourceName).toBe('select');
  33. expect(queryCtrl.target.azureMonitor.metricName).toBe('select');
  34. expect(queryCtrl.target.appInsights.groupBy).toBe('none');
  35. });
  36. });
  37. describe('when the query type is Azure Monitor', () => {
  38. describe('and getOptions for the Resource Group dropdown is called', () => {
  39. const response = [{ text: 'nodeapp', value: 'nodeapp' }, { text: 'otherapp', value: 'otherapp' }];
  40. beforeEach(() => {
  41. queryCtrl.datasource.getResourceGroups = () => {
  42. return queryCtrl.datasource.$q.when(response);
  43. };
  44. queryCtrl.datasource.azureMonitorDatasource = {
  45. isConfigured: () => {
  46. return true;
  47. },
  48. };
  49. });
  50. it('should return a list of Resource Groups', () => {
  51. return queryCtrl.getResourceGroups('').then(result => {
  52. expect(result[0].text).toBe('nodeapp');
  53. });
  54. });
  55. });
  56. describe('when getOptions for the Metric Definition dropdown is called', () => {
  57. describe('and resource group has a value', () => {
  58. const response = [
  59. { text: 'Microsoft.Compute/virtualMachines', value: 'Microsoft.Compute/virtualMachines' },
  60. { text: 'Microsoft.Network/publicIPAddresses', value: 'Microsoft.Network/publicIPAddresses' },
  61. ];
  62. beforeEach(() => {
  63. queryCtrl.target.subscription = 'sub1';
  64. queryCtrl.target.azureMonitor.resourceGroup = 'test';
  65. queryCtrl.datasource.getMetricDefinitions = function(subscriptionId, query) {
  66. expect(subscriptionId).toBe('sub1');
  67. expect(query).toBe('test');
  68. return this.$q.when(response);
  69. };
  70. });
  71. it('should return a list of Metric Definitions', () => {
  72. return queryCtrl.getMetricDefinitions('').then(result => {
  73. expect(result[0].text).toBe('Microsoft.Compute/virtualMachines');
  74. expect(result[1].text).toBe('Microsoft.Network/publicIPAddresses');
  75. });
  76. });
  77. });
  78. describe('and resource group has no value', () => {
  79. beforeEach(() => {
  80. queryCtrl.target.azureMonitor.resourceGroup = 'select';
  81. });
  82. it('should return without making a call to datasource', () => {
  83. expect(queryCtrl.getMetricDefinitions('')).toBe(undefined);
  84. });
  85. });
  86. });
  87. describe('when getOptions for the ResourceNames dropdown is called', () => {
  88. describe('and resourceGroup and metricDefinition have values', () => {
  89. const response = [{ text: 'test1', value: 'test1' }, { text: 'test2', value: 'test2' }];
  90. beforeEach(() => {
  91. queryCtrl.target.subscription = 'sub1';
  92. queryCtrl.target.azureMonitor.resourceGroup = 'test';
  93. queryCtrl.target.azureMonitor.metricDefinition = 'Microsoft.Compute/virtualMachines';
  94. queryCtrl.datasource.getResourceNames = function(subscriptionId, resourceGroup, metricDefinition) {
  95. expect(subscriptionId).toBe('sub1');
  96. expect(resourceGroup).toBe('test');
  97. expect(metricDefinition).toBe('Microsoft.Compute/virtualMachines');
  98. return this.$q.when(response);
  99. };
  100. });
  101. it('should return a list of Resource Names', () => {
  102. return queryCtrl.getResourceNames('').then(result => {
  103. expect(result[0].text).toBe('test1');
  104. expect(result[1].text).toBe('test2');
  105. });
  106. });
  107. });
  108. describe('and resourceGroup and metricDefinition do not have values', () => {
  109. beforeEach(() => {
  110. queryCtrl.target.azureMonitor.resourceGroup = 'select';
  111. queryCtrl.target.azureMonitor.metricDefinition = 'select';
  112. });
  113. it('should return without making a call to datasource', () => {
  114. expect(queryCtrl.getResourceNames('')).toBe(undefined);
  115. });
  116. });
  117. });
  118. describe('when getOptions for the Metric Names dropdown is called', () => {
  119. describe('and resourceGroup, metricDefinition and resourceName have values', () => {
  120. const response = [{ text: 'metric1', value: 'metric1' }, { text: 'metric2', value: 'metric2' }];
  121. beforeEach(() => {
  122. queryCtrl.target.subscription = 'sub1';
  123. queryCtrl.target.azureMonitor.resourceGroup = 'test';
  124. queryCtrl.target.azureMonitor.metricDefinition = 'Microsoft.Compute/virtualMachines';
  125. queryCtrl.target.azureMonitor.resourceName = 'test';
  126. queryCtrl.datasource.getMetricNames = function(
  127. subscriptionId,
  128. resourceGroup,
  129. metricDefinition,
  130. resourceName
  131. ) {
  132. expect(subscriptionId).toBe('sub1');
  133. expect(resourceGroup).toBe('test');
  134. expect(metricDefinition).toBe('Microsoft.Compute/virtualMachines');
  135. expect(resourceName).toBe('test');
  136. return this.$q.when(response);
  137. };
  138. });
  139. it('should return a list of Metric Names', () => {
  140. return queryCtrl.getMetricNames('').then(result => {
  141. expect(result[0].text).toBe('metric1');
  142. expect(result[1].text).toBe('metric2');
  143. });
  144. });
  145. });
  146. describe('and resourceGroup, metricDefinition and resourceName do not have values', () => {
  147. beforeEach(() => {
  148. queryCtrl.target.azureMonitor.resourceGroup = 'select';
  149. queryCtrl.target.azureMonitor.metricDefinition = 'select';
  150. queryCtrl.target.azureMonitor.resourceName = 'select';
  151. });
  152. it('should return without making a call to datasource', () => {
  153. expect(queryCtrl.getMetricNames('')).toBe(undefined);
  154. });
  155. });
  156. });
  157. describe('when onMetricNameChange is triggered for the Metric Names dropdown', () => {
  158. const response = {
  159. primaryAggType: 'Average',
  160. supportAggOptions: ['Average', 'Total'],
  161. supportedTimeGrains: ['PT1M', 'P1D'],
  162. dimensions: [],
  163. };
  164. beforeEach(() => {
  165. queryCtrl.target.azureMonitor.resourceGroup = 'test';
  166. queryCtrl.target.azureMonitor.metricDefinition = 'Microsoft.Compute/virtualMachines';
  167. queryCtrl.target.azureMonitor.resourceName = 'test';
  168. queryCtrl.target.azureMonitor.metricName = 'Percentage CPU';
  169. queryCtrl.datasource.getMetricMetadata = function(resourceGroup, metricDefinition, resourceName, metricName) {
  170. expect(resourceGroup).toBe('test');
  171. expect(metricDefinition).toBe('Microsoft.Compute/virtualMachines');
  172. expect(resourceName).toBe('test');
  173. expect(metricName).toBe('Percentage CPU');
  174. return this.$q.when(response);
  175. };
  176. });
  177. it('should set the options and default selected value for the Aggregations dropdown', () => {
  178. queryCtrl.onMetricNameChange().then(() => {
  179. expect(queryCtrl.target.azureMonitor.aggregation).toBe('Average');
  180. expect(queryCtrl.target.azureMonitor.aggOptions).toBe(['Average', 'Total']);
  181. expect(queryCtrl.target.azureMonitor.timeGrains).toBe(['PT1M', 'P1D']);
  182. });
  183. });
  184. });
  185. });
  186. describe('and query type is Application Insights', () => {
  187. describe('when getOptions for the Metric Names dropdown is called', () => {
  188. const response = [{ text: 'metric1', value: 'metric1' }, { text: 'metric2', value: 'metric2' }];
  189. beforeEach(() => {
  190. queryCtrl.datasource.appInsightsDatasource.isConfigured = () => true;
  191. queryCtrl.datasource.getAppInsightsMetricNames = () => {
  192. return queryCtrl.datasource.$q.when(response);
  193. };
  194. });
  195. it('should return a list of Metric Names', () => {
  196. return queryCtrl.getAppInsightsMetricNames().then(result => {
  197. expect(result[0].text).toBe('metric1');
  198. expect(result[1].text).toBe('metric2');
  199. });
  200. });
  201. });
  202. describe('when getOptions for the GroupBy segments dropdown is called', () => {
  203. beforeEach(() => {
  204. queryCtrl.target.appInsights.groupByOptions = ['opt1', 'opt2'];
  205. });
  206. it('should return a list of GroupBy segments', () => {
  207. const result = queryCtrl.getAppInsightsGroupBySegments('');
  208. expect(result[0].text).toBe('opt1');
  209. expect(result[0].value).toBe('opt1');
  210. expect(result[1].text).toBe('opt2');
  211. expect(result[1].value).toBe('opt2');
  212. });
  213. });
  214. describe('when onAppInsightsMetricNameChange is triggered for the Metric Names dropdown', () => {
  215. const response = {
  216. primaryAggType: 'avg',
  217. supportedAggTypes: ['avg', 'sum'],
  218. supportedGroupBy: ['client/os', 'client/city'],
  219. };
  220. beforeEach(() => {
  221. queryCtrl.target.appInsights.metricName = 'requests/failed';
  222. queryCtrl.datasource.getAppInsightsMetricMetadata = function(metricName) {
  223. expect(metricName).toBe('requests/failed');
  224. return this.$q.when(response);
  225. };
  226. });
  227. it('should set the options and default selected value for the Aggregations dropdown', () => {
  228. return queryCtrl.onAppInsightsMetricNameChange().then(() => {
  229. expect(queryCtrl.target.appInsights.aggregation).toBe('avg');
  230. expect(queryCtrl.target.appInsights.aggOptions).toContain('avg');
  231. expect(queryCtrl.target.appInsights.aggOptions).toContain('sum');
  232. expect(queryCtrl.target.appInsights.groupByOptions).toContain('client/os');
  233. expect(queryCtrl.target.appInsights.groupByOptions).toContain('client/city');
  234. });
  235. });
  236. });
  237. });
  238. });