Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
182 changes: 182 additions & 0 deletions cypress/e2e/rpm.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
describe('RPM plugin tests', () => {
beforeEach(() => cy.login());

afterEach(function () {
if (this.currentTest.state === 'failed') {
Cypress.stop()
}
})

it('Empty distributions', () => {
cy.ui('rpm/distributions');
cy.assertTitle('Distributions');

cy.contains('No distributions yet');
});

it('Empty packages', () => {
cy.ui('rpm/rpms');
cy.assertTitle('Packages');

cy.contains('No packages yet');
});

it('Empty repositories', () => {
cy.ui('rpm/repositories');
cy.assertTitle('Repositories');

cy.contains('No repositories yet');
});

it('Empty remotes', () => {
cy.ui('rpm/remotes');
cy.assertTitle('Remotes');

cy.contains('No remotes yet');
});

it('Add distribution', () => {
cy.ui('rpm/distributions');
cy.contains('button', 'Create distribution').click();

cy.assertTitle('Add new distribution');

cy.get('#name').type('Bare Test Distribution');
cy.get('#base_path').type('bare-test-distribution');

cy.contains('button', 'Save').click();
cy.assertTitle('Bare Test Distribution');
cy.contains('Bare Test Distribution');
})

it('Add remote', () => {
cy.ui('rpm/remotes');
cy.contains('button', 'Add remote').click();

cy.assertTitle('Add new remote');

cy.get('#name').type('Test Remote');
cy.get('#url').type('https://fixtures.pulpproject.org/rpm-repo-metadata/');

cy.contains('button', 'Save').click();
cy.assertTitle('Test Remote');
cy.contains('Test Remote');
});

it('Add repository with a remote and distribution', () => {
cy.ui('rpm/repositories');
cy.contains('button', 'Add repository').click();

cy.assertTitle('Add new repository');

cy.get('#name').type('Test Repository');
cy.get('#description').type('This is a test repository');

cy.get('input[id="create_distribution"]').should('be.checked');
cy.get('label[for="create_distribution"]').contains('Test Repository');

cy.get('input[placeholder="Select a remote"]').click();
cy.contains('Test Remote').click();

cy.contains('button', 'Save').click();
cy.assertTitle('Test Repository');
cy.contains('Test Repository');
});

it('Sync a repository', () => {
cy.ui('rpm/repositories');
cy.contains('Test Repository').click();

cy.contains('button', 'Sync').click();

let packagesSynced = false;
for (let i = 0; i < 30; i++) {
cy.ui('rpm/rpms');
packagesSynced = cy.contains('No packages yet');
if (packagesSynced) {
break;
}
cy.wait(1000);
}
packagesSynced;
});

it ('Edit remote', () => {
cy.ui('rpm/remotes');
cy.contains('Test Remote').click();

cy.contains('button', 'Edit').click();
cy.assertTitle('Test Remote');

cy.get('#url').clear().type('https://fixtures.pulpproject.org/rpm-repo-metadata-changed/');

cy.contains('button', 'Save').click();
cy.assertTitle('Test Remote');
cy.assertListText('https://fixtures.pulpproject.org/rpm-repo-metadata-changed/');
})


it ('Edit repository', () => {
cy.ui('rpm/repositories');
cy.contains('Test Repository').click();

cy.contains('button', 'Edit').click();
cy.assertTitle('Test Repository');

cy.get('#description').clear().type('This is an updated test repository');

cy.contains('button', 'Save').click();
cy.assertTitle('Test Repository');
cy.assertListText('This is an updated test repository');
})

it ('Edit distribution', () => {
cy.ui('rpm/distributions');
cy.contains('Test Distribution').click();

cy.contains('button', 'Edit').click();
cy.assertTitle('Test Distribution');

cy.get('#base_path').clear().type('updated-base-path');

cy.contains('button', 'Save').click();
cy.assertTitle('Test Distribution');
cy.assertListText('updated-base-path');
})

it('Remove distribution', () => {
cy.ui('rpm/distributions');
cy.contains('Bare Test Distribution').click();

cy.contains('button', 'Delete').click();
cy.contains('Are you sure you want to delete the distribution Bare Test Distribution?');

cy.get('[role="dialog"]').contains('button', 'Delete').click();
cy.assertTitle('Distributions');
cy.contains('Bare Test Distribution').should('not.exist');
})

it('Remove last repository', () => {
cy.ui('rpm/repositories');
cy.contains('Test Repository').click();

cy.contains('button', 'Delete').click();
cy.contains('Are you sure you want to delete the repository Test Repository?');

cy.get('[role="dialog"]').contains('button', 'Delete').click();
cy.assertTitle('Repositories');
cy.contains('No repositories yet');
});

it('Remove last remote', () => {
cy.ui('rpm/remotes');
cy.contains('Test Remote').click();

cy.contains('button', 'Delete').click();
cy.contains('Are you sure you want to delete the remote Test Remote?');

cy.get('[role="dialog"]').contains('button', 'Delete').click();
cy.assertTitle('Remotes');
cy.contains('No remotes yet');
});
});
7 changes: 0 additions & 7 deletions cypress/e2e/smoke.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,6 @@ describe('UI smoke tests', () => {
// TODO
});

it('RPMs', () => {
cy.ui('rpm/rpms');
cy.assertTitle('Packages');

cy.contains('No packages yet');
});

it('Task management', () => {
cy.ui('tasks');
cy.assertTitle('Task management');
Expand Down
4 changes: 4 additions & 0 deletions cypress/support/e2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ Cypress.Commands.add('assertTitle', {}, (title) => {
cy.contains('.pf-v5-c-title', title);
});

Cypress.Commands.add('assertListText', {}, (text) => {
cy.contains('.pf-v5-c-description-list__text', text);
});

Cypress.Commands.add('ui', {}, (path = '') => {
cy.visit(ui + path);
});
Expand Down
10 changes: 10 additions & 0 deletions src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,13 @@ export { fileRepositoryCreateAction } from './file-repository-create';
export { fileRepositoryDeleteAction } from './file-repository-delete';
export { fileRepositoryEditAction } from './file-repository-edit';
export { fileRepositorySyncAction } from './file-repository-sync';
export { rpmDistributionCreateAction } from './rpm-distribution-create';
export { rpmDistributionDeleteAction } from './rpm-distribution-delete';
export { rpmDistributionEditAction } from './rpm-distribution-edit';
export { rpmRepositoryCreateAction } from './rpm-repository-create';
export { rpmRepositoryDeleteAction } from './rpm-repository-delete';
export { rpmRepositoryEditAction } from './rpm-repository-edit';
export { rpmRepositorySyncAction } from './rpm-repository-sync';
export { rpmRemoteCreateAction } from './rpm-remote-create';
export { rpmRemoteDeleteAction } from './rpm-remote-delete';
export { rpmRemoteEditAction } from './rpm-remote-edit';
9 changes: 9 additions & 0 deletions src/actions/rpm-distribution-create.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { msg } from '@lingui/core/macro';
import { Paths, formatPath } from 'src/paths';
import { Action } from './action';

export const rpmDistributionCreateAction = Action({
title: msg`Create distribution`,
onClick: (item, { navigate }) =>
navigate(formatPath(Paths.rpm.distribution.edit, { name: '_' })),
});
64 changes: 64 additions & 0 deletions src/actions/rpm-distribution-delete.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { msg, t } from '@lingui/core/macro';
import { RPMDistributionAPI } from 'src/api';
import { DeleteDistributionModal } from 'src/components';
import {
handleHttpError,
parsePulpIDFromURL,
taskAlert,
waitForTaskUrl,
} from 'src/utilities';
import { Action } from './action';

export const rpmDistributionDeleteAction = Action({
title: msg`Delete`,
modal: ({ addAlert, listQuery, setState, state }) =>
state.deleteModalOpen ? (
<DeleteDistributionModal
closeAction={() => setState({ deleteModalOpen: null })}
deleteAction={() =>
deleteDistribution(state.deleteModalOpen, {
addAlert,
listQuery,
setState,
})
}
name={state.deleteModalOpen.name}
/>
) : null,
onClick: (
{ name, id, pulp_href }: { name: string; id?: string; pulp_href?: string },
{ setState },
) =>
setState({
deleteModalOpen: {
pulpId: id || parsePulpIDFromURL(pulp_href),
name,
pulp_href,
},
}),
});

async function deleteDistribution(
{ name, pulpId },
{ addAlert, setState, listQuery },
) {
const deleteDistribution = RPMDistributionAPI.delete(pulpId)
.then(({ data }) => {
addAlert(taskAlert(data.task, t`Removal started for distribution ${name}`));
return waitForTaskUrl(data.task);
})
.catch(
handleHttpError(
t`Failed to remove distribution ${name}`,
() => setState({ deleteModalOpen: null }),
addAlert,
),
);

return Promise.all([
deleteDistribution,
]).then(() => {
setState({ deleteModalOpen: null });
listQuery();
});
}
9 changes: 9 additions & 0 deletions src/actions/rpm-distribution-edit.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { msg } from '@lingui/core/macro';
import { Paths, formatPath } from 'src/paths';
import { Action } from './action';

export const rpmDistributionEditAction = Action({
title: msg`Edit`,
onClick: ({ name }, { navigate }) =>
navigate(formatPath(Paths.rpm.distribution.edit, { name })),
});
9 changes: 9 additions & 0 deletions src/actions/rpm-remote-create.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { msg } from '@lingui/core/macro';
import { Paths, formatPath } from 'src/paths';
import { Action } from './action';

export const rpmRemoteCreateAction = Action({
title: msg`Add remote`,
onClick: (item, { navigate }) =>
navigate(formatPath(Paths.rpm.remote.edit, { name: '_' })),
});
44 changes: 44 additions & 0 deletions src/actions/rpm-remote-delete.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { msg, t } from '@lingui/core/macro';
import { RPMRemoteAPI } from 'src/api';
import { DeleteRemoteModal } from 'src/components';
import {
handleHttpError,
parsePulpIDFromURL,
taskAlert,
waitForTaskUrl,
} from 'src/utilities';
import { Action } from './action';

export const rpmRemoteDeleteAction = Action({
title: msg`Delete`,
modal: ({ addAlert, listQuery, setState, state }) =>
state.deleteModalOpen ? (
<DeleteRemoteModal
closeAction={() => setState({ deleteModalOpen: null })}
deleteAction={() =>
deleteRemote(state.deleteModalOpen, { addAlert, setState, listQuery })
}
name={state.deleteModalOpen.name}
/>
) : null,
onClick: (
{ name, id, pulp_href }: { name: string; id?: string; pulp_href?: string },
{ setState },
) =>
setState({
deleteModalOpen: { pulpId: id || parsePulpIDFromURL(pulp_href), name },
}),
});

function deleteRemote({ name, pulpId }, { addAlert, setState, listQuery }) {
return RPMRemoteAPI.delete(pulpId)
.then(({ data }) => {
addAlert(taskAlert(data.task, t`Removal started for remote ${name}`));
setState({ deleteModalOpen: null });
return waitForTaskUrl(data.task);
})
.then(() => listQuery())
.catch(
handleHttpError(t`Failed to remove remote ${name}`, () => null, addAlert),
);
}
9 changes: 9 additions & 0 deletions src/actions/rpm-remote-edit.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { msg } from '@lingui/core/macro';
import { Paths, formatPath } from 'src/paths';
import { Action } from './action';

export const rpmRemoteEditAction = Action({
title: msg`Edit`,
onClick: ({ name }, { navigate }) =>
navigate(formatPath(Paths.rpm.remote.edit, { name })),
});
9 changes: 9 additions & 0 deletions src/actions/rpm-repository-create.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { msg } from '@lingui/core/macro';
import { Paths, formatPath } from 'src/paths';
import { Action } from './action';

export const rpmRepositoryCreateAction = Action({
title: msg`Add repository`,
onClick: (item, { navigate }) =>
navigate(formatPath(Paths.rpm.repository.edit, { name: '_' })),
});
Loading