|
|
|
|
@ -8,33 +8,23 @@ import { TestProvider } from 'test/helpers/TestProvider'; |
|
|
|
|
|
|
|
|
|
import { config } from '@grafana/runtime'; |
|
|
|
|
import { backendSrv } from 'app/core/services/backend_srv'; |
|
|
|
|
import { PermissionLevelString } from 'app/types'; |
|
|
|
|
|
|
|
|
|
import { wellFormedTree } from '../../../features/browse-dashboards/fixtures/dashboardsTreeItem.fixture'; |
|
|
|
|
import { |
|
|
|
|
treeViewersCanEdit, |
|
|
|
|
wellFormedTree, |
|
|
|
|
} from '../../../features/browse-dashboards/fixtures/dashboardsTreeItem.fixture'; |
|
|
|
|
|
|
|
|
|
import { NestedFolderPicker } from './NestedFolderPicker'; |
|
|
|
|
|
|
|
|
|
const [mockTree, { folderA, folderB, folderC, folderA_folderA, folderA_folderB }] = wellFormedTree(); |
|
|
|
|
const [mockTreeThatViewersCanEdit /* shares folders with wellFormedTree */] = treeViewersCanEdit(); |
|
|
|
|
|
|
|
|
|
jest.mock('@grafana/runtime', () => ({ |
|
|
|
|
...jest.requireActual('@grafana/runtime'), |
|
|
|
|
getBackendSrv: () => backendSrv, |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
jest.mock('app/features/browse-dashboards/api/services', () => { |
|
|
|
|
const orig = jest.requireActual('app/features/browse-dashboards/api/services'); |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
...orig, |
|
|
|
|
listFolders(parentUID?: string) { |
|
|
|
|
const childrenForUID = mockTree |
|
|
|
|
.filter((v) => v.item.kind === 'folder' && v.item.parentUID === parentUID) |
|
|
|
|
.map((v) => v.item); |
|
|
|
|
|
|
|
|
|
return Promise.resolve(childrenForUID); |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
function render(...[ui, options]: Parameters<typeof rtlRender>) { |
|
|
|
|
rtlRender(<TestProvider>{ui}</TestProvider>, options); |
|
|
|
|
} |
|
|
|
|
@ -58,12 +48,15 @@ describe('NestedFolderPicker', () => { |
|
|
|
|
http.get('/api/folders', ({ request }) => { |
|
|
|
|
const url = new URL(request.url); |
|
|
|
|
const parentUid = url.searchParams.get('parentUid') ?? undefined; |
|
|
|
|
const permission = url.searchParams.get('permission'); |
|
|
|
|
|
|
|
|
|
const limit = parseInt(url.searchParams.get('limit') ?? '1000', 10); |
|
|
|
|
const page = parseInt(url.searchParams.get('page') ?? '1', 10); |
|
|
|
|
|
|
|
|
|
const tree = permission === 'Edit' ? mockTreeThatViewersCanEdit : mockTree; |
|
|
|
|
|
|
|
|
|
// reconstruct a folder API response from the flat tree fixture
|
|
|
|
|
const folders = mockTree |
|
|
|
|
const folders = tree |
|
|
|
|
.filter((v) => v.item.kind === 'folder' && v.item.parentUID === parentUid) |
|
|
|
|
.map((folder) => { |
|
|
|
|
return { |
|
|
|
|
@ -117,7 +110,7 @@ describe('NestedFolderPicker', () => { |
|
|
|
|
expect(screen.getByPlaceholderText('Search folders')).toBeInTheDocument(); |
|
|
|
|
expect(screen.getByLabelText('Dashboards')).toBeInTheDocument(); |
|
|
|
|
expect(screen.getByLabelText(folderA.item.title)).toBeInTheDocument(); |
|
|
|
|
expect(screen.getByLabelText(folderB.item.title)).toBeInTheDocument(); |
|
|
|
|
// expect(screen.getByLabelText(folderB.item.title)).toBeInTheDocument();
|
|
|
|
|
expect(screen.getByLabelText(folderC.item.title)).toBeInTheDocument(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
@ -174,14 +167,36 @@ describe('NestedFolderPicker', () => { |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('hides folders specififed by UID', async () => { |
|
|
|
|
render(<NestedFolderPicker excludeUIDs={[folderA.item.uid]} onChange={mockOnChange} />); |
|
|
|
|
render(<NestedFolderPicker excludeUIDs={[folderC.item.uid]} onChange={mockOnChange} />); |
|
|
|
|
|
|
|
|
|
// Open the picker and wait for children to load
|
|
|
|
|
const button = await screen.findByRole('button', { name: 'Select folder' }); |
|
|
|
|
await userEvent.click(button); |
|
|
|
|
await screen.findByLabelText(folderB.item.title); |
|
|
|
|
await screen.findByLabelText(folderA.item.title); |
|
|
|
|
|
|
|
|
|
expect(screen.queryByLabelText(folderC.item.title)).not.toBeInTheDocument(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('by default only shows items the user can edit', async () => { |
|
|
|
|
render(<NestedFolderPicker onChange={mockOnChange} />); |
|
|
|
|
|
|
|
|
|
const button = await screen.findByRole('button', { name: 'Select folder' }); |
|
|
|
|
await userEvent.click(button); |
|
|
|
|
await screen.findByLabelText(folderA.item.title); |
|
|
|
|
|
|
|
|
|
expect(screen.queryByLabelText(folderA.item.title)).not.toBeInTheDocument(); |
|
|
|
|
expect(screen.queryByLabelText(folderB.item.title)).not.toBeInTheDocument(); // folderB is not editable
|
|
|
|
|
expect(screen.getByLabelText(folderC.item.title)).toBeInTheDocument(); // but folderC is
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('shows items the user can view, with the prop', async () => { |
|
|
|
|
render(<NestedFolderPicker permission={PermissionLevelString.View} onChange={mockOnChange} />); |
|
|
|
|
|
|
|
|
|
const button = await screen.findByRole('button', { name: 'Select folder' }); |
|
|
|
|
await userEvent.click(button); |
|
|
|
|
await screen.findByLabelText(folderA.item.title); |
|
|
|
|
|
|
|
|
|
expect(screen.getByLabelText(folderB.item.title)).toBeInTheDocument(); |
|
|
|
|
expect(screen.getByLabelText(folderC.item.title)).toBeInTheDocument(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
describe('when nestedFolders is enabled', () => { |
|
|
|
|
@ -196,7 +211,7 @@ describe('NestedFolderPicker', () => { |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('can expand and collapse a folder to show its children', async () => { |
|
|
|
|
render(<NestedFolderPicker onChange={mockOnChange} />); |
|
|
|
|
render(<NestedFolderPicker permission={PermissionLevelString.View} onChange={mockOnChange} />); |
|
|
|
|
|
|
|
|
|
// Open the picker and wait for children to load
|
|
|
|
|
const button = await screen.findByRole('button', { name: 'Select folder' }); |
|
|
|
|
@ -227,7 +242,7 @@ describe('NestedFolderPicker', () => { |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('can expand and collapse a folder to show its children with the keyboard', async () => { |
|
|
|
|
render(<NestedFolderPicker onChange={mockOnChange} />); |
|
|
|
|
render(<NestedFolderPicker permission={PermissionLevelString.View} onChange={mockOnChange} />); |
|
|
|
|
const button = await screen.findByRole('button', { name: 'Select folder' }); |
|
|
|
|
|
|
|
|
|
await userEvent.click(button); |
|
|
|
|
|