diff --git a/packages/grafana-ui/src/components/Tabs/Tab.tsx b/packages/grafana-ui/src/components/Tabs/Tab.tsx index 9932b07f721..e5aa26a2149 100644 --- a/packages/grafana-ui/src/components/Tabs/Tab.tsx +++ b/packages/grafana-ui/src/components/Tabs/Tab.tsx @@ -51,6 +51,8 @@ export const Tab = React.forwardRef( } ); +Tab.displayName = 'Tab'; + const getTabStyles = stylesFactory((theme: GrafanaTheme) => { const colors = theme.colors; diff --git a/public/app/features/explore/ExploreQueryInspector.test.tsx b/public/app/features/explore/ExploreQueryInspector.test.tsx new file mode 100644 index 00000000000..368d5fa662e --- /dev/null +++ b/public/app/features/explore/ExploreQueryInspector.test.tsx @@ -0,0 +1,82 @@ +import React, { ComponentProps } from 'react'; +import { Observable } from 'rxjs'; +import { render, screen, fireEvent } from '@testing-library/react'; +import { TimeRange, LoadingState } from '@grafana/data'; +import { ExploreId } from 'app/types'; +import { ExploreQueryInspector } from './ExploreQueryInspector'; + +type ExploreQueryInspectorProps = ComponentProps; + +jest.mock('../dashboard/components/Inspector/styles', () => ({ + getPanelInspectorStyles: () => ({}), +})); + +jest.mock('app/core/services/backend_srv', () => ({ + getBackendSrv: () => ({ + getInspectorStream: () => + new Observable(subscriber => { + subscriber.next(response()); + subscriber.next(response(true)); + }) as any, + }), +})); + +jest.mock('app/core/services/context_srv', () => ({ + contextSrv: { + user: { orgId: 1 }, + }, +})); + +const setup = () => { + const props: ExploreQueryInspectorProps = { + loading: false, + width: 100, + exploreId: ExploreId.left, + onClose: jest.fn(), + queryResponse: { + state: LoadingState.Done, + series: [], + timeRange: {} as TimeRange, + }, + }; + + return render(); +}; + +describe('ExploreQueryInspector', () => { + it('should render closable drawer component', () => { + setup(); + expect(screen.getByTitle(/close query inspector/i)).toBeInTheDocument(); + }); + it('should render 2 Tabs', () => { + setup(); + expect(screen.getByLabelText(/tab stats/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/tab query inspector/i)).toBeInTheDocument(); + }); + it('should display query data', () => { + setup(); + fireEvent.click(screen.getByLabelText(/tab query inspector/i)); + fireEvent.click(screen.getByText(/expand all/i)); + expect(screen.getByText(/very unique test value/i)).toBeInTheDocument(); + }); +}); + +const response = (hideFromInspector = false) => ({ + status: 1, + statusText: '', + ok: true, + headers: {} as any, + redirected: false, + type: 'basic', + url: '', + request: {} as any, + data: { + test: { + testKey: 'Very unique test value', + }, + }, + config: { + url: '', + hideFromInspector, + }, +}); diff --git a/public/app/features/explore/ExploreQueryInspector.tsx b/public/app/features/explore/ExploreQueryInspector.tsx index 52b932d6551..671e2617255 100644 --- a/public/app/features/explore/ExploreQueryInspector.tsx +++ b/public/app/features/explore/ExploreQueryInspector.tsx @@ -14,9 +14,9 @@ import { InspectStatsTab } from '../dashboard/components/Inspector/InspectStatsT import { getPanelInspectorStyles } from '../dashboard/components/Inspector/styles'; function stripPropsFromResponse(response: any) { - // ignore silent requests + // ignore silent requests and return early if (response.config?.hideFromInspector) { - return {}; + return; } const clonedResponse = { ...response }; // clone - dont modify the response @@ -65,7 +65,7 @@ interface Props { onClose: () => void; } -function ExploreQueryInspector(props: Props) { +export function ExploreQueryInspector(props: Props) { const [formattedJSON, setFormattedJSON] = useState({}); const getTextForClipboard = () => { @@ -98,7 +98,9 @@ function ExploreQueryInspector(props: Props) { .getInspectorStream() .subscribe(resp => { const strippedResponse = stripPropsFromResponse(resp); - setResponse(strippedResponse); + if (strippedResponse) { + setResponse(strippedResponse); + } }); return () => { @@ -108,7 +110,6 @@ function ExploreQueryInspector(props: Props) { const haveData = response && Object.keys(response).length > 0; const styles = getPanelInspectorStyles(); - const statsTab: TabConfig = { label: 'Stats', value: 'stats',