Provisioning: Prevent dashboard imports on provisioned folders (#111476)
This commit is contained in:
@@ -2,12 +2,20 @@ import { render as rtlRender, screen, within } from '@testing-library/react';
|
|||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
import { TestProvider } from 'test/helpers/TestProvider';
|
import { TestProvider } from 'test/helpers/TestProvider';
|
||||||
|
|
||||||
|
import { ManagerKind } from 'app/features/apiserver/types';
|
||||||
|
import { useIsProvisionedInstance } from 'app/features/provisioning/hooks/useIsProvisionedInstance';
|
||||||
import { FolderDTO } from 'app/types/folders';
|
import { FolderDTO } from 'app/types/folders';
|
||||||
|
|
||||||
import { mockFolderDTO } from '../fixtures/folder.fixture';
|
import { mockFolderDTO } from '../fixtures/folder.fixture';
|
||||||
|
|
||||||
import CreateNewButton from './CreateNewButton';
|
import CreateNewButton from './CreateNewButton';
|
||||||
|
|
||||||
|
jest.mock('app/features/provisioning/hooks/useIsProvisionedInstance', () => ({
|
||||||
|
useIsProvisionedInstance: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
const mockUseIsProvisionedInstance = useIsProvisionedInstance as jest.MockedFunction<typeof useIsProvisionedInstance>;
|
||||||
|
|
||||||
const mockParentFolder = mockFolderDTO();
|
const mockParentFolder = mockFolderDTO();
|
||||||
|
|
||||||
function render(...[ui, options]: Parameters<typeof rtlRender>) {
|
function render(...[ui, options]: Parameters<typeof rtlRender>) {
|
||||||
@@ -21,6 +29,9 @@ async function renderAndOpen(folder?: FolderDTO) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('NewActionsButton', () => {
|
describe('NewActionsButton', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
mockUseIsProvisionedInstance.mockReturnValue(false);
|
||||||
|
});
|
||||||
it('should display the correct urls with a given parent folder', async () => {
|
it('should display the correct urls with a given parent folder', async () => {
|
||||||
await renderAndOpen(mockParentFolder);
|
await renderAndOpen(mockParentFolder);
|
||||||
|
|
||||||
@@ -75,4 +86,42 @@ describe('NewActionsButton', () => {
|
|||||||
expect(screen.queryByText('Import')).not.toBeInTheDocument();
|
expect(screen.queryByText('Import')).not.toBeInTheDocument();
|
||||||
expect(screen.getByText('New folder')).toBeInTheDocument();
|
expect(screen.getByText('New folder')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should hide Import button when folder is provisioned', async () => {
|
||||||
|
const provisionedFolder = mockFolderDTO(1, { managedBy: ManagerKind.Repo });
|
||||||
|
await renderAndOpen(provisionedFolder);
|
||||||
|
|
||||||
|
expect(screen.getByRole('link', { name: 'New dashboard' })).toBeInTheDocument();
|
||||||
|
expect(screen.getByText('New folder')).toBeInTheDocument();
|
||||||
|
expect(screen.queryByText('Import')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should show Import button when folder is not provisioned', async () => {
|
||||||
|
const regularFolder = mockFolderDTO(1, { managedBy: undefined });
|
||||||
|
await renderAndOpen(regularFolder);
|
||||||
|
|
||||||
|
expect(screen.getByRole('link', { name: 'New dashboard' })).toBeInTheDocument();
|
||||||
|
expect(screen.getByText('New folder')).toBeInTheDocument();
|
||||||
|
expect(screen.getByRole('link', { name: 'Import' })).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should hide Import button when entire instance is provisioned', async () => {
|
||||||
|
mockUseIsProvisionedInstance.mockReturnValue(true);
|
||||||
|
const regularFolder = mockFolderDTO(1, { managedBy: undefined });
|
||||||
|
await renderAndOpen(regularFolder);
|
||||||
|
|
||||||
|
expect(screen.getByRole('link', { name: 'New dashboard' })).toBeInTheDocument();
|
||||||
|
expect(screen.getByText('New folder')).toBeInTheDocument();
|
||||||
|
expect(screen.queryByText('Import')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should hide Import button when both instance and folder are provisioned', async () => {
|
||||||
|
mockUseIsProvisionedInstance.mockReturnValue(true);
|
||||||
|
const provisionedFolder = mockFolderDTO(1, { managedBy: ManagerKind.Repo });
|
||||||
|
await renderAndOpen(provisionedFolder);
|
||||||
|
|
||||||
|
expect(screen.getByRole('link', { name: 'New dashboard' })).toBeInTheDocument();
|
||||||
|
expect(screen.getByText('New folder')).toBeInTheDocument();
|
||||||
|
expect(screen.queryByText('Import')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export default function CreateNewButton({
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{canCreateFolder && <MenuItem onClick={() => setShowNewFolderDrawer(true)} label={getNewFolderPhrase()} />}
|
{canCreateFolder && <MenuItem onClick={() => setShowNewFolderDrawer(true)} label={getNewFolderPhrase()} />}
|
||||||
{canCreateDashboard && (
|
{canCreateDashboard && !isProvisionedInstance && parentFolder?.managedBy !== ManagerKind.Repo && (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
label={getImportPhrase()}
|
label={getImportPhrase()}
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
|
|||||||
Reference in New Issue
Block a user