Wizard: Add unleash flag and update tests

This gates the step behind an unleash flag and updates the existing tests so they pass with the new step added.
This commit is contained in:
regexowl 2025-01-14 10:56:42 +01:00 committed by Lucas Garfield
parent e6bc0d429a
commit 3167effa1b
22 changed files with 112 additions and 5 deletions

View file

@ -15,6 +15,7 @@ import { useNavigate, useSearchParams } from 'react-router-dom';
import DetailsStep from './steps/Details';
import FileSystemStep from './steps/FileSystem';
import { FileSystemContext } from './steps/FileSystem/FileSystemTable';
import FirewallStep from './steps/Firewall';
import FirstBootStep from './steps/FirstBoot';
import HostnameStep from './steps/Hostname';
import ImageOutputStep from './steps/ImageOutput';
@ -142,6 +143,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => {
const isLocaleEnabled = useFlag('image-builder.locale.enabled');
const isHostnameEnabled = useFlag('image-builder.hostname.enabled');
const isKernelEnabled = useFlag('image-builder.kernel.enabled');
const isFirewallEnabled = useFlag('image-builder.firewall.enabled');
// Remove this and all fallthrough logic when snapshotting is enabled in Prod-stable
// =========================TO REMOVE=======================
@ -228,7 +230,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => {
let startIndex = 1; // default index
if (isEdit) {
startIndex = 20;
startIndex = 21;
}
// Duplicating some of the logic from the Wizard component to allow for custom nav items status
@ -518,11 +520,14 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => {
name="Firewall"
id="wizard-firewall"
key="wizard-firewall"
isHidden={true}
navItem={customStatusNavItem}
isHidden={!isFirewallEnabled}
footer={
<CustomWizardFooter disableNext={false} optional={true} />
}
></WizardStep>,
>
<FirewallStep />
</WizardStep>,
<WizardStep
name="First boot script configuration"
id="wizard-first-boot"

View file

@ -0,0 +1,16 @@
import React from 'react';
import { Text, Form, Title } from '@patternfly/react-core';
const FirewallStep = () => {
return (
<Form>
<Title headingLevel="h1" size="xl">
Firewall
</Title>
<Text>Customize firewall settings for your image.</Text>
</Form>
);
};
export default FirewallStep;

View file

@ -28,6 +28,7 @@ const goToDetailsStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot script
await clickNext(); // Details
};

View file

@ -117,6 +117,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // Details
await enterBlueprintName();
await clickNext(); // Review

View file

@ -0,0 +1,66 @@
import type { Router as RemixRouter } from '@remix-run/router';
import { screen, waitFor } from '@testing-library/react';
import { userEvent } from '@testing-library/user-event';
import {
clickBack,
clickNext,
verifyCancelButton,
} from '../../wizardTestUtils';
import { clickRegisterLater, renderCreateMode } from '../../wizardTestUtils';
let router: RemixRouter | undefined = undefined;
const goToFirewallStep = async () => {
const user = userEvent.setup();
const guestImageCheckBox = await screen.findByRole('checkbox', {
name: /virtualization guest image checkbox/i,
});
await waitFor(() => user.click(guestImageCheckBox));
await clickNext(); // Registration
await clickRegisterLater();
await clickNext(); // OpenSCAP
await clickNext(); // File system configuration
await clickNext(); // Snapshots
await clickNext(); // Custom repositories
await clickNext(); // Additional packages
await clickNext(); // Users
await clickNext(); // Timezone
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
};
describe('Step Firewall', () => {
beforeEach(() => {
vi.clearAllMocks();
router = undefined;
});
test('clicking Next loads First boot', async () => {
await renderCreateMode();
await goToFirewallStep();
await clickNext();
await screen.findByRole('heading', {
name: 'First boot configuration',
});
});
test('clicking Back loads Kernel', async () => {
await renderCreateMode();
await goToFirewallStep();
await clickBack();
await screen.findByRole('heading', { name: 'Kernel' });
});
test('clicking Cancel loads landing page', async () => {
await renderCreateMode();
await goToFirewallStep();
await verifyCancelButton(router);
});
});
// TO DO Step Firewall -> revisit step button on Review works
// TO DO Firewall request generated correctly
// TO DO Firewall edit mode

View file

@ -50,6 +50,7 @@ const goToFirstBootStep = async (): Promise<void> => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First Boot
};
@ -74,6 +75,7 @@ const goFromOscapToFirstBoot = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot script
};

View file

@ -42,6 +42,7 @@ const goToHostnameStep = async () => {
const goToReviewStep = async () => {
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot script
await clickNext(); // Details
await enterBlueprintName();

View file

@ -140,6 +140,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -37,12 +37,12 @@ describe('Step Kernel', () => {
router = undefined;
});
test('clicking Next loads First boot script', async () => {
test('clicking Next loads Firewall', async () => {
await renderCreateMode();
await goToKernelStep();
await clickNext();
await screen.findByRole('heading', {
name: 'First boot configuration',
name: 'Firewall',
});
});

View file

@ -41,6 +41,7 @@ const goToLocaleStep = async () => {
const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -103,6 +103,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName('Oscap test');

View file

@ -57,6 +57,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First Boot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -100,6 +100,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // Details
await enterBlueprintName();
await clickNext(); // Review

View file

@ -50,6 +50,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First Boot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -58,6 +58,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot script
await clickNext(); // Details
await clickNext(); // Review

View file

@ -42,6 +42,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot script
await enterBlueprintName();
await clickNext(); // Review

View file

@ -49,6 +49,7 @@ const goToReview = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -49,6 +49,7 @@ const goToReview = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -44,6 +44,7 @@ const goToReview = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -41,6 +41,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot script
await clickNext(); // Details
await enterBlueprintName();

View file

@ -39,6 +39,7 @@ const goToReviewStep = async () => {
await clickNext(); // Locale
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
await clickNext(); // First boot
await clickNext(); // Details
await enterBlueprintName();

View file

@ -73,6 +73,8 @@ vi.mock('@unleash/proxy-client-react', () => ({
return true;
case 'image-builder.kernel.enabled':
return true;
case 'image-builder.firewall.enabled':
return true;
case 'edgeParity.image-list':
return true;
case 'image-builder.edge.local-image-table':