useLokiSyntax.test.ts 2.7 KB

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