mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 10:03:33 -06:00
203 lines
8.4 KiB
TypeScript
203 lines
8.4 KiB
TypeScript
import { render, screen } from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import React from 'react';
|
|
|
|
import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';
|
|
import { GrafanaBootConfig } from '@grafana/runtime/src';
|
|
import config from 'app/core/config';
|
|
|
|
import { TestProvider } from '../../../test/helpers/TestProvider';
|
|
import { contextSrv } from '../../core/services/context_srv';
|
|
|
|
import UserListPage from './UserListPage';
|
|
|
|
const selectors = e2eSelectors.pages.UserListPage;
|
|
const tabsSelector = selectors.tabs;
|
|
|
|
jest.mock('@grafana/runtime', () => ({
|
|
...jest.requireActual('@grafana/runtime'),
|
|
getBackendSrv: () => ({ get: jest.fn().mockResolvedValue([]) }),
|
|
}));
|
|
|
|
jest.mock('./UserListAdminPage', () => ({
|
|
UserListAdminPageContent: () => <div data-testid={selectors.UserListAdminPage.container} />,
|
|
}));
|
|
jest.mock('../users/UsersListPage', () => ({
|
|
UsersListPageContent: () => <div data-testid={selectors.UsersListPage.container} />,
|
|
}));
|
|
jest.mock('./UserListPublicDashboardPage/UserListPublicDashboardPage', () => ({
|
|
UserListPublicDashboardPage: () => <div data-testid={selectors.UsersListPublicDashboardsPage.container} />,
|
|
}));
|
|
|
|
const renderPage = () => {
|
|
render(
|
|
<TestProvider>
|
|
<UserListPage />
|
|
</TestProvider>
|
|
);
|
|
};
|
|
|
|
const enableEmailSharing = () => {
|
|
config.featureToggles.publicDashboardsEmailSharing = true;
|
|
config.featureToggles.publicDashboards = true;
|
|
config.licenseInfo = { ...config.licenseInfo, enabledFeatures: { publicDashboardsEmailSharing: true } };
|
|
};
|
|
|
|
let originalConfigData: GrafanaBootConfig;
|
|
|
|
beforeEach(() => {
|
|
originalConfigData = { ...config };
|
|
});
|
|
|
|
afterEach(() => {
|
|
config.featureToggles = originalConfigData.featureToggles;
|
|
config.licenseInfo = originalConfigData.licenseInfo;
|
|
});
|
|
|
|
describe('Tabs rendering', () => {
|
|
it('should render All and Org Users tabs when user has permissions to read to org users and is admin', async () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(true);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(true);
|
|
|
|
renderPage();
|
|
|
|
expect(screen.getByTestId(tabsSelector.allUsers)).toBeInTheDocument();
|
|
expect(screen.getByTestId(tabsSelector.orgUsers)).toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.publicDashboardsUsers)).not.toBeInTheDocument();
|
|
});
|
|
it('should render All, Org and Public dashboard tabs when user has permissions to read org users, is admin and has email sharing enabled', async () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(true);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(true);
|
|
|
|
enableEmailSharing();
|
|
renderPage();
|
|
|
|
expect(screen.getByTestId(tabsSelector.allUsers)).toBeInTheDocument();
|
|
expect(screen.getByTestId(tabsSelector.orgUsers)).toBeInTheDocument();
|
|
expect(screen.getByTestId(tabsSelector.publicDashboardsUsers)).toBeInTheDocument();
|
|
});
|
|
describe('No permissions to read org users or not admin', () => {
|
|
[
|
|
{
|
|
hasOrgReadPermissions: false,
|
|
isAdmin: true,
|
|
},
|
|
{
|
|
hasOrgReadPermissions: true,
|
|
isAdmin: false,
|
|
},
|
|
].forEach((scenario) => {
|
|
it('should render no tabs when user has no permissions to read org users or is not admin', async () => {
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(scenario.hasOrgReadPermissions);
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(scenario.isAdmin);
|
|
|
|
renderPage();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.allUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.orgUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.publicDashboardsUsers)).not.toBeInTheDocument();
|
|
});
|
|
});
|
|
});
|
|
describe('No permissions to read org users or not admin but email sharing enabled', () => {
|
|
[
|
|
{
|
|
title: 'user has no permissions to read org users',
|
|
hasOrgReadPermissions: false,
|
|
isAdmin: true,
|
|
},
|
|
{
|
|
title: 'user is not admin',
|
|
hasOrgReadPermissions: true,
|
|
isAdmin: false,
|
|
},
|
|
].forEach((scenario) => {
|
|
it(`should render User and Public dashboard tabs when ${scenario.title} but has email sharing enabled`, async () => {
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(scenario.hasOrgReadPermissions);
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(scenario.isAdmin);
|
|
|
|
enableEmailSharing();
|
|
renderPage();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.allUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.orgUsers)).not.toBeInTheDocument();
|
|
|
|
expect(screen.getByTestId(tabsSelector.users)).toBeInTheDocument();
|
|
expect(screen.getByTestId(tabsSelector.publicDashboardsUsers)).toBeInTheDocument();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('Tables rendering', () => {
|
|
it('should render UserListAdminPage when user is admin', () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(true);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(true);
|
|
|
|
renderPage();
|
|
|
|
expect(screen.getByTestId(tabsSelector.allUsers).className.includes('activeTabStyle')).toBeTruthy();
|
|
expect(screen.getByTestId(tabsSelector.orgUsers)).toBeInTheDocument();
|
|
|
|
expect(screen.getByTestId(selectors.UserListAdminPage.container)).toBeInTheDocument();
|
|
});
|
|
it('should render UsersListPage when user is admin and has org read permissions', async () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(true);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(true);
|
|
|
|
renderPage();
|
|
|
|
expect(screen.getByTestId(tabsSelector.allUsers).className.includes('activeTabStyle')).toBeTruthy();
|
|
expect(screen.getByTestId(tabsSelector.orgUsers)).toBeInTheDocument();
|
|
expect(screen.getByTestId(selectors.UserListAdminPage.container)).toBeInTheDocument();
|
|
|
|
await userEvent.click(screen.getByTestId(tabsSelector.orgUsers));
|
|
expect(screen.getByTestId(tabsSelector.orgUsers).className.includes('activeTabStyle')).toBeTruthy();
|
|
expect(screen.getByTestId(selectors.UsersListPage.container)).toBeInTheDocument();
|
|
});
|
|
it('should render UsersListPage when user has org read permissions and is not admin', async () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(false);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(true);
|
|
|
|
renderPage();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.allUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.orgUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.users)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.publicDashboardsUsers)).not.toBeInTheDocument();
|
|
|
|
expect(screen.getByTestId(selectors.UsersListPage.container)).toBeInTheDocument();
|
|
});
|
|
it('should render UserListPublicDashboardPage when user has email sharing enabled and is not admin', async () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(false);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(true);
|
|
|
|
enableEmailSharing();
|
|
renderPage();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.allUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.orgUsers)).not.toBeInTheDocument();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.users)).toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.publicDashboardsUsers)).toBeInTheDocument();
|
|
|
|
await userEvent.click(screen.getByTestId(tabsSelector.publicDashboardsUsers));
|
|
expect(screen.getByTestId(tabsSelector.publicDashboardsUsers).className.includes('activeTabStyle')).toBeTruthy();
|
|
expect(screen.getByTestId(selectors.UsersListPublicDashboardsPage.container)).toBeInTheDocument();
|
|
});
|
|
it('should render UsersListPage when user is not admin and does not have nor org read perms neither email sharing enabled', async () => {
|
|
jest.spyOn(contextSrv, 'hasAccess').mockReturnValue(false);
|
|
jest.spyOn(contextSrv, 'hasPermission').mockReturnValue(false);
|
|
|
|
renderPage();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.allUsers)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.orgUsers)).not.toBeInTheDocument();
|
|
|
|
expect(screen.queryByTestId(tabsSelector.users)).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId(tabsSelector.publicDashboardsUsers)).not.toBeInTheDocument();
|
|
|
|
expect(screen.getByTestId(selectors.UsersListPage.container)).toBeInTheDocument();
|
|
});
|
|
});
|