From 21c1d749ce16bf78edf2f2f8c469729bc3b5a186 Mon Sep 17 00:00:00 2001
From: cyril-ui-developer
Date: Thu, 14 May 2026 17:14:35 -0400
Subject: [PATCH] Extend Unit Tests: Console-App - Core Navigation &
Orchestration
---
.../__tests__/access-mode.spec.tsx | 135 +++++++++
.../components/access-modes/access-mode.tsx | 4 +-
.../ClusterConfigurationCustomField.tsx | 4 +-
.../ClusterConfigurationForm.tsx | 21 +-
.../ClusterConfigurationCustomField.spec.tsx | 108 +++++++
.../ClusterConfigurationField.spec.tsx | 96 +++++++
.../ClusterConfigurationForm.spec.tsx | 77 +++++
.../ConsolePluginCSPStatusDetail.spec.tsx | 69 +++++
.../ConsolePluginDescriptionDetail.spec.tsx | 86 ++++++
.../ConsolePluginEnabledStatusDetail.spec.tsx | 139 +++++++++
.../ConsolePluginStatusDetail.spec.tsx | 93 +++++++
.../ConsolePluginVersionDetail.spec.tsx | 81 ++++++
.../__tests__/ClusterUpdateActivity.spec.tsx | 78 ++++++
.../__tests__/ControlPlaneStatus.spec.tsx | 145 ++++++++++
.../__tests__/OperatorStatus.spec.tsx | 132 +++++++++
.../NotLoadedDynamicPlugins.spec.tsx | 117 ++++++++
.../components/favorite/FavoriteNavItem.tsx | 8 +-
.../__tests__/FavoriteNavItem.spec.tsx | 81 ++++++
.../src/components/nav/NavItemHref.tsx | 7 +-
.../nav/__tests__/NavHeader.spec.tsx | 130 +++++++++
.../nav/__tests__/NavItemHref.spec.tsx | 115 ++++++++
.../components/nav/__tests__/NavLink.spec.tsx | 54 ++++
.../nav/__tests__/NavSection.spec.tsx | 194 +++++++++++++
.../nav/__tests__/Navigation.spec.tsx | 108 +++++++
.../nav/__tests__/PinnedResource.spec.tsx | 123 ++++++++
.../nav/__tests__/PluginNavItem.spec.tsx | 195 +++++++++++++
.../useConfirmNavUnpinModal.spec.tsx | 113 ++++++++
.../useNavExtensionForPerspective.spec.ts | 133 +++++++++
.../useNavExtensionsForSection.spec.ts | 121 ++++++++
.../components/nav/__tests__/utils.spec.ts | 263 ++++++++++++++++++
.../console-app/src/components/nav/index.tsx | 2 +-
.../__tests__/NodeDetailsConditions.spec.tsx | 141 ++++++++++
.../__tests__/NodeDetailsImages.spec.tsx | 117 ++++++++
.../nodes/__tests__/NodeIPList.spec.tsx | 71 +++++
.../nodes/__tests__/NodeRoles.spec.tsx | 63 +++++
.../__tests__/GroupsEditorModal.spec.tsx | 6 +-
.../BareMetalInventoryItems.spec.tsx | 6 +-
.../__tests__/NodeUptime.spec.tsx | 79 ++++++
.../__tests__/SchedulableStatus.spec.tsx | 111 ++++++++
.../__tests__/AvailabilityDisplay.spec.tsx | 95 +++++++
.../AvailabilityRequirement.spec.tsx | 103 +++++++
.../pdb/__tests__/DisruptionsAllowed.spec.tsx | 85 ++++++
.../__tests__/QuickStartDrawer.spec.tsx | 88 ++++++
.../__tests__/QuickStartEmptyState.spec.tsx | 102 +++++++
.../QuickStartPermissionChecker.spec.tsx | 108 +++++++
.../ClusterResourceQuotaCharts.spec.tsx | 115 ++++++++
.../__tests__/ResourceQuotaCharts.spec.tsx | 111 ++++++++
.../resource-quota/__tests__/utils.spec.ts | 124 +++++++++
.../__tests__/volume-mode.spec.tsx | 97 +++++++
.../locales/en/console-shared.json | 2 +
.../cluster-configuration/FormLayout.tsx | 4 +
.../error/fallbacks/ErrorBoundaryInline.tsx | 10 +-
52 files changed, 4651 insertions(+), 19 deletions(-)
create mode 100644 frontend/packages/console-app/src/components/access-modes/__tests__/access-mode.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/cluster-configuration/__tests__/ClusterConfigurationCustomField.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/cluster-configuration/__tests__/ClusterConfigurationField.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/cluster-configuration/__tests__/ClusterConfigurationForm.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/console-operator/__tests__/ConsolePluginCSPStatusDetail.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/console-operator/__tests__/ConsolePluginDescriptionDetail.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/console-operator/__tests__/ConsolePluginEnabledStatusDetail.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/console-operator/__tests__/ConsolePluginStatusDetail.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/console-operator/__tests__/ConsolePluginVersionDetail.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/dashboards-page/__tests__/ClusterUpdateActivity.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/dashboards-page/__tests__/ControlPlaneStatus.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/dashboards-page/__tests__/OperatorStatus.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/dashboards-page/dynamic-plugins-health-resource/__tests__/NotLoadedDynamicPlugins.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/favorite/__tests__/FavoriteNavItem.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/NavHeader.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/NavItemHref.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/NavLink.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/NavSection.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/Navigation.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/PinnedResource.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/PluginNavItem.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/useConfirmNavUnpinModal.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/useNavExtensionForPerspective.spec.ts
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/useNavExtensionsForSection.spec.ts
create mode 100644 frontend/packages/console-app/src/components/nav/__tests__/utils.spec.ts
create mode 100644 frontend/packages/console-app/src/components/nodes/__tests__/NodeDetailsConditions.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nodes/__tests__/NodeDetailsImages.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nodes/__tests__/NodeIPList.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nodes/__tests__/NodeRoles.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nodes/node-dashboard/__tests__/NodeUptime.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/nodes/status/__tests__/SchedulableStatus.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/pdb/__tests__/AvailabilityDisplay.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/pdb/__tests__/AvailabilityRequirement.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/pdb/__tests__/DisruptionsAllowed.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/quick-starts/__tests__/QuickStartDrawer.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/quick-starts/__tests__/QuickStartEmptyState.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/quick-starts/loader/__tests__/QuickStartPermissionChecker.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/resource-quota/__tests__/ClusterResourceQuotaCharts.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/resource-quota/__tests__/ResourceQuotaCharts.spec.tsx
create mode 100644 frontend/packages/console-app/src/components/resource-quota/__tests__/utils.spec.ts
create mode 100644 frontend/packages/console-app/src/components/volume-modes/__tests__/volume-mode.spec.tsx
diff --git a/frontend/packages/console-app/src/components/access-modes/__tests__/access-mode.spec.tsx b/frontend/packages/console-app/src/components/access-modes/__tests__/access-mode.spec.tsx
new file mode 100644
index 00000000000..20ef7435cac
--- /dev/null
+++ b/frontend/packages/console-app/src/components/access-modes/__tests__/access-mode.spec.tsx
@@ -0,0 +1,135 @@
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import type { PersistentVolumeClaimKind } from '@console/internal/module/k8s';
+import { AccessModeSelector, getPVCAccessModes } from '../access-mode';
+
+jest.mock('@console/internal/components/storage/shared', () => ({
+ getAccessModeOptions: () => [
+ { value: 'ReadWriteOnce', title: 'Single user (RWO)' },
+ { value: 'ReadWriteMany', title: 'Shared access (RWX)' },
+ { value: 'ReadOnlyMany', title: 'Read only (ROX)' },
+ { value: 'ReadWriteOncePod', title: 'Read write once pod (RWOP)' },
+ ],
+ getAccessModeForProvisioner: jest.fn(() => ['ReadWriteOnce', 'ReadWriteMany']),
+}));
+
+describe('AccessModeSelector', () => {
+ describe('getPVCAccessModes', () => {
+ it('should return access mode titles from PVC resource', () => {
+ const mockPVC = {
+ apiVersion: 'v1',
+ kind: 'PersistentVolumeClaim',
+ metadata: { name: 'test-pvc', namespace: 'default' },
+ spec: {
+ accessModes: ['ReadWriteOnce'],
+ resources: { requests: { storage: '1Gi' } },
+ storageClassName: 'gp2',
+ },
+ } as PersistentVolumeClaimKind;
+
+ const result = getPVCAccessModes(mockPVC, 'title');
+ expect(result).toEqual(['Single user (RWO)']);
+ });
+
+ it('should return access mode values from PVC resource', () => {
+ const mockPVC = {
+ apiVersion: 'v1',
+ kind: 'PersistentVolumeClaim',
+ metadata: { name: 'test-pvc', namespace: 'default' },
+ spec: {
+ accessModes: ['ReadWriteMany'],
+ resources: { requests: { storage: '1Gi' } },
+ storageClassName: 'gp2',
+ },
+ } as PersistentVolumeClaimKind;
+
+ const result = getPVCAccessModes(mockPVC, 'value');
+ expect(result).toEqual(['ReadWriteMany']);
+ });
+
+ it('should return empty array when PVC has no access modes', () => {
+ const mockPVC = {
+ apiVersion: 'v1',
+ kind: 'PersistentVolumeClaim',
+ metadata: { name: 'test-pvc', namespace: 'default' },
+ spec: {
+ accessModes: [],
+ resources: { requests: { storage: '1Gi' } },
+ storageClassName: 'gp2',
+ },
+ } as PersistentVolumeClaimKind;
+
+ const result = getPVCAccessModes(mockPVC, 'value');
+ expect(result).toEqual([]);
+ });
+
+ it('should handle undefined PVC resource', () => {
+ const result = getPVCAccessModes(undefined, 'value');
+ expect(result).toEqual([]);
+ });
+ });
+
+ describe('AccessModeSelector', () => {
+ const defaultProps = {
+ onChange: jest.fn(),
+ loaded: true,
+ provisioner: 'kubernetes.io/aws-ebs',
+ };
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should render access mode label', () => {
+ render();
+
+ expect(screen.getByText('Access mode')).toBeVisible();
+ });
+
+ it('should show loading skeleton when not loaded', () => {
+ render();
+
+ expect(screen.getByText('Access mode')).toBeVisible();
+ expect(screen.getByRole('status', { busy: true })).toBeVisible();
+ });
+
+ it('should render select dropdown when loaded', async () => {
+ render();
+
+ expect(await screen.findByRole('button')).toBeVisible();
+ });
+
+ it('should display description when provided', async () => {
+ const description = 'Select the access mode for your storage';
+ render();
+
+ expect(await screen.findByText(description)).toBeVisible();
+ });
+
+ it('should open dropdown when clicked', async () => {
+ const user = userEvent.setup();
+ render();
+
+ const toggle = await screen.findByRole('button');
+ await user.click(toggle);
+
+ expect(await screen.findByRole('listbox')).toBeVisible();
+ });
+
+ it('should call onChange when access mode is selected', async () => {
+ const user = userEvent.setup();
+ const onChange = jest.fn();
+ render();
+
+ const toggle = await screen.findByRole('button');
+ await user.click(toggle);
+
+ expect(await screen.findByRole('listbox')).toBeVisible();
+
+ const option = screen.getByText('Shared access (RWX)');
+ await user.click(option);
+
+ expect(onChange).toHaveBeenCalledWith('ReadWriteMany');
+ });
+ });
+});
diff --git a/frontend/packages/console-app/src/components/access-modes/access-mode.tsx b/frontend/packages/console-app/src/components/access-modes/access-mode.tsx
index c979e104dee..556a1af84a2 100644
--- a/frontend/packages/console-app/src/components/access-modes/access-mode.tsx
+++ b/frontend/packages/console-app/src/components/access-modes/access-mode.tsx
@@ -146,7 +146,9 @@ export const AccessModeSelector: FC = (props) => {
{description}
)}
- {(!loaded || !allowedAccessModes) && }
+ {(!loaded || !allowedAccessModes) && (
+
+ )}
);
};
diff --git a/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationCustomField.tsx b/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationCustomField.tsx
index 91ab8cd32a1..975a9bfaa8e 100644
--- a/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationCustomField.tsx
+++ b/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationCustomField.tsx
@@ -20,7 +20,9 @@ const ClusterConfigurationCustomField: FC
return (
-
+
+
+
);
diff --git a/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationForm.tsx b/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationForm.tsx
index 18a80de41c7..52c3600f3e1 100644
--- a/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationForm.tsx
+++ b/frontend/packages/console-app/src/components/cluster-configuration/ClusterConfigurationForm.tsx
@@ -1,18 +1,29 @@
import type { FC } from 'react';
import { Form } from '@patternfly/react-core';
+import { useTranslation } from 'react-i18next';
import ClusterConfigurationField from './ClusterConfigurationField';
import type { ResolvedClusterConfigurationItem } from './types';
type ClusterConfigurationFormProps = {
- items: ResolvedClusterConfigurationItem[];
+ items?: ResolvedClusterConfigurationItem[];
};
-const ClusterConfigurationForm: FC = ({ items }) =>
- items?.length > 0 ? (
-