Skip to content

Commit

Permalink
Cypress RBAC tests
Browse files Browse the repository at this point in the history
  • Loading branch information
DaveDarsa committed Dec 8, 2023
1 parent 7b5db38 commit 57908e9
Show file tree
Hide file tree
Showing 64 changed files with 2,133 additions and 169 deletions.
20 changes: 15 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,21 @@ Lagoon UI uses cypress for e2e tests.

A couple of environment variables are required:

- CYPRESS_CY_EMAIL - keycloak user
- CYPRESS_CY_PASSWORD - keycloak password
- CYPRESS_CY_KEYCLOAK_URL - Keycloak url (used for cypress sessions)
- CYPRESS_CY_API - GraphQL api endpoint
- CYPRESS_CY_URL - running UI instance url
- email - keycloak user
- password - keycloak password
- keycloak - Keycloak url (used for cypress sessions)
- api - GraphQL api endpoint
- url - running UI instance url
- user_guest - user with guest role
- user_reporter - user with reporter role
- user_developer - user with developer role
- user_maintainer - user with maintainer role
- user_owner - user with owner role
- user_orguser - Organization user
- user_orgviewer - Organization viewer
- user_orgowner - Organization owner
- user_platformowner - Platform owner



These environment variables can either be inlined or saved in `Cypress.config.ts` file:
Expand Down
18 changes: 18 additions & 0 deletions cypress/cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,22 @@ import { defineConfig } from 'cypress';

export default defineConfig({
requestTimeout: 15000,
e2e: {
env: {
api: 'http://0.0.0.0:33000/graphql',
keycloak: 'http://0.0.0.0:38088',
url: 'http://0.0.0.0:3000',
user_guest: '[email protected]',
user_reporter: '[email protected]',
user_developer: '[email protected]',
user_maintainer: '[email protected]',
user_owner: '[email protected]',
// orgs
user_orguser: '[email protected]',
user_orgviewer: '[email protected]',
user_orgowner: '[email protected]',
// top level user for all default tests
user_platformowner: '[email protected]',
},
},
});
36 changes: 36 additions & 0 deletions cypress/e2e/backups.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import BackupsAction from 'cypress/support/actions/backups/BackupsAction';
import { aliasMutation, registerIdleHandler } from 'cypress/utils/aliasQuery';

const backups = new BackupsAction();

describe('Backups page', () => {
beforeEach(() => {
cy.login(Cypress.env('user_owner'), Cypress.env('user_owner'));
registerIdleHandler('idle');
});

it('Retrieves a backup', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/backups`);

cy.intercept('POST', Cypress.env('api'), req => {
aliasMutation(req, 'addRestore');
});

backups.doRetrieveBackup();
});

it('Changes shown results', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.waitForNetworkIdle('@idle', 500);
backups.doResultsLimitedchangeCheck(10);
cy.waitForNetworkIdle('@idle', 500);
backups.doResultsLimitedchangeCheck(25);
cy.waitForNetworkIdle('@idle', 500);
backups.doResultsLimitedchangeCheck(50);
cy.waitForNetworkIdle('@idle', 500);
backups.doResultsLimitedchangeCheck(100);
cy.waitForNetworkIdle('@idle', 500);
backups.doResultsLimitedchangeCheck('all');
});
});
40 changes: 40 additions & 0 deletions cypress/e2e/deployment.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import deploymentAction from 'cypress/support/actions/deployment/DeploymentAction';
import { aliasMutation, registerIdleHandler } from 'cypress/utils/aliasQuery';

const deployment = new deploymentAction();

describe('Deployment page', () => {
beforeEach(() => {
cy.login(Cypress.env('user_owner'), Cypress.env('user_owner'));
registerIdleHandler('idle');
});

it('Cancels a deployment', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.intercept('POST', Cypress.env('api'), req => {
aliasMutation(req, 'cancelDeployment');
});
cy.waitForNetworkIdle('@idle', 500);

deployment.navigateToRunningDeployment();
deployment.doCancelDeployment();
});

it('Toggles logviewer parsed/raw', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.waitForNetworkIdle('@idle', 500);

deployment.navigateToRunningDeployment();
deployment.doToggleLogViewer();
});

it('Checks accordion headings toggling content', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.waitForNetworkIdle('@idle', 500);
deployment.navigateToRunningDeployment();
deployment.doLogViewerCheck();
});
});
47 changes: 47 additions & 0 deletions cypress/e2e/deployments.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import DeploymentsAction from 'cypress/support/actions/deployments/DeploymentsAction';
import { aliasMutation, registerIdleHandler } from 'cypress/utils/aliasQuery';

const deployments = new DeploymentsAction();

describe('Deployments page', () => {
beforeEach(() => {
cy.login(Cypress.env('user_owner'), Cypress.env('user_owner'));
registerIdleHandler('idle');
});

it('Does a deployment', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.intercept('POST', Cypress.env('api'), req => {
aliasMutation(req, 'deployEnvironmentLatest');
});

deployments.doDeployment();
});
it('Cancels a deployment', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.intercept('POST', Cypress.env('api'), req => {
aliasMutation(req, 'cancelDeployment');
});
cy.waitForNetworkIdle('@idle', 500);

deployments.doCancelDeployment();
});

it('Changes shown results', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main/deployments`);

cy.waitForNetworkIdle('@idle', 500);

deployments.doResultsLimitedchangeCheck(10);
cy.waitForNetworkIdle('@idle', 500);
deployments.doResultsLimitedchangeCheck(25);
cy.waitForNetworkIdle('@idle', 500);
deployments.doResultsLimitedchangeCheck(50);
cy.waitForNetworkIdle('@idle', 500);
deployments.doResultsLimitedchangeCheck(100);
cy.waitForNetworkIdle('@idle', 500);
deployments.doResultsLimitedchangeCheck('all');
});
});
61 changes: 16 additions & 45 deletions cypress/e2e/environment.cy.ts
Original file line number Diff line number Diff line change
@@ -1,59 +1,30 @@
import { testData } from 'cypress/fixtures/variables';
import EnvironmentAction from 'cypress/support/actions/environment/EnvironmentAction';
import ProjectAction from 'cypress/support/actions/project/ProjectAction';
import EnvOverviewAction from 'cypress/support/actions/envOverview/EnvOverviewAction';
import { aliasMutation } from 'cypress/utils/aliasQuery';

const project = new ProjectAction();

const environment = new EnvironmentAction();
const environmentOverview = new EnvOverviewAction();

describe('Environment page', () => {
beforeEach(() => {
cy.login(Cypress.env().CY_EMAIL, Cypress.env().CY_PASSWORD);

cy.wait(500);
cy.log('Full user navigation from /projects page');

cy.visit(Cypress.env().CY_URL);

project.doNavigateToFirst();

environment.doEnvNavigation();
cy.login(Cypress.env('user_owner'), Cypress.env('user_owner'));
});

it('Toggles Hide/Show values', () => {
environment.doHideShowToggle();

cy.log('show all values');
it('Checks environment details', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main`);

environment.doValueToggle();
environmentOverview.doEnvTypeCheck();
environmentOverview.doDeployTypeCheck();

cy.log('disable show/edit buttons');
environmentOverview.doSourceCheck();

environment.doHideShowToggle();
environmentOverview.doRoutesCheck();
});
it('Deletes the environment', () => {
cy.visit(`${Cypress.env('url')}/projects/lagoon-demo/lagoon-demo-main`);

it('Adds or updates a variable', () => {
const { name, value } = testData.variables[0];

environment.doAddVariable(name, value);

cy.intercept('POST', Cypress.env().CY_API).as('addRequest');

cy.wait('@addRequest');

cy.log('check if variable was created');
cy.get('.data-table > .data-row').should('contain', name);
});

it('Deletes a variable', () => {
const { name } = testData.variables[0];

environment.doDeleteVariable(name);

cy.intercept('POST', Cypress.env().CY_API).as('deleteRequest');

cy.wait('@deleteRequest');
cy.intercept('POST', Cypress.env('api'), req => {
aliasMutation(req, 'deleteEnvironment');
});

cy.get('.data-table > .data-row').should('not.contain', name);
environmentOverview.doDeleteEnvironment('main');
});
});
17 changes: 11 additions & 6 deletions cypress/e2e/login.cy.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
import { registerIdleHandler } from "cypress/utils/aliasQuery";

describe('Initial login and theme spec', () => {
beforeEach(() => {
cy.login(Cypress.env().CY_EMAIL, Cypress.env().CY_PASSWORD);
cy.login(Cypress.env("user_owner"), Cypress.env("user_owner"));
registerIdleHandler("idle");
});

it('Logins and gets redirected to /projects with correct user displayed', () => {
cy.visit(Cypress.env().CY_URL);
cy.visit(Cypress.env("url"));

cy.location('pathname').should('equal', '/projects');
cy.getBySel('headerMenu').should('contain', Cypress.env().CY_EMAIL);
cy.getBySel('headerMenu').should('contain', Cypress.env("user_owner"));
});

it('Switches themes', () => {
cy.visit(Cypress.env().CY_URL);
cy.visit(Cypress.env("url"));

cy.waitForNetworkIdle("@idle", 500);

cy.getBySel('themeToggler').then($toggler => {
if (localStorage.getItem('theme') === 'dark') {
cy.wrap($toggler).click();
Expand All @@ -29,11 +34,11 @@ describe('Initial login and theme spec', () => {
});

it('Logs out', () => {
cy.visit(Cypress.env().CY_URL);
cy.visit(Cypress.env("url"));
cy.getBySel('headerMenu').click();
cy.getBySel('logout').click();

cy.origin(Cypress.env().CY_KEYCLOAK_URL, () => {
cy.origin(Cypress.env("keycloak"), () => {
cy.contains('Sign in to your account');
});
});
Expand Down
6 changes: 3 additions & 3 deletions cypress/e2e/navigation.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ const navigation = new NavigationRepository();

describe('Navigation tests', () => {
beforeEach(() => {
cy.login(Cypress.env().CY_EMAIL, Cypress.env().CY_PASSWORD);
cy.login(Cypress.env("user_owner"), Cypress.env("user_owner"));
registerIdleHandler('idle');
});

it('Checks navigation to settings, organizations and projects pages', () => {
cy.visit(Cypress.env().CY_URL);
cy.visit(Cypress.env("url"));

context('Navigates from /projects to /settings', () => {
cy.getBySel('headerMenu').click();
Expand Down Expand Up @@ -46,7 +46,7 @@ describe('Navigation tests', () => {

navigation.getLinkElement('account').click();

const redirect = `${Cypress.env().CY_KEYCLOAK_URL}/auth/realms/lagoon/account/`;
const redirect = `${Cypress.env("keycloak")}/auth/realms/lagoon/account/`;
cy.origin(redirect, { args: { redirect } }, ({ redirect }) => {
cy.location().should(loc => {
expect(loc.toString()).to.eq(redirect);
Expand Down
6 changes: 3 additions & 3 deletions cypress/e2e/organizations/groups.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ const group = new GroupAction();
describe('Organization Groups page', () => {
beforeEach(() => {
// register interceptors/idle handler
cy.intercept('POST', Cypress.env().CY_API, req => {
cy.intercept('POST', Cypress.env("api"), req => {
aliasQuery(req, 'getOrganization');
aliasMutation(req, 'addUserToGroup');
aliasMutation(req, 'addGroupToOrganization');
});
registerIdleHandler('groupQuery');

cy.login(Cypress.env().CY_EMAIL, Cypress.env().CY_PASSWORD);
cy.visit(`${Cypress.env().CY_URL}/organizations/99/groups`);
cy.login(Cypress.env("user_platformowner"), Cypress.env("user_platformowner"));
cy.visit(`${Cypress.env("url")}/organizations/1/groups`);
});

it('Adds a group', () => {
Expand Down
6 changes: 3 additions & 3 deletions cypress/e2e/organizations/manage.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ const manage = new ManageAction();

describe('Org Manage page', () => {
beforeEach(() => {
cy.login(Cypress.env().CY_EMAIL, Cypress.env().CY_PASSWORD);
cy.visit(`${Cypress.env().CY_URL}/organizations/99/manage`);
cy.login(Cypress.env("user_platformowner"), Cypress.env("user_platformowner"));
cy.visit(`${Cypress.env("url")}/organizations/1/manage`);

cy.intercept('POST', Cypress.env().CY_API, req => {
cy.intercept('POST', Cypress.env("api"), req => {
aliasMutation(req, 'AddUserToOrganization');
});
});
Expand Down
Loading

0 comments on commit 57908e9

Please sign in to comment.