2025-04-01 10:38:02 +09:00

66 lines
2.1 KiB
TypeScript

import { act, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks';
import { selectors } from '@grafana/e2e-selectors';
import { locationService, setPluginImportUtils } from '@grafana/runtime';
import { SceneTimeRange, UrlSyncContextProvider } from '@grafana/scenes';
import { render } from '../../../../../test/test-utils';
import { shareDashboardType } from '../../../dashboard/components/ShareModal/utils';
import { DashboardScene } from '../../scene/DashboardScene';
import { activateFullSceneTree } from '../../utils/test-utils';
import { ShareDrawer } from './ShareDrawer';
setPluginImportUtils({
importPanelPlugin: (id: string) => Promise.resolve(getPanelPlugin({})),
getPanelPluginFromCache: (id: string) => undefined,
});
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
useChromeHeaderHeight: jest.fn(),
}));
describe('ShareDrawer', () => {
it('removes shareView query param from url when it is closed', async () => {
const { dashboard } = await buildAndRenderScenario();
render(
<UrlSyncContextProvider scene={dashboard}>
<dashboard.Component model={dashboard} />
</UrlSyncContextProvider>
);
act(() => locationService.partial({ shareView: 'link' }));
expect(locationService.getSearch().get('shareView')).toBe('link');
expect(await screen.findByText('Share externally')).toBeInTheDocument();
const closeButton = await screen.findByTestId(selectors.components.Drawer.General.close);
await act(() => userEvent.click(closeButton));
expect(locationService.getSearch().get('shareView')).toBe(null);
});
});
async function buildAndRenderScenario() {
const drawer = new ShareDrawer({ shareView: shareDashboardType.publicDashboard });
const dashboard = new DashboardScene({
title: 'hello',
uid: 'dash-1',
meta: {
canEdit: true,
},
$timeRange: new SceneTimeRange({}),
overlay: drawer,
});
drawer.activate();
activateFullSceneTree(dashboard);
await new Promise((r) => setTimeout(r, 1));
return { dashboard };
}