language_provider.test.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. describe('empty query suggestions', () => {
  8. it('returns default suggestions on emtpty context', () => {
  9. const instance = new LanguageProvider(datasource);
  10. const result = instance.provideCompletionItems({ text: '', prefix: '', wrapperClasses: [] });
  11. expect(result.context).toBeUndefined();
  12. expect(result.refresher).toBeUndefined();
  13. expect(result.suggestions.length).toEqual(0);
  14. });
  15. it('returns default suggestions with history on emtpty context when history was provided', () => {
  16. const instance = new LanguageProvider(datasource);
  17. const value = Plain.deserialize('');
  18. const history = [
  19. {
  20. query: { refId: '1', expr: '{app="foo"}' },
  21. },
  22. ];
  23. const result = instance.provideCompletionItems({ text: '', prefix: '', value, wrapperClasses: [] }, { history });
  24. expect(result.context).toBeUndefined();
  25. expect(result.refresher).toBeUndefined();
  26. expect(result.suggestions).toMatchObject([
  27. {
  28. label: 'History',
  29. items: [
  30. {
  31. label: '{app="foo"}',
  32. },
  33. ],
  34. },
  35. ]);
  36. });
  37. });
  38. describe('label suggestions', () => {
  39. it('returns default label suggestions on label context', () => {
  40. const instance = new LanguageProvider(datasource);
  41. const value = Plain.deserialize('{}');
  42. const range = value.selection.merge({
  43. anchorOffset: 1,
  44. });
  45. const valueWithSelection = value.change().select(range).value;
  46. const result = instance.provideCompletionItems({
  47. text: '',
  48. prefix: '',
  49. wrapperClasses: ['context-labels'],
  50. value: valueWithSelection,
  51. });
  52. expect(result.context).toBe('context-labels');
  53. expect(result.suggestions).toEqual([{ items: [{ label: 'job' }, { label: 'namespace' }], label: 'Labels' }]);
  54. });
  55. });
  56. });
  57. describe('Query imports', () => {
  58. const datasource = {
  59. metadataRequest: () => ({ data: { data: [] } }),
  60. };
  61. it('returns empty queries for unknown origin datasource', async () => {
  62. const instance = new LanguageProvider(datasource);
  63. const result = await instance.importQueries([{ refId: 'bar', expr: 'foo' }], 'unknown');
  64. expect(result).toEqual([{ refId: 'bar', expr: '' }]);
  65. });
  66. describe('prometheus query imports', () => {
  67. it('returns empty query from metric-only query', async () => {
  68. const instance = new LanguageProvider(datasource);
  69. const result = await instance.importPrometheusQuery('foo');
  70. expect(result).toEqual('');
  71. });
  72. it('returns empty query from selector query if label is not available', async () => {
  73. const datasourceWithLabels = {
  74. metadataRequest: url => (url === '/api/prom/label' ? { data: { data: ['other'] } } : { data: { data: [] } }),
  75. };
  76. const instance = new LanguageProvider(datasourceWithLabels);
  77. const result = await instance.importPrometheusQuery('{foo="bar"}');
  78. expect(result).toEqual('{}');
  79. });
  80. it('returns selector query from selector query with common labels', async () => {
  81. const datasourceWithLabels = {
  82. metadataRequest: url => (url === '/api/prom/label' ? { data: { data: ['foo'] } } : { data: { data: [] } }),
  83. };
  84. const instance = new LanguageProvider(datasourceWithLabels);
  85. const result = await instance.importPrometheusQuery('metric{foo="bar",baz="42"}');
  86. expect(result).toEqual('{foo="bar"}');
  87. });
  88. });
  89. });