import { render, screen } from '@testing-library/react'; import { uniqueId } from 'lodash'; import { dateMath, dateTime, EventBus, LoadingState, TimeRange, toDataFrame, VizOrientation } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { BarGaugeDisplayMode, BarGaugeValueMode, LegendDisplayMode, LegendPlacement } from '@grafana/schema'; import { BarGaugeNamePlacement, BarGaugeSizing } from '@grafana/schema/dist/esm/common/common.gen'; import { BarGaugePanel, BarGaugePanelProps } from './BarGaugePanel'; const valueSelector = selectors.components.Panels.Visualization.BarGauge.valueV2; describe('BarGaugePanel', () => { describe('when there is no data', () => { it('show a "No Data" message', () => { const panelData = buildPanelData(); render(); expect(screen.getByText(/no data/i)).toBeInTheDocument(); }); }); describe('when there is data', () => { it('shows the panel', () => { const firstBarPanel = 'firstBarPanel'; const secondBarPanel = 'secondBarPanel'; const panelData = buildPanelData({ data: { series: [ toDataFrame({ target: firstBarPanel, datapoints: [ [100, 1000], [100, 200], ], }), ], timeRange: createTimeRange(), state: LoadingState.Done, }, }); const { rerender } = render(); expect(screen.queryByText(/100/)).toBeInTheDocument(); expect(screen.queryByText(/firstbarpanel/i)).not.toBeInTheDocument(); expect(screen.getByTestId(valueSelector)).toBeInTheDocument(); rerender( ); expect(screen.queryByText(/firstbarpanel/i)).toBeInTheDocument(); expect(screen.queryByText(/secondbarpanel/i)).toBeInTheDocument(); expect(screen.queryByText(/200/)).toBeInTheDocument(); expect(screen.queryByText(/300/)).toBeInTheDocument(); expect(screen.getAllByTestId(valueSelector).length).toEqual(2); }); }); }); function buildPanelData(overrideValues?: Partial): BarGaugePanelProps { const timeRange = createTimeRange(); const defaultValues = { id: Number(uniqueId()), data: { series: [], state: LoadingState.Done, timeRange, }, options: { displayMode: BarGaugeDisplayMode.Lcd, reduceOptions: { calcs: ['mean'], values: false, }, orientation: VizOrientation.Horizontal, showUnfilled: true, maxVizHeight: 100, minVizHeight: 10, minVizWidth: 0, valueMode: BarGaugeValueMode.Color, namePlacement: BarGaugeNamePlacement.Auto, sizing: BarGaugeSizing.Auto, legend: { showLegend: false, placement: 'bottom' as LegendPlacement, calcs: [], displayMode: LegendDisplayMode.List, }, }, transparent: false, timeRange, timeZone: 'utc', title: 'hello', fieldConfig: { defaults: {}, overrides: [], }, onFieldConfigChange: jest.fn(), onOptionsChange: jest.fn(), onChangeTimeRange: jest.fn(), replaceVariables: jest.fn(), renderCounter: 0, width: 552, height: 250, eventBus: {} as EventBus, }; return { ...defaultValues, ...overrideValues, }; } function createTimeRange(): TimeRange { return { from: dateMath.parse('now-6h') || dateTime(), to: dateMath.parse('now') || dateTime(), raw: { from: 'now-6h', to: 'now' }, }; }