language_provider.test.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import Plain from 'slate-plain-serializer';
  2. import LanguageProvider from './language_provider';
  3. describe('Language completion provider', () => {
  4. const datasource = {
  5. metadataRequest: () => ({ data: { data: [] } }),
  6. };
  7. it('returns default suggestions on emtpty context', () => {
  8. const instance = new LanguageProvider(datasource);
  9. const result = instance.provideCompletionItems({ text: '', prefix: '', wrapperClasses: [] });
  10. expect(result.context).toBeUndefined();
  11. expect(result.refresher).toBeUndefined();
  12. expect(result.suggestions.length).toEqual(0);
  13. });
  14. describe('label suggestions', () => {
  15. it('returns default label suggestions on label context', () => {
  16. const instance = new LanguageProvider(datasource);
  17. const value = Plain.deserialize('{}');
  18. const range = value.selection.merge({
  19. anchorOffset: 1,
  20. });
  21. const valueWithSelection = value.change().select(range).value;
  22. const result = instance.provideCompletionItems({
  23. text: '',
  24. prefix: '',
  25. wrapperClasses: ['context-labels'],
  26. value: valueWithSelection,
  27. });
  28. expect(result.context).toBe('context-labels');
  29. expect(result.suggestions).toEqual([{ items: [{ label: 'job' }, { label: 'namespace' }], label: 'Labels' }]);
  30. });
  31. });
  32. });
  33. describe('Query imports', () => {
  34. const datasource = {
  35. metadataRequest: () => ({ data: { data: [] } }),
  36. };
  37. it('returns empty queries for unknown origin datasource', async () => {
  38. const instance = new LanguageProvider(datasource);
  39. const result = await instance.importQueries([{ refId: 'bar', expr: 'foo' }], 'unknown');
  40. expect(result).toEqual([{ refId: 'bar', expr: '' }]);
  41. });
  42. describe('prometheus query imports', () => {
  43. it('returns empty query from metric-only query', async () => {
  44. const instance = new LanguageProvider(datasource);
  45. const result = await instance.importPrometheusQuery('foo');
  46. expect(result).toEqual('');
  47. });
  48. it('returns empty query from selector query if label is not available', async () => {
  49. const datasourceWithLabels = {
  50. metadataRequest: url => (url === '/api/prom/label' ? { data: { data: ['other'] } } : { data: { data: [] } }),
  51. };
  52. const instance = new LanguageProvider(datasourceWithLabels);
  53. const result = await instance.importPrometheusQuery('{foo="bar"}');
  54. expect(result).toEqual('{}');
  55. });
  56. it('returns selector query from selector query with common labels', async () => {
  57. const datasourceWithLabels = {
  58. metadataRequest: url => (url === '/api/prom/label' ? { data: { data: ['foo'] } } : { data: { data: [] } }),
  59. };
  60. const instance = new LanguageProvider(datasourceWithLabels);
  61. const result = await instance.importPrometheusQuery('metric{foo="bar",baz="42"}');
  62. expect(result).toEqual('{foo="bar"}');
  63. });
  64. });
  65. });