diff --git a/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx new file mode 100644 index 00000000000..c7074790d1e --- /dev/null +++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx @@ -0,0 +1,41 @@ +import { render, screen } from '@testing-library/react'; +import React, { ComponentProps } from 'react'; + +import { LokiDatasource } from '../datasource'; +import { LokiQuery } from '../types'; + +import LokiCheatSheet from './LokiCheatSheet'; + +const setup = () => { + const props: ComponentProps = { + datasource: { + languageProvider: { + started: true, + getLabelKeys: jest.fn().mockReturnValue(['job']), + fetchLabelValues: jest.fn().mockResolvedValue(['"grafana/data"']), + }, + } as unknown as LokiDatasource, + query: {} as unknown as LokiQuery, + onClickExample: jest.fn(), + }; + return props; +}; + +describe('Loki Cheat Sheet', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('escapes label values in examples', async () => { + const props = setup(); + render(); + jest.runAllTimers(); + + const streamSelector = await screen.findByText('{job="\\"grafana/data\\""}'); + expect(streamSelector).toBeInTheDocument(); + }); +}); diff --git a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx index 0f7a0b99dd1..689cef1fbdc 100644 --- a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx +++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx @@ -5,6 +5,7 @@ import { QueryEditorHelpProps } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import LokiLanguageProvider from '../LanguageProvider'; +import { escapeLabelValueInExactSelector } from '../languageUtils'; import { LokiQuery } from '../types'; const DEFAULT_EXAMPLES = ['{job="default/prometheus"}']; @@ -65,7 +66,7 @@ export default class LokiCheatSheet extends PureComponent `{${preferredLabel}="${value}"}`); + .map((value) => `{${preferredLabel}="${escapeLabelValueInExactSelector(value)}"}`); this.setState({ userExamples }); } } else { @@ -85,7 +86,7 @@ export default class LokiCheatSheet extends PureComponent onClick({ refId: 'A', expr })} + onClick={() => onClick({ refId: 'A', expr })} > {expr}