diff --git a/src/Components/CreateImageWizard/CreateImageWizard.js b/src/Components/CreateImageWizard/CreateImageWizard.js index 76e4745c..e2e388bd 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.js +++ b/src/Components/CreateImageWizard/CreateImageWizard.js @@ -28,7 +28,7 @@ import { import './CreateImageWizard.scss'; import api from '../../api'; import { UNIT_GIB, UNIT_KIB, UNIT_MIB } from '../../constants'; -import { getDistroRepoUrls } from '../../repos'; +import { useGetArchitecturesByDistributionQuery } from '../../store/apiSlice'; import { composeAdded } from '../../store/composesSlice'; import { fetchRepositories } from '../../store/repositoriesSlice'; import isRhel from '../../Utilities/isRhel'; @@ -241,6 +241,14 @@ const parseSizeUnit = (bytesize) => { return [size, unit]; }; +const getDistributionRepoUrls = (distributionInformation) => { + const filteredArchx86_64 = distributionInformation.find((info) => { + return info.arch === 'x86_64'; + }); + const mapped = filteredArchx86_64.repositories.map((repo) => repo.baseurl); + return mapped; +}; + const getPackageDescription = async (release, arch, repoUrls, packageName) => { let pack; // if the env is stage beta then use content-sources api @@ -348,30 +356,36 @@ const requestToState = (composeRequest) => { // customizations // packages const packs = []; + let distroRepoUrls = []; const distro = composeRequest?.distribution; - const distroRepoUrls = getDistroRepoUrls(distro); - const payloadRepositories = - composeRequest?.customizations?.payload_repositories?.map( - (repo) => repo.baseurl - ); - const repoUrls = [...distroRepoUrls]; - payloadRepositories ? repoUrls.push(...payloadRepositories) : null; - composeRequest?.customizations?.packages?.forEach(async (packName) => { - const packageDescription = await getPackageDescription( - distro, - imageRequest?.architecture, - repoUrls, - packName - ); - const pack = { - name: packName, - summary: packageDescription, - }; - packs.push(pack); - }); - formState['selected-packages'] = packs; + const { data: distributionInformation, isSuccess: isSuccessDistroInfo } = + useGetArchitecturesByDistributionQuery(distro); + + if (isSuccessDistroInfo) { + distroRepoUrls = getDistributionRepoUrls(distributionInformation); + const payloadRepositories = + composeRequest?.customizations?.payload_repositories?.map( + (repo) => repo.baseurl + ); + const repoUrls = [...distroRepoUrls]; + payloadRepositories ? repoUrls.push(...payloadRepositories) : null; + composeRequest?.customizations?.packages?.forEach(async (packName) => { + const packageDescription = await getPackageDescription( + distro, + imageRequest?.architecture, + repoUrls, + packName + ); + const pack = { + name: packName, + summary: packageDescription, + }; + packs.push(pack); + }); + formState['selected-packages'] = packs; + } // repositories // 'original-payload-repositories' is treated as read-only and is used to populate diff --git a/src/Components/CreateImageWizard/formComponents/Packages.js b/src/Components/CreateImageWizard/formComponents/Packages.js index 9b610bb4..14934b77 100644 --- a/src/Components/CreateImageWizard/formComponents/Packages.js +++ b/src/Components/CreateImageWizard/formComponents/Packages.js @@ -26,17 +26,24 @@ import { import PropTypes from 'prop-types'; import api from '../../../api'; -import { repos } from '../../../repos'; +import { useGetArchitecturesByDistributionQuery } from '../../../store/apiSlice'; export const RedHatPackages = ({ defaultArch }) => { const { getState } = useFormApi(); + const distribution = getState()?.values?.release; + const { data: distributionInformation, isSuccess: isSuccessDistroInfo } = + useGetArchitecturesByDistributionQuery(distribution); const getAllPackages = async (packagesSearchName) => { // if the env is stage beta then use content-sources api // else use image-builder api if (insights.chrome.isBeta()) { - const distribution = getState()?.values?.release; - const repoUrls = repos[distribution].map((repo) => repo.url); + const filteredArchx86_64 = distributionInformation.find( + (info) => info.arch === 'x86_64' + ); + const repoUrls = filteredArchx86_64.repositories.map( + (repo) => repo.baseurl + ); return await api.getPackagesContentSources(repoUrls, packagesSearchName); } else { const args = [ @@ -56,7 +63,9 @@ export const RedHatPackages = ({ defaultArch }) => { } }; - return ; + return ( + + ); }; export const ContentSourcesPackages = () => { @@ -71,7 +80,7 @@ export const ContentSourcesPackages = () => { return ; }; -const Packages = ({ getAllPackages }) => { +const Packages = ({ getAllPackages, isSuccess }) => { const { change, getState } = useFormApi(); const [packagesSearchName, setPackagesSearchName] = useState(undefined); const [filterChosen, setFilterChosen] = useState(''); @@ -99,8 +108,10 @@ const Packages = ({ getAllPackages }) => { }, []); useEffect(() => { - firstInputElement.current?.focus(); - }, []); + if (isSuccess) { + firstInputElement.current?.focus(); + } + }, [isSuccess]); const searchResultsComparator = useCallback((searchTerm) => { return (a, b) => { @@ -266,6 +277,7 @@ const Packages = ({ getAllPackages }) => { onSearch={handleAvailablePackagesSearch} resetButtonLabel="Clear available packages search" onClear={handleClearAvailableSearch} + isDisabled={!isSuccess} /> } > @@ -392,4 +404,5 @@ RedHatPackages.propTypes = { Packages.propTypes = { getAllPackages: PropTypes.func, + isSuccess: PropTypes.bool, }; diff --git a/src/store/apiSlice.js b/src/store/apiSlice.js index 1724a015..483c6ad9 100644 --- a/src/store/apiSlice.js +++ b/src/store/apiSlice.js @@ -1,6 +1,6 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; -import { PROVISIONING_SOURCES_ENDPOINT } from '../constants'; +import { IMAGE_BUILDER_API, PROVISIONING_SOURCES_ENDPOINT } from '../constants'; export const apiSlice = createApi({ reducerPath: 'api', @@ -41,7 +41,15 @@ export const apiSlice = createApi({ return awsSources; }, }), + getArchitecturesByDistribution: builder.query({ + query: (distribution) => + `${IMAGE_BUILDER_API}/architectures/${distribution}`, + }), }), }); -export const { useGetAWSSourcesQuery, usePrefetch } = apiSlice; +export const { + useGetAWSSourcesQuery, + useGetArchitecturesByDistributionQuery, + usePrefetch, +} = apiSlice; diff --git a/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js b/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js index 8d1f62e8..a8e74445 100644 --- a/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js +++ b/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js @@ -34,25 +34,6 @@ function getNextButton() { return next; } -// packages -const mockPkgResultContentSources = [ - { - name: 'testPkg', - summary: 'test package summary', - version: '1.0', - }, - { - name: 'lib-test', - summary: 'lib-test package summary', - version: '1.0', - }, - { - name: 'test', - summary: 'summary for test package', - version: '1.0', - }, -]; - const mockPkgResultAlphaContentSources = [ { name: 'lib-test', @@ -71,8 +52,6 @@ const mockPkgResultAlphaContentSources = [ }, ]; -const mockPkgResultEmptyContentSources = []; - const mockRepositoryResults = { data: [ { @@ -771,19 +750,18 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); - const availablePackagesList = screen.getByTestId('available-pkgs-list'); - const availablePackagesItems = within(availablePackagesList).getAllByRole( - 'option' + const availablePackagesList = await screen.findByTestId( + 'available-pkgs-list' ); + const availablePackagesItems = await within( + availablePackagesList + ).findAllByRole('option'); expect(availablePackagesItems).toHaveLength(3); const [firstItem, secondItem, thirdItem] = availablePackagesItems; expect(firstItem).toHaveTextContent('testsummary for test package'); @@ -796,14 +774,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByTestId('available-pkgs-testPkg').click(); screen.getByRole('button', { name: /Add selected/ }).click(); @@ -827,14 +802,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByRole('button', { name: /Add all/ }).click(); screen.getByRole('button', { name: /Remove all/ }).click(); @@ -854,13 +826,12 @@ describe('Step Packages', () => { await setUp(); const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByRole('button', { name: /Add all/ }).click(); // remove a single package @@ -885,16 +856,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => - Promise.resolve(mockPkgResultEmptyContentSources) - ); - await searchForAvailablePackages(searchbox, 'asdf'); - expect(getPackages).toHaveBeenCalledTimes(1); await screen.findByText('No packages found'); }); @@ -905,13 +871,10 @@ describe('Step Packages', () => { const searchboxAvailable = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref const searchboxChosen = screen.getAllByRole('textbox')[1]; - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - + expect(searchboxAvailable).toBeDisabled(); + await waitFor(() => expect(searchboxAvailable).toBeEnabled()); searchboxAvailable.click(); await searchForAvailablePackages(searchboxAvailable, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByRole('button', { name: /Add all/ }).click(); @@ -928,6 +891,8 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); const getPackages = jest @@ -956,14 +921,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); const availablePackagesList = screen.getByTestId('available-pkgs-list'); const availablePackagesItems = within(availablePackagesList).getAllByRole( @@ -983,14 +945,11 @@ describe('Step Packages', () => { const availableSearchbox = screen.getAllByRole('textbox')[0]; + expect(availableSearchbox).toBeDisabled(); + await waitFor(() => expect(availableSearchbox).toBeEnabled()); availableSearchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - await searchForAvailablePackages(availableSearchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); const availablePackagesList = screen.getByTestId('available-pkgs-list'); const availablePackagesItems = within(availablePackagesList).getAllByRole( @@ -1006,7 +965,7 @@ describe('Step Packages', () => { const chosenSearchbox = screen.getAllByRole('textbox')[1]; chosenSearchbox.click(); - await searchForChosenPackages(chosenSearchbox, 'Pkg'); + await searchForChosenPackages(chosenSearchbox, 'lib'); chosenPackagesItems = within(chosenPackagesList).getAllByRole('option'); // eslint-disable-next-line jest-dom/prefer-in-document expect(chosenPackagesItems).toHaveLength(1); @@ -1307,20 +1266,18 @@ describe('Click through all steps', () => { within(rows[2]).getByRole('option', { name: 'MiB' }).click(); getNextButton().click(); - // packages - const getPackages = jest - .spyOn(api, 'getPackagesContentSources') - .mockImplementation(() => Promise.resolve(mockPkgResultContentSources)); - screen.getByText( /Images built with Image Builder include all required packages/i ); const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); + await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen - .getByRole('option', { name: /testPkg test package summary/ }) + .getByRole('option', { name: /test summary for test package/ }) .click(); screen.getByRole('button', { name: /Add selected/ }).click(); getNextButton().click(); @@ -1400,7 +1357,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, diff --git a/src/test/Components/CreateImageWizard/CreateImageWizard.test.js b/src/test/Components/CreateImageWizard/CreateImageWizard.test.js index 9f1783ce..5d284490 100644 --- a/src/test/Components/CreateImageWizard/CreateImageWizard.test.js +++ b/src/test/Components/CreateImageWizard/CreateImageWizard.test.js @@ -40,29 +40,6 @@ function verifyCancelButton(cancel, history) { expect(history.location.pathname).toBe('/insights/image-builder'); } -// packages -const mockPkgResult = { - meta: { count: 3 }, - links: { first: '', last: '' }, - data: [ - { - name: 'testPkg', - summary: 'test package summary', - version: '1.0', - }, - { - name: 'lib-test', - summary: 'lib-test package summary', - version: '1.0', - }, - { - name: 'test', - summary: 'summary for test package', - version: '1.0', - }, - ], -}; - const mockPkgResultAlpha = { meta: { count: 3 }, links: { first: '', last: '' }, @@ -109,12 +86,6 @@ const mockPkgResultAll = { }), }; -const mockPkgResultEmpty = { - meta: { count: 0 }, - links: { first: '', last: '' }, - data: null, -}; - const searchForAvailablePackages = async (searchbox, searchTerm) => { userEvent.type(searchbox, searchTerm); await act(async () => { @@ -788,14 +759,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); const availablePackagesList = screen.getByTestId('available-pkgs-list'); const availablePackagesItems = within(availablePackagesList).getAllByRole( @@ -813,14 +781,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByTestId('available-pkgs-testPkg').click(); screen.getByRole('button', { name: /Add selected/ }).click(); @@ -844,14 +809,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByRole('button', { name: /Add all/ }).click(); screen.getByRole('button', { name: /Remove all/ }).click(); @@ -871,13 +833,12 @@ describe('Step Packages', () => { await setUp(); const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByRole('button', { name: /Add all/ }).click(); // remove a single package @@ -915,14 +876,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResultEmpty)); - await searchForAvailablePackages(searchbox, 'asdf'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByText('No packages found'); }); @@ -931,21 +889,18 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - let getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - await searchForAvailablePackages(searchbox, 'test'); - getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResultEmpty)); + screen + .getByRole('button', { name: /clear available packages search/i }) + .click(); await searchForAvailablePackages(searchbox, 'asdf'); - expect(getPackages).toHaveBeenCalledTimes(2); screen.getByText('No packages found'); }); @@ -955,13 +910,10 @@ describe('Step Packages', () => { const searchboxAvailable = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref const searchboxChosen = screen.getAllByRole('textbox')[1]; - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - + expect(searchboxAvailable).toBeDisabled(); + await waitFor(() => expect(searchboxAvailable).toBeEnabled()); searchboxAvailable.click(); await searchForAvailablePackages(searchboxAvailable, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen.getByRole('button', { name: /Add all/ }).click(); @@ -978,6 +930,8 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); const getPackages = jest @@ -1003,6 +957,8 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); const getPackages = jest @@ -1029,14 +985,11 @@ describe('Step Packages', () => { const searchbox = screen.getAllByRole('textbox')[0]; + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); searchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); const availablePackagesList = screen.getByTestId('available-pkgs-list'); const availablePackagesItems = within(availablePackagesList).getAllByRole( @@ -1056,14 +1009,11 @@ describe('Step Packages', () => { const availableSearchbox = screen.getAllByRole('textbox')[0]; + expect(availableSearchbox).toBeDisabled(); + await waitFor(() => expect(availableSearchbox).toBeEnabled()); availableSearchbox.click(); - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - await searchForAvailablePackages(availableSearchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); const availablePackagesList = screen.getByTestId('available-pkgs-list'); const availablePackagesItems = within(availablePackagesList).getAllByRole( @@ -1079,8 +1029,10 @@ describe('Step Packages', () => { const chosenSearchbox = screen.getAllByRole('textbox')[1]; chosenSearchbox.click(); - await searchForChosenPackages(chosenSearchbox, 'Pkg'); - chosenPackagesItems = within(chosenPackagesList).getAllByRole('option'); + await searchForChosenPackages(chosenSearchbox, 'lib'); + chosenPackagesItems = await within(chosenPackagesList).findAllByRole( + 'option' + ); // eslint-disable-next-line jest-dom/prefer-in-document expect(chosenPackagesItems).toHaveLength(1); @@ -1463,20 +1415,18 @@ describe('Click through all steps', () => { within(rows[2]).getByRole('option', { name: 'MiB' }).click(); getNextButton().click(); - // packages - const getPackages = jest - .spyOn(api, 'getPackages') - .mockImplementation(() => Promise.resolve(mockPkgResult)); - screen.getByText( /Images built with Image Builder include all required packages/i ); const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref + + expect(searchbox).toBeDisabled(); + await waitFor(() => expect(searchbox).toBeEnabled()); + await searchForAvailablePackages(searchbox, 'test'); - expect(getPackages).toHaveBeenCalledTimes(1); screen - .getByRole('option', { name: /testPkg test package summary/ }) + .getByRole('option', { name: /test summary for test package/ }) .click(); screen.getByRole('button', { name: /Add selected/ }).click(); getNextButton().click(); @@ -1554,7 +1504,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, @@ -1596,7 +1546,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, @@ -1640,7 +1590,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, @@ -1680,7 +1630,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, @@ -1720,7 +1670,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, @@ -1760,7 +1710,7 @@ describe('Click through all steps', () => { min_size: 104857600, }, ], - packages: ['testPkg'], + packages: ['test'], subscription: { 'activation-key': 'name0', insights: true, @@ -1889,6 +1839,8 @@ describe('Keyboard accessibility', () => { name: /search input/i, }); }); + expect(availablePackagesInput).toBeDisabled(); + await waitFor(() => expect(availablePackagesInput).toBeEnabled()); expect(availablePackagesInput).toHaveFocus(); clickNext(); diff --git a/src/test/mocks/handlers.js b/src/test/mocks/handlers.js index a65d78eb..30b9d8ff 100644 --- a/src/test/mocks/handlers.js +++ b/src/test/mocks/handlers.js @@ -44,4 +44,154 @@ export const handlers = [ } } ), + rest.post( + baseURL.concat('/api/content-sources/v1/rpms/names'), + async (req, res, ctx) => { + const { search } = await req.json(); + if (search === 'test') { + return res( + ctx.status(200), + ctx.json([ + { + name: 'testPkg', + summary: 'test package summary', + version: '1.0', + }, + { + name: 'lib-test', + summary: 'lib-test package summary', + version: '1.0', + }, + { + name: 'test', + summary: 'summary for test package', + version: '1.0', + }, + ]) + ); + } else if (search === 'asdf') { + return res(ctx.status(200), ctx.json([])); + } + } + ), + rest.get( + baseURL.concat('/api/image-builder/v1/packages'), + (req, res, ctx) => { + const search = req.url.searchParams.get('search'); + if (search === 'test') { + return res( + ctx.status(200), + ctx.json({ + data: [ + { + name: 'testPkg', + summary: 'test package summary', + version: '1.0', + }, + { + name: 'lib-test', + summary: 'lib-test package summary', + version: '1.0', + }, + { + name: 'test', + summary: 'summary for test package', + version: '1.0', + }, + ], + meta: { + count: 3, + }, + }) + ); + } else if (search === 'asdf') { + return res(ctx.status(200), ctx.json({ data: [], meta: 0 })); + } + } + ), + rest.get( + baseURL.concat('/api/image-builder/v1/architectures/:distro'), + (req, res, ctx) => { + const { distro } = req.params; + if (distro === 'rhel-91') { + return res( + ctx.status(200), + ctx.json([ + { + arch: 'x86_64', + repositories: [ + { + baseurl: + 'https://cdn.redhat.com/content/dist/rhel9/9.1/x86_64/baseos/os', + rhsm: true, + }, + ], + }, + { + arch: 'aarch64', + repositories: [ + { + baseurl: + 'https://cdn.redhat.com/content/dist/rhel9/9.1/aarch64/baseos/os', + rhsm: true, + }, + ], + }, + ]) + ); + } else if (distro === 'rhel-87') { + return res( + ctx.status(200), + ctx.json([ + { + arch: 'x86_64', + repositories: [ + { + baseurl: + 'https://cdn.redhat.com/content/dist/rhel8/8.7/x86_64/baseos/os', + rhsm: true, + }, + ], + }, + { + arch: 'aarch64', + repositories: [ + { + baseurl: + 'https://cdn.redhat.com/content/dist/rhel8/8.7/aarch64/baseos/os', + rhsm: true, + }, + ], + }, + ]) + ); + } else if (distro === 'centos-8') { + return res( + ctx.status(200), + ctx.json([ + { + arch: 'x86_64', + repositories: [ + { + baseurl: + 'http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/', + rhsm: false, + }, + ], + }, + { + arch: 'aarch64', + repositories: [ + { + baseurl: + 'http://mirror.centos.org/centos/8-stream/BaseOS/aarch64/os/', + rhsm: false, + }, + ], + }, + ]) + ); + } + } + ), ];