query_ctrl.test.ts 12 KB

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