useLokiSyntax.test.ts 2.3 KB

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