debian-image-builder-frontend/src/test/Components/CreateImageWizard/wizardTestUtils.tsx
regexowl 8722d79fdf test: Move and re-enabled Details test
There was a disabled Details test in CreateImageWizard.test.tsx, this moves the test to Details.test.tsx, updates it and enables it again.

The re-enabled tests are checking maximum length of image name and description.
2024-10-14 13:50:36 +03:00

214 lines
6.2 KiB
TypeScript

import React from 'react';
import type { Router as RemixRouter } from '@remix-run/router';
import { screen, waitFor } from '@testing-library/react';
import { userEvent } from '@testing-library/user-event';
import ImageWizard from '../../../Components/CreateImageWizard';
import { RHEL_9 } from '../../../constants';
import {
CreateBlueprintRequest,
ImageRequest,
} from '../../../store/imageBuilderApi';
import { server } from '../../mocks/server';
import { renderCustomRoutesWithReduxRouter } from '../../testUtils';
type RequestTypes = 'GET' | 'PUT' | 'POST' | 'DELETE';
export function spyOnRequest(pathname: string, method: RequestTypes) {
return new Promise((resolve) => {
const listener = async ({ request: req }: { request: Request }) => {
const url = new URL(req.url);
if (url.pathname === pathname && req.method === method) {
const requestData = await req.clone().json();
resolve(requestData);
// Cleanup listener after successful intercept
server.events.removeListener('request:match', listener);
}
};
server.events.on('request:match', listener);
});
}
const routes = [
{
path: 'insights/image-builder/*',
element: <div />,
},
{
path: 'insights/image-builder/imagewizard/:composeId?',
element: <ImageWizard />,
},
];
export const imageRequest: ImageRequest = {
architecture: 'x86_64',
image_type: 'guest-image',
upload_request: {
options: {},
type: 'aws.s3',
},
};
export const blueprintRequest: CreateBlueprintRequest = {
name: 'Red Velvet',
description: '',
distribution: RHEL_9,
image_requests: [imageRequest],
customizations: {},
};
/**
* @example
* // returns 'imageWizard?release=rhel8&architecture=aarch64'
* preparePathname({ release: 'rhel8', architecture: 'aarch64' });
* @example
* // returns 'imageWizard'
* preparePathname({});
*/
function preparePathname(searchParams: { [key: string]: string } = {}): string {
let pathName = 'imageWizard';
const params = Object.entries(searchParams).map(
([param, value]) => `${param}=${value}`
);
if (params.length > 0) {
pathName += `?${params.join('&')}`;
}
return pathName;
}
export const renderCreateMode = async (searchParams = {}) => {
const pathName = preparePathname(searchParams);
await renderCustomRoutesWithReduxRouter(pathName, {}, routes);
};
export const renderEditMode = async (id: string) => {
await renderCustomRoutesWithReduxRouter(`imagewizard/${id}`, {}, routes);
};
export const selectGuestImageTarget = async () => {
const user = userEvent.setup();
const guestImageCheckBox = await screen.findByTestId('checkbox-guest-image');
await waitFor(() => user.click(guestImageCheckBox));
};
export const goToRegistrationStep = async () => {
await selectGuestImageTarget();
await clickNext();
};
export const clickRegisterLater = async () => {
const user = userEvent.setup();
await screen.findByRole('heading', {
name: /Register systems using this image/,
});
const registrationCheckbox = await screen.findByRole('checkbox', {
name: /automatically register and enable advanced capabilities/i,
});
await waitFor(() => user.click(registrationCheckbox));
};
export const goToOscapStep = async () => {
await clickNext(); // Registration
await clickRegisterLater();
await clickNext(); // OpenSCAP
};
export const selectCustomRepo = async () => {
const user = userEvent.setup();
await clickBack();
const customRepoCheckbox = await screen.findByRole('checkbox', {
name: /select row 0/i,
});
user.click(customRepoCheckbox);
await clickNext();
};
export const enterBlueprintName = async (name: string = 'Red Velvet') => {
const user = userEvent.setup({ delay: null });
const blueprintName = await screen.findByRole('textbox', {
name: /blueprint name/i,
});
await waitFor(() => user.clear(blueprintName));
await waitFor(() => expect(blueprintName).toHaveValue(''));
await waitFor(() => user.type(blueprintName, name));
};
export const openAndDismissSaveAndBuildModal = async () => {
const user = userEvent.setup();
const createBlueprintBtn = await screen.findByRole('button', {
name: 'Create blueprint',
});
await waitFor(async () => user.click(createBlueprintBtn));
const saveAndBuildModal = await screen.findByTestId(
'close-button-saveandbuild-modal'
);
await waitFor(() => user.click(saveAndBuildModal));
};
export const interceptBlueprintRequest = async (requestPathname: string) => {
const user = userEvent.setup();
const receivedRequestPromise = spyOnRequest(requestPathname, 'POST');
const saveButton = await screen.findByRole('button', {
name: 'Create blueprint',
});
await waitFor(() => user.click(saveButton));
return await receivedRequestPromise;
};
export const interceptEditBlueprintRequest = async (
requestPathname: string
) => {
const user = userEvent.setup();
const receivedRequestPromise = spyOnRequest(requestPathname, 'PUT');
const saveButton = await screen.findByRole('button', {
name: 'Save changes to blueprint',
});
await waitFor(() => user.click(saveButton));
return await receivedRequestPromise;
};
export const clickBack = async () => {
const user = userEvent.setup();
const backBtn = await screen.findByRole('button', { name: /Back/ });
await waitFor(() => user.click(backBtn));
};
export const clickNext = async () => {
const user = userEvent.setup();
const nextBtn = await screen.findByRole('button', { name: /Next/ });
await waitFor(() => user.click(nextBtn));
};
export const clickCancel = async () => {
const user = userEvent.setup();
const cancelBtn = await screen.findByRole('button', { name: /Cancel/ });
await waitFor(() => user.click(cancelBtn));
};
export const clickReviewAndFinish = async () => {
const user = userEvent.setup();
const reviewAndFinishBtn = await screen.findByRole('button', {
name: /Review and finish/,
});
await waitFor(() => user.click(reviewAndFinishBtn));
};
export const getNextButton = async () => {
const next = await screen.findByRole('button', { name: /Next/ });
return next;
};
export const verifyCancelButton = async (router: RemixRouter | undefined) => {
await clickCancel();
if (router) {
expect(router.state.location.pathname).toBe('/insights/image-builder');
}
};