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

148 lines
5.0 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import { selectors as e2eSelectors } from '@grafana/e2e-selectors';
import { SceneTimeRange, VizPanel } from '@grafana/scenes';
import { contextSrv } from 'app/core/services/context_srv';
import { config } from '../../../../core/config';
import { AccessControlAction } from '../../../../types';
import { grantUserPermissions } from '../../../alerting/unified/mocks';
import { DashboardScene, DashboardSceneState } from '../../scene/DashboardScene';
import { DefaultGridLayoutManager } from '../../scene/layout-default/DefaultGridLayoutManager';
import ShareMenu from './ShareMenu';
const createAndCopyDashboardShortLinkMock = jest.fn();
jest.mock('app/core/utils/shortLinks', () => ({
...jest.requireActual('app/core/utils/shortLinks'),
createAndCopyDashboardShortLink: () => createAndCopyDashboardShortLinkMock(),
}));
const selector = e2eSelectors.pages.Dashboard.DashNav.newShareButton.menu;
describe('ShareMenu', () => {
afterEach(() => {
jest.resetModules();
jest.clearAllMocks();
jest.resetAllMocks();
});
it('should render menu items', async () => {
Object.defineProperty(contextSrv, 'isSignedIn', {
value: true,
});
grantUserPermissions([AccessControlAction.SnapshotsCreate, AccessControlAction.OrgUsersAdd]);
config.publicDashboardsEnabled = true;
config.snapshotEnabled = true;
config.externalUserMngLinkUrl = 'http://localhost:3000';
setup({ meta: { canEdit: true } });
expect(await screen.findByTestId(selector.shareInternally)).toBeInTheDocument();
expect(await screen.findByTestId(selector.shareExternally)).toBeInTheDocument();
expect(await screen.findByTestId(selector.shareSnapshot)).toBeInTheDocument();
expect(await screen.findByTestId(selector.inviteUser)).toBeInTheDocument();
});
it('should not share externally when public dashboard is disabled', async () => {
config.publicDashboardsEnabled = false;
setup();
expect(screen.queryByTestId(selector.shareExternally)).not.toBeInTheDocument();
});
it('should not render invite user when user does not have access', async () => {
Object.defineProperty(contextSrv, 'isSignedIn', {
value: true,
});
expect(await screen.queryByTestId(selector.inviteUser)).not.toBeInTheDocument();
});
it('should render invite user with analytics when config is provided', async () => {
Object.defineProperty(contextSrv, 'isSignedIn', {
value: true,
});
grantUserPermissions([AccessControlAction.OrgUsersAdd]);
config.externalUserMngLinkUrl = 'http://localhost:3000/users';
config.externalUserMngAnalytics = true;
config.externalUserMngAnalyticsParams = 'src=grafananet&other=value1';
setup({ meta: { canEdit: true } });
const inviteUser = await screen.findByTestId(selector.inviteUser);
// Mock window.open
const windowOpenMock = jest.spyOn(window, 'open').mockImplementation(() => null);
// Simulate click event
inviteUser.click();
// Assert window.open was called with the correct URL
expect(windowOpenMock).toHaveBeenCalledWith(
'http://localhost:3000/users?src=grafananet&other=value1&cnt=share-invite',
'_blank'
);
// Restore the original implementation
windowOpenMock.mockRestore();
});
it('should not render invite user when externalUserMngLinkUrl is not provided', async () => {
Object.defineProperty(contextSrv, 'isSignedIn', {
value: true,
});
grantUserPermissions([AccessControlAction.OrgUsersAdd]);
config.externalUserMngLinkUrl = '';
expect(await screen.queryByTestId(selector.inviteUser)).not.toBeInTheDocument();
});
describe('ShareSnapshot', () => {
it('should not share snapshot when user is not signed in', async () => {
config.snapshotEnabled = true;
Object.defineProperty(contextSrv, 'isSignedIn', {
value: false,
});
setup({ meta: { canEdit: true } });
expect(screen.queryByTestId(selector.shareSnapshot)).not.toBeInTheDocument();
});
it('should not share snapshot when snapshot is not enabled', async () => {
Object.defineProperty(contextSrv, 'isSignedIn', {
value: true,
});
config.snapshotEnabled = false;
setup({ meta: { canEdit: true } });
expect(screen.queryByTestId(selector.shareSnapshot)).not.toBeInTheDocument();
});
it('should not share snapshot without permissions', async () => {
Object.defineProperty(contextSrv, 'isSignedIn', {
value: true,
});
config.snapshotEnabled = true;
setup({ meta: { canEdit: false } });
expect(screen.queryByTestId(selector.shareSnapshot)).not.toBeInTheDocument();
});
});
});
function setup(overrides?: Partial<DashboardSceneState>) {
const panel = new VizPanel({
title: 'Panel A',
pluginId: 'table',
key: 'panel-12',
});
const dashboard = new DashboardScene({
title: 'hello',
uid: 'dash-1',
$timeRange: new SceneTimeRange({}),
body: DefaultGridLayoutManager.fromVizPanels([panel]),
...overrides,
});
render(<ShareMenu dashboard={dashboard} />);
}