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'); }); }); }); });