|
@@ -198,5 +198,76 @@ describe('Language completion provider', () => {
|
|
|
expect(result.context).toBe('context-aggregation');
|
|
expect(result.context).toBe('context-aggregation');
|
|
|
expect(result.suggestions).toEqual([{ items: [{ label: 'bar' }], label: 'Labels' }]);
|
|
expect(result.suggestions).toEqual([{ items: [{ label: 'bar' }], label: 'Labels' }]);
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ it('returns label suggestions inside a multi-line aggregation context', () => {
|
|
|
|
|
+ const instance = new LanguageProvider(datasource, {
|
|
|
|
|
+ labelKeys: { '{__name__="metric"}': ['label1', 'label2', 'label3'] },
|
|
|
|
|
+ });
|
|
|
|
|
+ const value = Plain.deserialize('sum(\nmetric\n)\nby ()');
|
|
|
|
|
+ const aggregationTextBlock = value.document.getBlocksAsArray()[3];
|
|
|
|
|
+ const range = value.selection.moveToStartOf(aggregationTextBlock).merge({ anchorOffset: 4 });
|
|
|
|
|
+ const valueWithSelection = value.change().select(range).value;
|
|
|
|
|
+ const result = instance.provideCompletionItems({
|
|
|
|
|
+ text: '',
|
|
|
|
|
+ prefix: '',
|
|
|
|
|
+ wrapperClasses: ['context-aggregation'],
|
|
|
|
|
+ value: valueWithSelection,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(result.context).toBe('context-aggregation');
|
|
|
|
|
+ expect(result.suggestions).toEqual([
|
|
|
|
|
+ {
|
|
|
|
|
+ items: [{ label: 'label1' }, { label: 'label2' }, { label: 'label3' }],
|
|
|
|
|
+ label: 'Labels',
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('returns label suggestions inside an aggregation context with a range vector', () => {
|
|
|
|
|
+ const instance = new LanguageProvider(datasource, {
|
|
|
|
|
+ labelKeys: { '{__name__="metric"}': ['label1', 'label2', 'label3'] },
|
|
|
|
|
+ });
|
|
|
|
|
+ const value = Plain.deserialize('sum(rate(metric[1h])) by ()');
|
|
|
|
|
+ const range = value.selection.merge({
|
|
|
|
|
+ anchorOffset: 26,
|
|
|
|
|
+ });
|
|
|
|
|
+ const valueWithSelection = value.change().select(range).value;
|
|
|
|
|
+ const result = instance.provideCompletionItems({
|
|
|
|
|
+ text: '',
|
|
|
|
|
+ prefix: '',
|
|
|
|
|
+ wrapperClasses: ['context-aggregation'],
|
|
|
|
|
+ value: valueWithSelection,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(result.context).toBe('context-aggregation');
|
|
|
|
|
+ expect(result.suggestions).toEqual([
|
|
|
|
|
+ {
|
|
|
|
|
+ items: [{ label: 'label1' }, { label: 'label2' }, { label: 'label3' }],
|
|
|
|
|
+ label: 'Labels',
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('returns label suggestions inside an aggregation context with a range vector and label', () => {
|
|
|
|
|
+ const instance = new LanguageProvider(datasource, {
|
|
|
|
|
+ labelKeys: { '{__name__="metric",label1="value"}': ['label1', 'label2', 'label3'] },
|
|
|
|
|
+ });
|
|
|
|
|
+ const value = Plain.deserialize('sum(rate(metric{label1="value"}[1h])) by ()');
|
|
|
|
|
+ const range = value.selection.merge({
|
|
|
|
|
+ anchorOffset: 42,
|
|
|
|
|
+ });
|
|
|
|
|
+ const valueWithSelection = value.change().select(range).value;
|
|
|
|
|
+ const result = instance.provideCompletionItems({
|
|
|
|
|
+ text: '',
|
|
|
|
|
+ prefix: '',
|
|
|
|
|
+ wrapperClasses: ['context-aggregation'],
|
|
|
|
|
+ value: valueWithSelection,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(result.context).toBe('context-aggregation');
|
|
|
|
|
+ expect(result.suggestions).toEqual([
|
|
|
|
|
+ {
|
|
|
|
|
+ items: [{ label: 'label1' }, { label: 'label2' }, { label: 'label3' }],
|
|
|
|
|
+ label: 'Labels',
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|