From 2de1b67c3c04841f387d0555578b311eb038b59b Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 22 Jan 2025 10:04:24 +0100 Subject: [PATCH] Wizard: Services step basics This adds basic structure of the Services step. --- .../CreateImageWizard/CreateImageWizard.tsx | 16 ++++- .../steps/Services/index.tsx | 16 +++++ .../steps/Details/Details.test.tsx | 1 + .../FileSystemConfiguration.test.tsx | 1 + .../steps/Firewall/Firewall.test.tsx | 5 +- .../steps/FirstBoot/Firstboot.test.tsx | 2 + .../steps/Hostname/Hostname.test.tsx | 1 + .../steps/ImageOutput/ImageOutput.test.tsx | 1 + .../steps/Kernel/Kernel.test.tsx | 1 + .../steps/Locale/Locale.test.tsx | 1 + .../steps/Oscap/Oscap.test.tsx | 1 + .../steps/Packages/Packages.test.tsx | 1 + .../steps/Registration/Registration.test.tsx | 1 + .../steps/Repositories/Repositories.test.tsx | 1 + .../steps/Review/Review.test.tsx | 1 + .../steps/Services/Services.test.tsx | 67 +++++++++++++++++++ .../steps/Snapshot/Snapshot.test.tsx | 1 + .../TargetEnvironment/AwsTarget.test.tsx | 1 + .../TargetEnvironment/AzureTarget.test.tsx | 1 + .../TargetEnvironment/GCPTarget.test.tsx | 1 + .../steps/Timezone/Timezone.test.tsx | 1 + .../steps/Users/Users.test.tsx | 1 + src/test/setup.ts | 2 + 23 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 src/Components/CreateImageWizard/steps/Services/index.tsx create mode 100644 src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx diff --git a/src/Components/CreateImageWizard/CreateImageWizard.tsx b/src/Components/CreateImageWizard/CreateImageWizard.tsx index 6e49c8991..6a6dd2677 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.tsx +++ b/src/Components/CreateImageWizard/CreateImageWizard.tsx @@ -27,6 +27,7 @@ import RegistrationStep from './steps/Registration'; import RepositoriesStep from './steps/Repositories'; import ReviewStep from './steps/Review'; import ReviewWizardFooter from './steps/Review/Footer/Footer'; +import ServicesStep from './steps/Services'; import SnapshotStep from './steps/Snapshot'; import Aws from './steps/TargetEnvironment/Aws'; import Azure from './steps/TargetEnvironment/Azure'; @@ -146,6 +147,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { const isHostnameEnabled = useFlag('image-builder.hostname.enabled'); const isKernelEnabled = useFlag('image-builder.kernel.enabled'); const isFirewallEnabled = useFlag('image-builder.firewall.enabled'); + const isServicesStepEnabled = useFlag('image-builder.services.enabled'); // Remove this and all fallthrough logic when snapshotting is enabled in Prod-stable // =========================TO REMOVE======================= @@ -236,7 +238,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { let startIndex = 1; // default index if (isEdit) { - startIndex = 21; + startIndex = 22; } // Duplicating some of the logic from the Wizard component to allow for custom nav items status @@ -541,6 +543,18 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { > , + + } + > + + , { + return ( +
+ + Systemd services + + Enable and disable systemd services. +
+ ); +}; + +export default ServicesStep; diff --git a/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx b/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx index bf0e528ce..963457154 100644 --- a/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx @@ -29,6 +29,7 @@ const goToDetailsStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script await clickNext(); // Details }; diff --git a/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx b/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx index ad78819ca..6381b4922 100644 --- a/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx @@ -118,6 +118,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // Details await enterBlueprintName(); await clickNext(); // Review diff --git a/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx b/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx index 40d6816bc..47292c1fe 100644 --- a/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx @@ -38,6 +38,7 @@ const goToFirewallStep = async () => { }; const goToReviewStep = async () => { + await clickNext(); // Services await clickNext(); // First boot script await clickNext(); // Details await enterBlueprintName(); @@ -56,12 +57,12 @@ describe('Step Firewall', () => { router = undefined; }); - test('clicking Next loads First boot', async () => { + test('clicking Next loads Services', async () => { await renderCreateMode(); await goToFirewallStep(); await clickNext(); await screen.findByRole('heading', { - name: 'First boot configuration', + name: 'Systemd services', }); }); diff --git a/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx b/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx index fa7e54f6d..e15c1f95a 100644 --- a/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx @@ -51,6 +51,7 @@ const goToFirstBootStep = async (): Promise => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First Boot }; @@ -76,6 +77,7 @@ const goFromOscapToFirstBoot = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script }; diff --git a/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx b/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx index 7502c37b0..ed4819462 100644 --- a/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx @@ -43,6 +43,7 @@ const goToHostnameStep = async () => { const goToReviewStep = async () => { await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx b/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx index 6fec42001..8af5f27c3 100644 --- a/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx @@ -141,6 +141,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx b/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx index 9af2bfe9c..cb535bd9a 100644 --- a/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx @@ -41,6 +41,7 @@ const goToKernelStep = async () => { const goToReviewStep = async () => { await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx b/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx index 8c5c94a6a..bad437de1 100644 --- a/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx @@ -42,6 +42,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx index 206e0a648..12dc8b502 100644 --- a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx @@ -104,6 +104,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // FirstBoot await clickNext(); // Details await enterBlueprintName('Oscap test'); diff --git a/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx b/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx index 258e6288b..6b6120c03 100644 --- a/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx @@ -58,6 +58,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First Boot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx b/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx index 9ef4dd7b6..de22fbc15 100644 --- a/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx @@ -101,6 +101,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // Details await enterBlueprintName(); await clickNext(); // Review diff --git a/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx b/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx index 6fb99cca3..aaf21d52f 100644 --- a/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx @@ -51,6 +51,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First Boot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx b/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx index 392c134a8..d2152f661 100644 --- a/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx @@ -59,6 +59,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script await clickNext(); // Details await clickNext(); // Review diff --git a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx new file mode 100644 index 000000000..6e1461044 --- /dev/null +++ b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx @@ -0,0 +1,67 @@ +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 goToServicesStep = 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 + await clickNext(); // Services +}; + +describe('Step Services', () => { + beforeEach(() => { + vi.clearAllMocks(); + router = undefined; + }); + + test('clicking Next loads First boot script', async () => { + await renderCreateMode(); + await goToServicesStep(); + await clickNext(); + await screen.findByRole('heading', { + name: 'First boot configuration', + }); + }); + + test('clicking Back loads Firewall', async () => { + await renderCreateMode(); + await goToServicesStep(); + await clickBack(); + await screen.findByRole('heading', { name: 'Firewall' }); + }); + + test('clicking Cancel loads landing page', async () => { + await renderCreateMode(); + await goToServicesStep(); + await verifyCancelButton(router); + }); +}); + +// TO DO 'Services step' -> 'revisit step button on Review works' +// TO DO 'Services request generated correctly' +// TO DO 'Services edit mode' diff --git a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx index abf589916..5a7f1e695 100644 --- a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx @@ -43,6 +43,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script await enterBlueprintName(); await clickNext(); // Review diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx index e75db8984..55e7dd19f 100644 --- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx @@ -50,6 +50,7 @@ const goToReview = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // FirstBoot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx index 61fec493a..f959dfa13 100644 --- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx @@ -50,6 +50,7 @@ const goToReview = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // FirstBoot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx index 1d0d99f34..ceed257b6 100644 --- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx @@ -45,6 +45,7 @@ const goToReview = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // FirstBoot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx b/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx index e239fde1c..5ae65d8c8 100644 --- a/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx @@ -42,6 +42,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot script await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx b/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx index dec9592b8..255a12832 100644 --- a/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx @@ -40,6 +40,7 @@ const goToReviewStep = async () => { await clickNext(); // Hostname await clickNext(); // Kernel await clickNext(); // Firewall + await clickNext(); // Services await clickNext(); // First boot await clickNext(); // Details await enterBlueprintName(); diff --git a/src/test/setup.ts b/src/test/setup.ts index 426ff99db..a0671bb89 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -75,6 +75,8 @@ vi.mock('@unleash/proxy-client-react', () => ({ return true; case 'image-builder.firewall.enabled': return true; + case 'image-builder.services.enabled': + return true; case 'edgeParity.image-list': return true; case 'image-builder.edge.local-image-table':