language_provider.test.ts 4.9 KB

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