grafana/public/app/features/browse-dashboards/components/DashboardsTree.test.tsx
Josh Hunt 32d3e895b3
NestedFolders: Indicate when folders have mixed-selection children (#67337)
* Show indeterminate checkbox for folders with partially selected children

* When selecting an item, check ancestors to see if all their children are now selected

* reword comment

* fix test

* fix lint

* Check all descendants for mixed state

* Use indeterminate checkbox

* fix test description

* make header checkbox select/unselect automatically

* mixed header checkbox:

* fix tests

* add tests
2023-05-02 13:17:25 +03:00

119 lines
3.6 KiB
TypeScript

import { render as rtlRender, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { TestProvider } from 'test/helpers/TestProvider';
import { assertIsDefined } from 'test/helpers/asserts';
import { selectors } from '@grafana/e2e-selectors';
import { 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;
it('renders a dashboard item', () => {
render(
<DashboardsTree
canSelect
items={[dashboard]}
isSelected={isSelected}
width={WIDTH}
height={HEIGHT}
onFolderClick={noop}
onItemSelectionChange={noop}
onAllSelectionChange={noop}
/>
);
expect(screen.queryByText(dashboard.item.title)).toBeInTheDocument();
expect(screen.queryByText('Dashboard')).toBeInTheDocument();
expect(screen.queryByText(assertIsDefined(dashboard.item.tags)[0])).toBeInTheDocument();
expect(screen.getByTestId(selectors.pages.BrowseDashbards.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}
/>
);
expect(
screen.queryByTestId(selectors.pages.BrowseDashbards.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}
/>
);
expect(screen.queryByText(folder.item.title)).toBeInTheDocument();
expect(screen.queryByText('Folder')).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}
/>
);
const folderButton = screen.getByLabelText('Collapse folder');
await userEvent.click(folderButton);
expect(handler).toHaveBeenCalledWith(folder.item.uid, false);
});
it('renders empty folder indicators', () => {
render(
<DashboardsTree
canSelect
items={[emptyFolderIndicator]}
isSelected={isSelected}
width={WIDTH}
height={HEIGHT}
onFolderClick={noop}
onItemSelectionChange={noop}
onAllSelectionChange={noop}
/>
);
expect(screen.queryByText('Empty folder')).toBeInTheDocument();
expect(screen.queryByText(emptyFolderIndicator.item.kind)).not.toBeInTheDocument();
});
});