201 lines
5.7 KiB
TypeScript
201 lines
5.7 KiB
TypeScript
import { render as rtlRender, screen } from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import { TestProvider } from 'test/helpers/TestProvider';
|
|
import { assertIsDefined } from 'test/helpers/asserts';
|
|
|
|
import { selectors } from '@grafana/e2e-selectors';
|
|
import { config } from '@grafana/runtime';
|
|
|
|
import {
|
|
sharedWithMeFolder,
|
|
wellFormedDashboard,
|
|
wellFormedEmptyFolder,
|
|
wellFormedFolder,
|
|
} from '../fixtures/dashboardsTreeItem.fixture';
|
|
import { SelectionState } from '../types';
|
|
|
|
import { DashboardsTree } from './DashboardsTree';
|
|
|
|
function render(...[ui, options]: Parameters<typeof rtlRender>) {
|
|
rtlRender(<TestProvider>{ui}</TestProvider>, options);
|
|
}
|
|
|
|
describe('browse-dashboards DashboardsTree', () => {
|
|
const WIDTH = 800;
|
|
const HEIGHT = 600;
|
|
|
|
const folder = wellFormedFolder(1);
|
|
const emptyFolderIndicator = wellFormedEmptyFolder();
|
|
const dashboard = wellFormedDashboard(2);
|
|
const noop = () => {};
|
|
const isSelected = () => SelectionState.Unselected;
|
|
const allItemsAreLoaded = () => true;
|
|
const requestLoadMore = () => Promise.resolve();
|
|
|
|
beforeAll(() => {
|
|
config.sharedWithMeFolderUID = 'sharedwithme';
|
|
});
|
|
|
|
it('renders a dashboard item', () => {
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[dashboard]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
expect(screen.queryByText(dashboard.item.title)).toBeInTheDocument();
|
|
expect(screen.queryByText(assertIsDefined(dashboard.item.tags)[0])).toBeInTheDocument();
|
|
expect(screen.getByTestId(selectors.pages.BrowseDashboards.table.checkbox(dashboard.item.uid))).toBeInTheDocument();
|
|
});
|
|
|
|
it('does not render checkbox when disabled', () => {
|
|
render(
|
|
<DashboardsTree
|
|
canSelect={false}
|
|
items={[dashboard]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
expect(
|
|
screen.queryByTestId(selectors.pages.BrowseDashboards.table.checkbox(dashboard.item.uid))
|
|
).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('renders a folder item', () => {
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[folder]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
|
|
expect(screen.queryByText(folder.item.title)).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders a folder link', () => {
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[folder]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
|
|
expect(screen.queryByText(folder.item.title)).toHaveAttribute('href', folder.item.url);
|
|
});
|
|
|
|
it("doesn't link to the sharedwithme pseudo-folder", () => {
|
|
const sharedWithMe = sharedWithMeFolder(2);
|
|
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[sharedWithMe, folder]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
|
|
expect(screen.queryByText(sharedWithMe.item.title)).not.toHaveAttribute('href');
|
|
});
|
|
|
|
it("doesn't render a checkbox for the sharedwithme pseudo-folder", () => {
|
|
const sharedWithMe = sharedWithMeFolder(2);
|
|
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[sharedWithMe, folder]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
|
|
expect(
|
|
screen.queryByTestId(selectors.pages.BrowseDashboards.table.checkbox(sharedWithMe.item.uid))
|
|
).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('calls onFolderClick when a folder button is clicked', async () => {
|
|
const handler = jest.fn();
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[folder]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={handler}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
const folderButton = screen.getByLabelText(`Expand folder ${folder.item.title}`);
|
|
await userEvent.click(folderButton);
|
|
|
|
expect(handler).toHaveBeenCalledWith(folder.item.uid, true);
|
|
});
|
|
|
|
it('renders empty folder indicators', () => {
|
|
render(
|
|
<DashboardsTree
|
|
canSelect
|
|
items={[emptyFolderIndicator]}
|
|
isSelected={isSelected}
|
|
width={WIDTH}
|
|
height={HEIGHT}
|
|
onFolderClick={noop}
|
|
onItemSelectionChange={noop}
|
|
onAllSelectionChange={noop}
|
|
isItemLoaded={allItemsAreLoaded}
|
|
requestLoadMore={requestLoadMore}
|
|
/>
|
|
);
|
|
expect(screen.queryByText('No items')).toBeInTheDocument();
|
|
});
|
|
});
|