CreateImageWizard: Get all matching packages from package search

When searching for a package, all matching packages are now returned. First an
attempt is made using the api's default limit and if there are more
matching packages than the default limit a second request is made with
an increased limit. To facilitate this, api.getPackages() now accepts an
optional limit parameter. Retrieving all matching packages is necessary
because of the sorting logic.
This commit is contained in:
lucasgarfield 2022-02-22 14:35:05 +01:00 committed by Lucas Garfield
parent 7ec9047140
commit e8e7329bf6
3 changed files with 57 additions and 8 deletions

View file

@ -88,15 +88,26 @@ const Packages = ({ defaultArch, ...props }) => {
}); });
}); });
// call api to list available packages const getAllPackages = async () => {
const handlePackagesAvailableSearch = async () => { const args = [
const { data } = await api.getPackages(
getState()?.values?.release, getState()?.values?.release,
getState()?.values?.architecture || defaultArch, getState()?.values?.architecture || defaultArch,
packagesSearchName.current packagesSearchName.current
); ];
if (data) { let { data, meta } = await api.getPackages(...args);
const packagesAvailableFiltered = filterPackagesAvailable(data); if (data?.length === meta.count) {
return data;
} else if (data) {
({ data } = await api.getPackages(...args, meta.count));
return data;
}
};
// call api to list available packages
const handlePackagesAvailableSearch = async () => {
const packageList = await getAllPackages();
if (packageList) {
const packagesAvailableFiltered = filterPackagesAvailable(packageList);
sortPackages(packagesAvailableFiltered); sortPackages(packagesAvailableFiltered);
setPackagesAvailableFound(true); setPackagesAvailableFound(true);
} else { } else {

View file

@ -28,12 +28,13 @@ async function getComposeStatus(id) {
return request.data; return request.data;
} }
async function getPackages(distribution, architecture, search) { async function getPackages(distribution, architecture, search, limit) {
const params = new URLSearchParams({ const params = new URLSearchParams({
distribution, distribution,
architecture, architecture,
search, search,
}); });
limit && params.append('limit', limit);
let path = '/packages?' + params.toString(); let path = '/packages?' + params.toString();
const request = await axios.get(IMAGE_BUILDER_API.concat(path)); const request = await axios.get(IMAGE_BUILDER_API.concat(path));
return request.data; return request.data;

View file

@ -28,7 +28,7 @@ function verifyCancelButton(cancel, history) {
// packages // packages
const mockPkgResult = { const mockPkgResult = {
meta: { count: 100 }, meta: { count: 3 },
links: { first: '', last: '' }, links: { first: '', last: '' },
data: [ data: [
{ {
@ -49,6 +49,22 @@ const mockPkgResult = {
] ]
}; };
const mockPkgResultPartial = {
meta: { count: 132 },
links: { first: '', last: '' },
data: new Array(100).fill().map((_, i) => {
return { name: 'testPkg-' + i, summary: 'test package summary', version: '1.0' };
})
};
const mockPkgResultAll = {
meta: { count: 132 },
links: { first: '', last: '' },
data: new Array(132).fill().map((_, i) => {
return { name: 'testPkg-' + i, summary: 'test package summary', version: '1.0' };
})
};
const mockPkgResultEmpty = { const mockPkgResultEmpty = {
meta: { count: 0 }, meta: { count: 0 },
links: { first: '', last: '' }, links: { first: '', last: '' },
@ -731,6 +747,27 @@ describe('Step Packages', () => {
expect(chosenPackagesItems).toHaveLength(1); expect(chosenPackagesItems).toHaveLength(1);
within(chosenPackagesList).getByRole('option', { name: /testPkg test package summary/ }); within(chosenPackagesList).getByRole('option', { name: /testPkg test package summary/ });
}); });
test('should get all packages, regardless of api default limit', async () => {
await setUp();
const searchbox = screen.getAllByRole('textbox')[0]; // searching by id doesn't update the input ref
searchbox.click();
const getPackages = jest
.spyOn(api, 'getPackages')
.mockImplementation((distribution, architecture, search, limit) => {
return limit ? Promise.resolve(mockPkgResultAll) : Promise.resolve(mockPkgResultPartial);
});
await searchForAvailablePackages(searchbox, 'testPkg');
expect(getPackages).toHaveBeenCalledTimes(2);
const availablePackagesList = screen.getByTestId('available-pkgs-list');
const availablePackagesItems = within(availablePackagesList).getAllByRole('option');
expect(availablePackagesItems).toHaveLength(132);
});
}); });
describe('Step Review', () => { describe('Step Review', () => {