diff --git a/src/test/Components/CreateImageWizardV2/CreateImageWizard.azure.test.tsx b/src/test/Components/CreateImageWizardV2/CreateImageWizard.azure.test.tsx new file mode 100644 index 00000000..a082d029 --- /dev/null +++ b/src/test/Components/CreateImageWizardV2/CreateImageWizard.azure.test.tsx @@ -0,0 +1,289 @@ +import React from 'react'; +import '@testing-library/jest-dom'; + +import { screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { rest } from 'msw'; + +import CreateImageWizard from '../../../Components/CreateImageWizardV2/CreateImageWizard'; +import ShareImageModal from '../../../Components/ShareImageModal/ShareImageModal'; +import { PROVISIONING_API } from '../../../constants'; +import { server } from '../../mocks/server'; +import { + clickBack, + clickNext, + getNextButton, + renderCustomRoutesWithReduxRouter, + verifyCancelButton, +} from '../../testUtils'; + +const routes = [ + { + path: 'insights/image-builder/*', + element:
, + }, + { + path: 'insights/image-builder/imagewizard/:composeId?', + element: , + }, + { + path: 'insights/image-builder/share/:composeId', + element: , + }, +]; +jest.mock('@redhat-cloud-services/frontend-components/useChrome', () => ({ + useChrome: () => ({ + auth: { + getUser: () => { + return { + identity: { + internal: { + org_id: 5, + }, + }, + }; + }, + }, + isBeta: () => false, + isProd: () => true, + getEnvironment: () => 'prod', + }), +})); + +// @ts-ignore +let router = undefined; + +beforeAll(() => { + // scrollTo is not defined in jsdom + window.HTMLElement.prototype.scrollTo = function () {}; +}); + +afterEach(() => { + jest.clearAllMocks(); + router = undefined; + server.resetHandlers(); +}); + +const getSourceDropdown = async () => { + const sourceDropdown = await screen.findByRole('textbox', { + name: /select source/i, + }); + // Wait for isSuccess === true, dropdown is disabled while isSuccess === false + await waitFor(() => expect(sourceDropdown).toBeEnabled()); + return sourceDropdown; +}; + +describe('Step Upload to Azure', () => { + const user = userEvent.setup(); + const setUp = async () => { + ({ router } = await renderCustomRoutesWithReduxRouter( + 'imagewizard', + {}, + routes + )); + // select Azure as upload destination + await user.click(await screen.findByTestId('upload-azure')); + + await clickNext(); + + await screen.findByRole('heading', { + name: 'Target environment - Microsoft Azure', + }); + }; + + test('clicking Next loads Registration', async () => { + await setUp(); + + // await user.click(await screen.findByTestId('azure-radio-manual')); + await user.click( + screen.getByText(/manually enter the account information\./i) + ); + // Randomly generated GUID + await user.type( + screen.getByRole('textbox', { + name: /azure tenant guid/i, + }), + 'b8f86d22-4371-46ce-95e7-65c415f3b1e2' + ); + await user.type( + screen.getByRole('textbox', { + name: /subscription id/i, + }), + '60631143-a7dc-4d15-988b-ba83f3c99711' + ); + await user.type( + screen.getByRole('textbox', { + name: /resource group/i, + }), + 'testResourceGroup' + ); + await clickNext(); + + await screen.findByRole('textbox', { + name: 'Select activation key', + }); + + await screen.findByText( + 'Automatically register and enable advanced capabilities' + ); + }); + + test('clicking Back loads Release', async () => { + await setUp(); + + await clickBack(); + + await screen.findByTestId('upload-azure'); + }); + + test('clicking Cancel loads landing page', async () => { + await setUp(); + // @ts-ignore + await verifyCancelButton(router); + }); + + test('azure step basics works', async () => { + await setUp(); + const nextButton = await getNextButton(); + + // await user.click(await screen.findByTestId('azure-radio-manual')); + await user.click( + screen.getByText(/manually enter the account information\./i) + ); + + const tenantId = screen.getByRole('textbox', { + name: /azure tenant guid/i, + }); + expect(tenantId).toHaveValue(''); + expect(tenantId).toBeEnabled(); + await user.type(tenantId, 'c983c2cd-94d7-44e1-9c6e-9cfa3a40995f'); + const subscription = screen.getByRole('textbox', { + name: /subscription id/i, + }); + expect(subscription).toHaveValue(''); + expect(subscription).toBeEnabled(); + await user.type(subscription, 'f8f200aa-6234-4bfb-86c2-163d33dffc0c'); + const resourceGroup = screen.getByRole('textbox', { + name: /resource group/i, + }); + expect(resourceGroup).toHaveValue(''); + expect(resourceGroup).toBeEnabled(); + await user.type(resourceGroup, 'testGroup'); + + expect(nextButton).not.toHaveClass('pf-m-disabled'); + + await user.click( + screen.getByRole('radio', { + name: /use an account configured from sources\./i, + }) + ); + + await waitFor(() => expect(nextButton).toHaveClass('pf-m-disabled')); + + const sourceDropdown = await getSourceDropdown(); + + // manual values should be cleared out + expect( + screen.getByRole('textbox', { + name: /azure tenant guid/i, + }) + ).toHaveValue(''); + + expect( + screen.getByRole('textbox', { + name: /subscription id/i, + }) + ).toHaveValue(''); + + await user.click(sourceDropdown); + + await user.click( + await screen.findByRole('option', { + name: /azureSource1/i, + }) + ); + // wait for fetching the upload info + await waitFor(() => + expect( + screen.getByRole('textbox', { + name: /azure tenant guid/i, + }) + ).not.toHaveValue('') + ); + + await user.click( + await screen.findByRole('textbox', { + name: /select resource group/i, + }) + ); + const groups = screen.getAllByLabelText(/^Resource group/); + expect(groups).toHaveLength(2); + await user.click( + await screen.findByLabelText('Resource group myResourceGroup1') + ); + + expect(nextButton).not.toHaveClass('pf-m-disabled'); + }, 10000); + + test('handles change of selected Source', async () => { + await setUp(); + + const sourceDropdown = await getSourceDropdown(); + await user.click(sourceDropdown); + await user.click( + await screen.findByRole('option', { + name: /azureSource1/i, + }) + ); + + await waitFor(() => + expect( + screen.getByRole('textbox', { + name: /azure tenant guid/i, + }) + ).not.toHaveValue('') + ); + + await user.click(sourceDropdown); + await user.click( + await screen.findByRole('option', { + name: /azureSource2/i, + }) + ); + await waitFor(() => { + expect( + screen.getByRole('textbox', { + name: /azure tenant guid/i, + }) + ).toHaveValue('73d5694c-7a28-417e-9fca-55840084f508'); + }); + + await user.click( + await screen.findByRole('textbox', { + name: /select resource group/i, + }) + ); + const groups = await screen.findByLabelText(/^Resource group/); + expect(groups).toBeInTheDocument(); + expect( + await screen.findByLabelText('Resource group theirGroup2') + ).toBeVisible(); + }); + + test('component renders error state correctly', async () => { + server.use( + rest.get(`${PROVISIONING_API}/sources`, (req, res, ctx) => + res(ctx.status(500)) + ) + ); + + await setUp(); + + await screen.findByText( + /Sources cannot be reached, try again later or enter an account info for upload manually\./i + ); + }); + + // set test timeout to 15 seconds + // @ts-ignore +}, 15000);