useLokiSyntax.test.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { renderHook, act } from 'react-hooks-testing-library';
  2. import { DatasourceStatus } from '@grafana/ui/src/types/plugin';
  3. import LanguageProvider from 'app/plugins/datasource/loki/language_provider';
  4. import { useLokiSyntax } from './useLokiSyntax';
  5. import { CascaderOption } from 'app/plugins/datasource/loki/components/LokiQueryFieldForm';
  6. describe('useLokiSyntax hook', () => {
  7. const datasource = {
  8. metadataRequest: () => ({ data: { data: [] as any[] } }),
  9. };
  10. const languageProvider = new LanguageProvider(datasource);
  11. const logLabelOptionsMock = ['Holy mock!'];
  12. const logLabelOptionsMock2 = ['Mock the hell?!'];
  13. const logLabelOptionsMock3 = ['Oh my mock!'];
  14. languageProvider.refreshLogLabels = () => {
  15. languageProvider.logLabelOptions = logLabelOptionsMock;
  16. return Promise.resolve();
  17. };
  18. languageProvider.fetchLogLabels = () => {
  19. languageProvider.logLabelOptions = logLabelOptionsMock2;
  20. return Promise.resolve([]);
  21. };
  22. const activeOptionMock: CascaderOption = {
  23. label: '',
  24. value: '',
  25. };
  26. it('should provide Loki syntax when used', async () => {
  27. const { result, waitForNextUpdate } = renderHook(() => useLokiSyntax(languageProvider, DatasourceStatus.Connected));
  28. expect(result.current.syntax).toEqual(null);
  29. await waitForNextUpdate();
  30. expect(result.current.syntax).toEqual(languageProvider.getSyntax());
  31. });
  32. it('should fetch labels on first call', async () => {
  33. const { result, waitForNextUpdate } = renderHook(() => useLokiSyntax(languageProvider, DatasourceStatus.Connected));
  34. expect(result.current.isSyntaxReady).toBeFalsy();
  35. expect(result.current.logLabelOptions).toEqual([]);
  36. await waitForNextUpdate();
  37. expect(result.current.isSyntaxReady).toBeTruthy();
  38. expect(result.current.logLabelOptions).toEqual(logLabelOptionsMock2);
  39. });
  40. it('should try to fetch missing options when active option changes', async () => {
  41. const { result, waitForNextUpdate } = renderHook(() => useLokiSyntax(languageProvider, DatasourceStatus.Connected));
  42. await waitForNextUpdate();
  43. expect(result.current.logLabelOptions).toEqual(logLabelOptionsMock2);
  44. languageProvider.fetchLabelValues = (key: string) => {
  45. languageProvider.logLabelOptions = logLabelOptionsMock3;
  46. return Promise.resolve();
  47. };
  48. act(() => result.current.setActiveOption([activeOptionMock]));
  49. await waitForNextUpdate();
  50. expect(result.current.logLabelOptions).toEqual(logLabelOptionsMock3);
  51. });
  52. });