import { describe, it, sinon, expect } from "test/lib/common"; import { PromCompleter } from "../completer"; import { PrometheusDatasource } from "../datasource"; describe("Prometheus editor completer", function() { function getSessionStub(data) { return { getTokenAt: sinon.stub().returns(data.currentToken), getTokens: sinon.stub().returns(data.tokens), getLine: sinon.stub().returns(data.line) }; } let editor = {}; let datasourceStub = { performInstantQuery: sinon .stub() .withArgs({ expr: '{__name__="node_cpu"' }) .returns( Promise.resolve({ data: { data: { result: [ { metric: { job: "node", instance: "localhost:9100" } } ] } } }) ), performSuggestQuery: sinon .stub() .withArgs("node", true) .returns(Promise.resolve(["node_cpu"])) }; let completer = new PromCompleter(datasourceStub); describe("When inside brackets", () => { it("Should return range vectors", () => { const session = getSessionStub({ currentToken: { type: "paren.lparen", value: "[", index: 2, start: 9 }, tokens: [ { type: "identifier", value: "node_cpu" }, { type: "paren.lparen", value: "[" } ], line: "node_cpu[" }); return completer.getCompletions( editor, session, { row: 0, column: 10 }, "[", (s, res) => { expect(res[0].caption).to.eql("1s"); expect(res[0].value).to.eql("[1s"); expect(res[0].meta).to.eql("range vector"); } ); }); }); describe("When inside label matcher, and located at label name", () => { it("Should return label name list", () => { const session = getSessionStub({ currentToken: { type: "entity.name.tag", value: "j", index: 2, start: 9 }, tokens: [ { type: "identifier", value: "node_cpu" }, { type: "paren.lparen", value: "{" }, { type: "entity.name.tag", value: "j", index: 2, start: 9 }, { type: "paren.rparen", value: "}" } ], line: "node_cpu{j}" }); return completer.getCompletions( editor, session, { row: 0, column: 10 }, "j", (s, res) => { expect(res[0].meta).to.eql("label name"); } ); }); }); describe("When inside label matcher, and located at label name with __name__ match", () => { it("Should return label name list", () => { const session = getSessionStub({ currentToken: { type: "entity.name.tag", value: "j", index: 5, start: 22 }, tokens: [ { type: "paren.lparen", value: "{" }, { type: "entity.name.tag", value: "__name__" }, { type: "keyword.operator", value: "=~" }, { type: "string.quoted", value: '"node_cpu"' }, { type: "punctuation.operator", value: "," }, { type: "entity.name.tag", value: "j", index: 5, start: 22 }, { type: "paren.rparen", value: "}" } ], line: '{__name__=~"node_cpu",j}' }); return completer.getCompletions( editor, session, { row: 0, column: 23 }, "j", (s, res) => { expect(res[0].meta).to.eql("label name"); } ); }); }); describe("When inside label matcher, and located at label value", () => { it("Should return label value list", () => { const session = getSessionStub({ currentToken: { type: "string.quoted", value: '"n"', index: 4, start: 13 }, tokens: [ { type: "identifier", value: "node_cpu" }, { type: "paren.lparen", value: "{" }, { type: "entity.name.tag", value: "job" }, { type: "keyword.operator", value: "=" }, { type: "string.quoted", value: '"n"', index: 4, start: 13 }, { type: "paren.rparen", value: "}" } ], line: 'node_cpu{job="n"}' }); return completer.getCompletions( editor, session, { row: 0, column: 15 }, "n", (s, res) => { expect(res[0].meta).to.eql("label value"); } ); }); }); });