import { act, render } from '@testing-library/react'; import { toUtc } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { SceneTimeRange } from '@grafana/scenes'; import { DashboardControls } from './DashboardControls'; import { DashboardScene } from './DashboardScene'; const mockGetAnchorInfo = jest.fn((link) => ({ href: `/dashboard/${link.title}`, title: link.title, tooltip: link.tooltip || null, })); // Mock the getLinkSrv function jest.mock('app/features/panel/panellinks/link_srv', () => ({ getLinkSrv: jest.fn(() => ({ getAnchorInfo: mockGetAnchorInfo, })), })); describe('DashboardLinksControls', () => { it('renders dashboard links correctly', () => { const { controls } = buildTestScene(); const renderer = render(); // // Expect two dashboard link containers to be rendered const linkContainers = renderer.getAllByTestId(selectors.components.DashboardLinks.container); expect(linkContainers).toHaveLength(2); // Check link titles and hrefs const links = renderer.getAllByTestId(selectors.components.DashboardLinks.link); expect(links[0]).toHaveTextContent('Link 1'); expect(links[1]).toHaveTextContent('Link 2'); }); it('updates link hrefs when time range changes', () => { const { controls, dashboard } = buildTestScene(); render(); //clear initial calls to getAnchorInfo mockGetAnchorInfo.mockClear(); act(() => { // Update time range dashboard.state.$timeRange?.setState({ value: { from: toUtc('2021-01-01'), to: toUtc('2021-01-02'), raw: { from: toUtc('2020-01-01'), to: toUtc('2020-01-02') }, }, }); }); //expect getAnchorInfo to be called twice, once for each link, after time range change expect(mockGetAnchorInfo).toHaveBeenCalledTimes(2); }); }); function buildTestScene(): { controls: DashboardControls; dashboard: DashboardScene } { const dashboard = new DashboardScene({ uid: 'A', links: [ { title: 'Link 1', url: 'http://localhost:3000/$A', type: 'link', asDropdown: false, icon: '', includeVars: true, keepTime: true, tags: [], targetBlank: false, tooltip: 'Link 1', }, { title: 'Link 2', url: 'http://localhost:3000/$A', type: 'link', asDropdown: false, icon: '', includeVars: true, keepTime: true, tags: [], targetBlank: false, tooltip: 'Link 2', }, ], controls: new DashboardControls({}), $timeRange: new SceneTimeRange({ from: 'now-1', to: 'now', }), }); dashboard.activate(); return { controls: dashboard.state.controls as DashboardControls, dashboard }; }