|
|
|
@ -4,111 +4,115 @@ 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 sessionData = { |
|
|
|
|
currentToken: {}, |
|
|
|
|
tokens: [], |
|
|
|
|
line: '' |
|
|
|
|
}; |
|
|
|
|
let session = { |
|
|
|
|
getTokenAt: sinon.stub().returns(sessionData.currentToken), |
|
|
|
|
getTokens: sinon.stub().returns(sessionData.tokens), |
|
|
|
|
getLine: sinon.stub().returns(sessionData.line), |
|
|
|
|
}; |
|
|
|
|
let editor = { session: session }; |
|
|
|
|
|
|
|
|
|
let editor = {}; |
|
|
|
|
let datasourceStub = <PrometheusDatasource>{ |
|
|
|
|
performInstantQuery: sinon.stub().withArgs({ expr: '{__name__="node_cpu"' }).returns(Promise.resolve( |
|
|
|
|
[ |
|
|
|
|
{ |
|
|
|
|
metric: { |
|
|
|
|
job: 'node', |
|
|
|
|
instance: 'localhost:9100' |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
] |
|
|
|
|
)), |
|
|
|
|
performSuggestQuery: sinon.stub().withArgs('node', true).returns(Promise.resolve( |
|
|
|
|
[ |
|
|
|
|
'node_cpu' |
|
|
|
|
] |
|
|
|
|
)) |
|
|
|
|
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", () => { |
|
|
|
|
let completer = new PromCompleter(datasourceStub); |
|
|
|
|
|
|
|
|
|
it("Should return range vectors", () => { |
|
|
|
|
completer.getCompletions(editor, session, { row: 0, column: 10 }, '[', (s, res) => { |
|
|
|
|
describe('When inside brackets', () => { |
|
|
|
|
it('Should return range vectors', () => { |
|
|
|
|
const session = getSessionStub({ |
|
|
|
|
currentToken: {}, |
|
|
|
|
tokens: [], |
|
|
|
|
line: '', |
|
|
|
|
}); |
|
|
|
|
completer.getCompletions(editor, session, {row: 0, column: 10}, '[', (s, res) => { |
|
|
|
|
expect(res[0]).to.eql({caption: '1s', value: '[1s', meta: 'range vector'}); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
describe("When inside label matcher, and located at label name", () => { |
|
|
|
|
sessionData = { |
|
|
|
|
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}' |
|
|
|
|
}; |
|
|
|
|
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}', |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it("Should return label name list", () => { |
|
|
|
|
completer.getCompletions(editor, session, { row: 0, column: 10 }, 'j', (s, res) => { |
|
|
|
|
expect(res[0]).to.eql({caption: 'job', value: 'job', meta: 'label name'}); |
|
|
|
|
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", () => { |
|
|
|
|
sessionData = { |
|
|
|
|
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}' |
|
|
|
|
}; |
|
|
|
|
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}', |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it("Should return label name list", () => { |
|
|
|
|
completer.getCompletions(editor, session, { row: 0, column: 23 }, 'j', (s, res) => { |
|
|
|
|
expect(res[0]).to.eql({caption: 'job', value: 'job', meta: 'label name'}); |
|
|
|
|
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", () => { |
|
|
|
|
sessionData = { |
|
|
|
|
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"}' |
|
|
|
|
}; |
|
|
|
|
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"}', |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it("Should return label value list", () => { |
|
|
|
|
completer.getCompletions(editor, session, { row: 0, column: 15 }, 'n', (s, res) => { |
|
|
|
|
expect(res[0]).to.eql({caption: 'node', value: 'node', meta: 'label value'}); |
|
|
|
|
return completer.getCompletions(editor, session, {row: 0, column: 15}, 'n', (s, res) => { |
|
|
|
|
expect(res[0].meta).to.eql('label value'); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|