influx_query.jest.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. import InfluxQuery from "../influx_query";
  2. describe("InfluxQuery", function() {
  3. var templateSrv = { replace: val => val };
  4. describe("render series with mesurement only", function() {
  5. it("should generate correct query", function() {
  6. var query = new InfluxQuery(
  7. {
  8. measurement: "cpu"
  9. },
  10. templateSrv,
  11. {}
  12. );
  13. var queryText = query.render();
  14. expect(queryText).toBe(
  15. 'SELECT mean("value") FROM "cpu" WHERE $timeFilter GROUP BY time($__interval) fill(null)'
  16. );
  17. });
  18. });
  19. describe("render series with policy only", function() {
  20. it("should generate correct query", function() {
  21. var query = new InfluxQuery(
  22. {
  23. measurement: "cpu",
  24. policy: "5m_avg"
  25. },
  26. templateSrv,
  27. {}
  28. );
  29. var queryText = query.render();
  30. expect(queryText).toBe(
  31. 'SELECT mean("value") FROM "5m_avg"."cpu" WHERE $timeFilter GROUP BY time($__interval) fill(null)'
  32. );
  33. });
  34. });
  35. describe("render series with math and alias", function() {
  36. it("should generate correct query", function() {
  37. var query = new InfluxQuery(
  38. {
  39. measurement: "cpu",
  40. select: [
  41. [
  42. { type: "field", params: ["value"] },
  43. { type: "mean", params: [] },
  44. { type: "math", params: ["/100"] },
  45. { type: "alias", params: ["text"] }
  46. ]
  47. ]
  48. },
  49. templateSrv,
  50. {}
  51. );
  52. var queryText = query.render();
  53. expect(queryText).toBe(
  54. 'SELECT mean("value") /100 AS "text" FROM "cpu" WHERE $timeFilter GROUP BY time($__interval) fill(null)'
  55. );
  56. });
  57. });
  58. describe("series with single tag only", function() {
  59. it("should generate correct query", function() {
  60. var query = new InfluxQuery(
  61. {
  62. measurement: "cpu",
  63. groupBy: [{ type: "time", params: ["auto"] }],
  64. tags: [{ key: "hostname", value: "server\\1" }]
  65. },
  66. templateSrv,
  67. {}
  68. );
  69. var queryText = query.render();
  70. expect(queryText).toBe(
  71. 'SELECT mean("value") FROM "cpu" WHERE ("hostname" = \'server\\\\1\') AND $timeFilter' +
  72. " GROUP BY time($__interval)"
  73. );
  74. });
  75. it("should switch regex operator with tag value is regex", function() {
  76. var query = new InfluxQuery(
  77. {
  78. measurement: "cpu",
  79. groupBy: [{ type: "time", params: ["auto"] }],
  80. tags: [{ key: "app", value: "/e.*/" }]
  81. },
  82. templateSrv,
  83. {}
  84. );
  85. var queryText = query.render();
  86. expect(queryText).toBe(
  87. 'SELECT mean("value") FROM "cpu" WHERE ("app" =~ /e.*/) AND $timeFilter GROUP BY time($__interval)'
  88. );
  89. });
  90. });
  91. describe("series with multiple tags only", function() {
  92. it("should generate correct query", function() {
  93. var query = new InfluxQuery(
  94. {
  95. measurement: "cpu",
  96. groupBy: [{ type: "time", params: ["auto"] }],
  97. tags: [
  98. { key: "hostname", value: "server1" },
  99. { key: "app", value: "email", condition: "AND" }
  100. ]
  101. },
  102. templateSrv,
  103. {}
  104. );
  105. var queryText = query.render();
  106. expect(queryText).toBe(
  107. 'SELECT mean("value") FROM "cpu" WHERE ("hostname" = \'server1\' AND "app" = \'email\') AND ' +
  108. "$timeFilter GROUP BY time($__interval)"
  109. );
  110. });
  111. });
  112. describe("series with tags OR condition", function() {
  113. it("should generate correct query", function() {
  114. var query = new InfluxQuery(
  115. {
  116. measurement: "cpu",
  117. groupBy: [{ type: "time", params: ["auto"] }],
  118. tags: [
  119. { key: "hostname", value: "server1" },
  120. { key: "hostname", value: "server2", condition: "OR" }
  121. ]
  122. },
  123. templateSrv,
  124. {}
  125. );
  126. var queryText = query.render();
  127. expect(queryText).toBe(
  128. 'SELECT mean("value") FROM "cpu" WHERE ("hostname" = \'server1\' OR "hostname" = \'server2\') AND ' +
  129. "$timeFilter GROUP BY time($__interval)"
  130. );
  131. });
  132. });
  133. describe("query with value condition", function() {
  134. it("should not quote value", function() {
  135. var query = new InfluxQuery(
  136. {
  137. measurement: "cpu",
  138. groupBy: [],
  139. tags: [{ key: "value", value: "5", operator: ">" }]
  140. },
  141. templateSrv,
  142. {}
  143. );
  144. var queryText = query.render();
  145. expect(queryText).toBe(
  146. 'SELECT mean("value") FROM "cpu" WHERE ("value" > 5) AND $timeFilter'
  147. );
  148. });
  149. });
  150. describe("series with groupByTag", function() {
  151. it("should generate correct query", function() {
  152. var query = new InfluxQuery(
  153. {
  154. measurement: "cpu",
  155. tags: [],
  156. groupBy: [
  157. { type: "time", interval: "auto" },
  158. { type: "tag", params: ["host"] }
  159. ]
  160. },
  161. templateSrv,
  162. {}
  163. );
  164. var queryText = query.render();
  165. expect(queryText).toBe(
  166. 'SELECT mean("value") FROM "cpu" WHERE $timeFilter GROUP BY time($__interval), "host"'
  167. );
  168. });
  169. });
  170. describe("render series without group by", function() {
  171. it("should generate correct query", function() {
  172. var query = new InfluxQuery(
  173. {
  174. measurement: "cpu",
  175. select: [[{ type: "field", params: ["value"] }]],
  176. groupBy: []
  177. },
  178. templateSrv,
  179. {}
  180. );
  181. var queryText = query.render();
  182. expect(queryText).toBe('SELECT "value" FROM "cpu" WHERE $timeFilter');
  183. });
  184. });
  185. describe("render series without group by and fill", function() {
  186. it("should generate correct query", function() {
  187. var query = new InfluxQuery(
  188. {
  189. measurement: "cpu",
  190. select: [[{ type: "field", params: ["value"] }]],
  191. groupBy: [{ type: "time" }, { type: "fill", params: ["0"] }]
  192. },
  193. templateSrv,
  194. {}
  195. );
  196. var queryText = query.render();
  197. expect(queryText).toBe(
  198. 'SELECT "value" FROM "cpu" WHERE $timeFilter GROUP BY time($__interval) fill(0)'
  199. );
  200. });
  201. });
  202. describe("when adding group by part", function() {
  203. it("should add tag before fill", function() {
  204. var query = new InfluxQuery(
  205. {
  206. measurement: "cpu",
  207. groupBy: [{ type: "time" }, { type: "fill" }]
  208. },
  209. templateSrv,
  210. {}
  211. );
  212. query.addGroupBy("tag(host)");
  213. expect(query.target.groupBy.length).toBe(3);
  214. expect(query.target.groupBy[1].type).toBe("tag");
  215. expect(query.target.groupBy[1].params[0]).toBe("host");
  216. expect(query.target.groupBy[2].type).toBe("fill");
  217. });
  218. it("should add tag last if no fill", function() {
  219. var query = new InfluxQuery(
  220. {
  221. measurement: "cpu",
  222. groupBy: []
  223. },
  224. templateSrv,
  225. {}
  226. );
  227. query.addGroupBy("tag(host)");
  228. expect(query.target.groupBy.length).toBe(1);
  229. expect(query.target.groupBy[0].type).toBe("tag");
  230. });
  231. });
  232. describe("when adding select part", function() {
  233. it("should add mean after after field", function() {
  234. var query = new InfluxQuery(
  235. {
  236. measurement: "cpu",
  237. select: [[{ type: "field", params: ["value"] }]]
  238. },
  239. templateSrv,
  240. {}
  241. );
  242. query.addSelectPart(query.selectModels[0], "mean");
  243. expect(query.target.select[0].length).toBe(2);
  244. expect(query.target.select[0][1].type).toBe("mean");
  245. });
  246. it("should replace sum by mean", function() {
  247. var query = new InfluxQuery(
  248. {
  249. measurement: "cpu",
  250. select: [[{ type: "field", params: ["value"] }, { type: "mean" }]]
  251. },
  252. templateSrv,
  253. {}
  254. );
  255. query.addSelectPart(query.selectModels[0], "sum");
  256. expect(query.target.select[0].length).toBe(2);
  257. expect(query.target.select[0][1].type).toBe("sum");
  258. });
  259. it("should add math before alias", function() {
  260. var query = new InfluxQuery(
  261. {
  262. measurement: "cpu",
  263. select: [
  264. [
  265. { type: "field", params: ["value"] },
  266. { type: "mean" },
  267. { type: "alias" }
  268. ]
  269. ]
  270. },
  271. templateSrv,
  272. {}
  273. );
  274. query.addSelectPart(query.selectModels[0], "math");
  275. expect(query.target.select[0].length).toBe(4);
  276. expect(query.target.select[0][2].type).toBe("math");
  277. });
  278. it("should add math last", function() {
  279. var query = new InfluxQuery(
  280. {
  281. measurement: "cpu",
  282. select: [[{ type: "field", params: ["value"] }, { type: "mean" }]]
  283. },
  284. templateSrv,
  285. {}
  286. );
  287. query.addSelectPart(query.selectModels[0], "math");
  288. expect(query.target.select[0].length).toBe(3);
  289. expect(query.target.select[0][2].type).toBe("math");
  290. });
  291. it("should replace math", function() {
  292. var query = new InfluxQuery(
  293. {
  294. measurement: "cpu",
  295. select: [
  296. [
  297. { type: "field", params: ["value"] },
  298. { type: "mean" },
  299. { type: "math" }
  300. ]
  301. ]
  302. },
  303. templateSrv,
  304. {}
  305. );
  306. query.addSelectPart(query.selectModels[0], "math");
  307. expect(query.target.select[0].length).toBe(3);
  308. expect(query.target.select[0][2].type).toBe("math");
  309. });
  310. it("should add math when one only query part", function() {
  311. var query = new InfluxQuery(
  312. {
  313. measurement: "cpu",
  314. select: [[{ type: "field", params: ["value"] }]]
  315. },
  316. templateSrv,
  317. {}
  318. );
  319. query.addSelectPart(query.selectModels[0], "math");
  320. expect(query.target.select[0].length).toBe(2);
  321. expect(query.target.select[0][1].type).toBe("math");
  322. });
  323. describe("when render adhoc filters", function() {
  324. it("should generate correct query segment", function() {
  325. var query = new InfluxQuery({ measurement: "cpu" }, templateSrv, {});
  326. var queryText = query.renderAdhocFilters([
  327. { key: "key1", operator: "=", value: "value1" },
  328. { key: "key2", operator: "!=", value: "value2" }
  329. ]);
  330. expect(queryText).toBe("\"key1\" = 'value1' AND \"key2\" != 'value2'");
  331. });
  332. });
  333. });
  334. });