datasource.test.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import StackdriverDataSource from '../datasource';
  2. import { metricDescriptors } from './testData';
  3. import moment from 'moment';
  4. import { TemplateSrvStub } from 'test/specs/helpers';
  5. describe('StackdriverDataSource', () => {
  6. const instanceSettings = {
  7. jsonData: {
  8. projectName: 'testproject',
  9. },
  10. };
  11. const templateSrv = new TemplateSrvStub();
  12. describe('when performing testDataSource', () => {
  13. describe('and call to stackdriver api succeeds', () => {
  14. let ds;
  15. let result;
  16. beforeEach(async () => {
  17. const backendSrv = {
  18. async datasourceRequest() {
  19. return Promise.resolve({ status: 200 });
  20. },
  21. };
  22. ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv);
  23. result = await ds.testDatasource();
  24. });
  25. it('should return successfully', () => {
  26. expect(result.status).toBe('success');
  27. });
  28. });
  29. describe('and a list of metricDescriptors are returned', () => {
  30. let ds;
  31. let result;
  32. beforeEach(async () => {
  33. const backendSrv = {
  34. datasourceRequest: async () => Promise.resolve({ status: 200, data: metricDescriptors }),
  35. };
  36. ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv);
  37. result = await ds.testDatasource();
  38. });
  39. it('should return status success', () => {
  40. expect(result.status).toBe('success');
  41. });
  42. });
  43. describe('and call to stackdriver api fails with 400 error', () => {
  44. let ds;
  45. let result;
  46. beforeEach(async () => {
  47. const backendSrv = {
  48. datasourceRequest: async () =>
  49. Promise.reject({
  50. statusText: 'Bad Request',
  51. data: { error: { code: 400, message: 'Field interval.endTime had an invalid value' } },
  52. }),
  53. };
  54. ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv);
  55. result = await ds.testDatasource();
  56. });
  57. it('should return error status and a detailed error message', () => {
  58. expect(result.status).toEqual('error');
  59. expect(result.message).toBe('Stackdriver: Bad Request: 400. Field interval.endTime had an invalid value');
  60. });
  61. });
  62. });
  63. describe('when performing getProjects', () => {
  64. describe('and call to resource manager api succeeds', () => {
  65. let ds;
  66. let result;
  67. beforeEach(async () => {
  68. const response = {
  69. projects: [
  70. {
  71. projectNumber: '853996325002',
  72. projectId: 'test-project',
  73. lifecycleState: 'ACTIVE',
  74. name: 'Test Project',
  75. createTime: '2015-06-02T14:16:08.520Z',
  76. parent: {
  77. type: 'organization',
  78. id: '853996325002',
  79. },
  80. },
  81. ],
  82. };
  83. const backendSrv = {
  84. async datasourceRequest() {
  85. return Promise.resolve({ status: 200, data: response });
  86. },
  87. };
  88. ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv);
  89. result = await ds.getProjects();
  90. });
  91. it('should return successfully', () => {
  92. expect(result.length).toBe(1);
  93. expect(result[0].id).toBe('test-project');
  94. expect(result[0].name).toBe('Test Project');
  95. });
  96. });
  97. });
  98. describe('When performing query', () => {
  99. const options = {
  100. range: {
  101. from: moment.utc('2017-08-22T20:00:00Z'),
  102. to: moment.utc('2017-08-22T23:59:00Z'),
  103. },
  104. rangeRaw: {
  105. from: 'now-4h',
  106. to: 'now',
  107. },
  108. targets: [
  109. {
  110. refId: 'A',
  111. aggregation: {},
  112. },
  113. ],
  114. };
  115. describe('and no time series data is returned', () => {
  116. let ds;
  117. const response = {
  118. results: {
  119. A: {
  120. refId: 'A',
  121. meta: {
  122. rawQuery: 'arawquerystring',
  123. },
  124. series: null,
  125. tables: null,
  126. },
  127. },
  128. };
  129. beforeEach(() => {
  130. const backendSrv = {
  131. datasourceRequest: async () => Promise.resolve({ status: 200, data: response }),
  132. };
  133. ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv);
  134. });
  135. it('should return a list of datapoints', () => {
  136. return ds.query(options).then(results => {
  137. expect(results.data.length).toBe(0);
  138. });
  139. });
  140. });
  141. });
  142. describe('when performing getMetricTypes', () => {
  143. describe('and call to stackdriver api succeeds', () => {});
  144. let ds;
  145. let result;
  146. beforeEach(async () => {
  147. const backendSrv = {
  148. async datasourceRequest() {
  149. return Promise.resolve({
  150. data: {
  151. metricDescriptors: [
  152. {
  153. displayName: 'test metric name 1',
  154. type: 'test metric type 1',
  155. },
  156. {
  157. displayName: 'test metric name 2',
  158. type: 'test metric type 2',
  159. },
  160. ],
  161. },
  162. });
  163. },
  164. };
  165. ds = new StackdriverDataSource(instanceSettings, backendSrv, templateSrv);
  166. result = await ds.getMetricTypes();
  167. });
  168. it('should return successfully', () => {
  169. expect(result.length).toBe(2);
  170. expect(result[0].id).toBe('test metric type 1');
  171. expect(result[0].name).toBe('test metric name 1');
  172. });
  173. });
  174. describe('when interpolating a template variable for group bys', () => {
  175. let interpolated;
  176. describe('and is single value variable', () => {
  177. beforeEach(() => {
  178. templateSrv.data = {
  179. test: 'groupby1',
  180. };
  181. const ds = new StackdriverDataSource(instanceSettings, {}, templateSrv);
  182. interpolated = ds.interpolateGroupBys(['[[test]]'], {});
  183. });
  184. it('should replace the variable with the value', () => {
  185. expect(interpolated.length).toBe(1);
  186. expect(interpolated[0]).toBe('groupby1');
  187. });
  188. });
  189. describe('and is multi value variable', () => {
  190. beforeEach(() => {
  191. templateSrv.data = {
  192. test: 'groupby1,groupby2',
  193. };
  194. const ds = new StackdriverDataSource(instanceSettings, {}, templateSrv);
  195. interpolated = ds.interpolateGroupBys(['[[test]]'], {});
  196. });
  197. it('should replace the variable with an array of group bys', () => {
  198. expect(interpolated.length).toBe(2);
  199. expect(interpolated[0]).toBe('groupby1');
  200. expect(interpolated[1]).toBe('groupby2');
  201. });
  202. });
  203. });
  204. });