Provisioning: Prevent dashboard imports on provisioned folders (#111476)

This commit is contained in:
Stephanie Hingtgen
2025-09-23 14:24:04 +00:00
committed by GitHub
parent 94b82b0e5e
commit ab9f2dc9ef
2 changed files with 50 additions and 1 deletions
@@ -2,12 +2,20 @@ import { render as rtlRender, screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
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 { mockFolderDTO } from '../fixtures/folder.fixture';
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();
function render(...[ui, options]: Parameters<typeof rtlRender>) {
@@ -21,6 +29,9 @@ async function renderAndOpen(folder?: FolderDTO) {
}
describe('NewActionsButton', () => {
beforeEach(() => {
mockUseIsProvisionedInstance.mockReturnValue(false);
});
it('should display the correct urls with a given parent folder', async () => {
await renderAndOpen(mockParentFolder);
@@ -75,4 +86,42 @@ describe('NewActionsButton', () => {
expect(screen.queryByText('Import')).not.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()} />}
{canCreateDashboard && (
{canCreateDashboard && !isProvisionedInstance && parentFolder?.managedBy !== ManagerKind.Repo && (
<MenuItem
label={getImportPhrase()}
onClick={() =>