import { screen, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React, { ComponentProps } from 'react'; import { DataFrame, DataSourceApi, DataSourcePluginMeta, FieldType, toDataFrame } from '@grafana/data'; import { QueryBuilderOperation, QueryBuilderOperationParamDef, } from 'app/plugins/datasource/prometheus/querybuilder/shared/types'; import { LokiDatasource } from '../../datasource'; import { LokiOperationId } from '../types'; import { UnwrapParamEditor } from './UnwrapParamEditor'; describe('UnwrapParamEditor', () => { it('shows value if value present', () => { const props = createProps({ value: 'unique' }); render(); expect(screen.getByText('unique')).toBeInTheDocument(); }); it('shows no label options if no samples are returned', async () => { const props = createProps(); render(); const input = screen.getByRole('combobox'); await userEvent.click(input); expect(screen.getByText('No labels found')).toBeInTheDocument(); }); it('shows no label options for non-metric query', async () => { const props = createProps({ query: { labels: [{ op: '=', label: 'foo', value: 'bar' }], operations: [ { id: LokiOperationId.Logfmt, params: [] }, { id: LokiOperationId.Unwrap, params: ['', ''] }, ], }, }); render(); const input = screen.getByRole('combobox'); await userEvent.click(input); expect(screen.getByText('No labels found')).toBeInTheDocument(); }); it('shows labels with unwrap-friendly values', async () => { const props = createProps({}, frames); render(); const input = screen.getByRole('combobox'); await userEvent.click(input); expect(await screen.findByText('status')).toBeInTheDocument(); expect(await screen.findByText('duration')).toBeInTheDocument(); }); }); const createProps = ( propsOverrides?: Partial>, mockedSample?: DataFrame[] ) => { const propsDefault = { value: undefined, onChange: jest.fn(), onRunQuery: jest.fn(), index: 1, operationIndex: 1, query: { labels: [{ op: '=', label: 'foo', value: 'bar' }], operations: [ { id: LokiOperationId.Logfmt, params: [] }, { id: LokiOperationId.Unwrap, params: ['', ''] }, { id: LokiOperationId.SumOverTime, params: ['5m'] }, { id: '__sum_by', params: ['job'] }, ], }, paramDef: {} as QueryBuilderOperationParamDef, operation: {} as QueryBuilderOperation, datasource: new LokiDatasource( { id: 1, uid: '', type: 'loki', name: 'loki-test', access: 'proxy', url: '', jsonData: {}, meta: {} as DataSourcePluginMeta, }, undefined, undefined ) as DataSourceApi, }; const props = { ...propsDefault, ...propsOverrides }; if (props.datasource instanceof LokiDatasource) { const resolvedValue = mockedSample ?? []; props.datasource.getDataSamples = jest.fn().mockResolvedValue(resolvedValue); } return props; }; const frames = [ toDataFrame({ fields: [ { name: 'labels', type: FieldType.other, values: [ { compose_project: 'docker-compose', compose_service: 'app', container_name: 'docker-compose_app_1', duration: '2.807709ms', filename: '/var/log/docker/37c87fe98cbfa28327c1de10c4aff72c58154d8e4d129118ff2024692360b677/json.log', host: 'docker-desktop', instance: 'docker-compose_app_1', job: 'tns/app', level: 'info', msg: 'HTTP client success', namespace: 'tns', source: 'stdout', status: '200', traceID: '6a3d34c4225776f6', url: 'http://db', }, { compose_project: 'docker-compose', compose_service: 'app', container_name: 'docker-compose_app_1', duration: '7.432542ms', filename: '/var/log/docker/37c87fe98cbfa28327c1de10c4aff72c58154d8e4d129118ff2024692360b677/json.log', host: 'docker-desktop', instance: 'docker-compose_app_1', job: 'tns/app', level: 'info', msg: 'HTTP client success', namespace: 'tns', source: 'stdout', status: '200', traceID: '18e99189831471f6', url: 'http://db', }, ], }, ], }), ];