Skip to content
Merged
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
9 changes: 9 additions & 0 deletions cypress/e2e/po/pages/users-and-auth/user.retention.po.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import CheckboxInputPo from '@/cypress/e2e/po/components/checkbox-input.po';
import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po';
import LabeledInputPo from '@/cypress/e2e/po/components/labeled-input.po';
import ToggleSwitchPo from '@/cypress/e2e/po/components/toggle-switch.po';
import UsersPo from '@/cypress/e2e/po/pages/users-and-auth/users.po';

export default class UserRetentionPo extends PagePo {
constructor(private clusterId = '_') {
Expand All @@ -14,6 +15,14 @@ export default class UserRetentionPo extends PagePo {
return `/c/${ clusterId }/auth/user.retention`;
}

static navTo() {
const usersPo = new UsersPo();

usersPo.goTo();
usersPo.waitForPage();
usersPo.userRetentionLink().click();
}

saveButton() {
return new AsyncButtonPo('[data-testid="action-button-async-button"]');
}
Expand Down
172 changes: 2 additions & 170 deletions cypress/e2e/tests/pages/users-and-auth/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,183 +1,15 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import UsersPo from '@/cypress/e2e/po/pages/users-and-auth/users.po';
import UserRetentionPo from '@/cypress/e2e/po/pages/users-and-auth/user.retention.po';

function updateUserRetentionSetting(settingId, newValue) {
cy.getRancherResource('v1', 'management.cattle.io.settings').then((data: any) => {
const retentionSetting = data.body.data.find((setting) => setting.id === settingId);

retentionSetting.value = newValue;

cy.setRancherResource('v1', 'management.cattle.io.settings', settingId, retentionSetting);
});
}

describe('Auth Index', { testIsolation: 'off' }, () => {
const runTimestamp = +new Date();
const usernameBlock = `user_to_block_${ runTimestamp }`;
const userIdsList = [];

describe('Auth Index', { testIsolation: 'off', tags: ['@usersAndAuths', '@adminUser'] }, () => {
before(() => {
cy.login();
});

it('can redirect', { tags: ['@usersAndAuths', '@adminUser'] }, () => {
it('can redirect', () => {
const page = new PagePo('/c/local/auth');

page.goTo();

cy.url().should('includes', `${ Cypress.config().baseUrl }/c/local/auth/management.cattle.io.user`);
});

describe('User retention: admin user', { tags: ['@usersAndAuths', '@adminUser'] }, () => {
it('can navigate to user retention settings', () => {
const page = new PagePo('/c/local/auth');

page.goTo();

const usersPo = new UsersPo();

usersPo.userRetentionLink().click();

cy.url().should('includes', `${ Cypress.config().baseUrl }/c/local/auth/user.retention`);
});

it('save button should be disabled when form is invalid', () => {
const page = new PagePo('/c/local/auth/user.retention');

page.goTo();

const userRetentionPo = new UserRetentionPo();

userRetentionPo.disableAfterPeriodCheckbox().set();
userRetentionPo.disableAfterPeriodInput().set('30d');

userRetentionPo.saveButton().expectToBeDisabled();
});

it('save button should be enabled when form is valid', () => {
const page = new PagePo('/c/local/auth/user.retention');

page.goTo();

const userRetentionPo = new UserRetentionPo();

userRetentionPo.disableAfterPeriodCheckbox().set();
userRetentionPo.disableAfterPeriodInput().set('300h');
userRetentionPo.userRetentionCron().set('0 0 1 1 *');

userRetentionPo.saveButton().expectToBeEnabled();
});

it('can save user retention settings', () => {
const page = new PagePo('/c/local/auth/user.retention');

page.goTo();

const userRetentionPo = new UserRetentionPo();

userRetentionPo.disableAfterPeriodCheckbox().set();
userRetentionPo.disableAfterPeriodInput().set('300h');
userRetentionPo.deleteAfterPeriodCheckbox().set();
userRetentionPo.deleteAfterPeriodInput().set('600h');
userRetentionPo.userRetentionCron().set('0 0 1 1 *');
userRetentionPo.userLastLoginDefault().set('1718744536000');

userRetentionPo.saveButton().expectToBeEnabled();
userRetentionPo.saveButton().click();

cy.url().should('include', '/management.cattle.io.user');

const usersPo = new UsersPo();

usersPo.userRetentionLink().checkVisible();
usersPo.userRetentionLink().click();

userRetentionPo.disableAfterPeriodCheckbox().checkExists();
userRetentionPo.disableAfterPeriodCheckbox().isChecked();
userRetentionPo.disableAfterPeriodInput().value().should('equal', '300h');
userRetentionPo.deleteAfterPeriodCheckbox().isChecked();
userRetentionPo.deleteAfterPeriodInput().value().should('equal', '600h');
userRetentionPo.userRetentionCron().value().should('equal', '0 0 1 1 *');
userRetentionPo.userLastLoginDefault().value().should('equal', '1718744536000');
});

it('setup a user account that will be blocked', () => {
const usersPo = new UsersPo();

cy.createUser({
username: usernameBlock,
globalRole: { role: 'user' },
projectRole: {
clusterId: 'local',
projectName: 'Default',
role: 'project-member',
}
}).then((resp: Cypress.Response<any>) => {
const userId = resp.body.id;

userIdsList.push(userId);
});

// Initialize the retention settings in case they are not.

updateUserRetentionSetting('disable-inactive-user-after', '50h');

updateUserRetentionSetting('user-retention-cron', '* * * * *');

updateUserRetentionSetting('delete-inactive-user-after', '500h');

usersPo.goTo();

usersPo.waitForPage();

// login as test user once to activate the retention
cy.login(usernameBlock, Cypress.env('password'), false);
});

it('verify the user account has countdown timers', () => {
const usersPo = new UsersPo();

cy.logout();
// Disable session caching to ensure fresh authentication after logout
cy.login(undefined, undefined, false);

usersPo.goTo();
usersPo.waitForPage();

// Disable After
usersPo.list().resourceTable().sortableTable().rowWithPartialName(usernameBlock)
.column(7)
.should('not.eq', '-');

// Delete After
usersPo.list().resourceTable().sortableTable().rowWithPartialName(usernameBlock)
.column(8)
.should('not.eq', '-');
});

after(() => {
// reset user retention settings
updateUserRetentionSetting('disable-inactive-user-after', null);

updateUserRetentionSetting('user-retention-cron', null);

updateUserRetentionSetting('delete-inactive-user-after', null);

// delete users
userIdsList.forEach((r) => cy.deleteRancherResource('v3', 'Users', r, false));
});
});

describe('User retention: standard user', { tags: ['@usersAndAuths', '@standardUser'] }, () => {
it('standard user should not have access to user retention page', () => {
const usersPo = new UsersPo();

// login as standard user
cy.login();
usersPo.goTo();
usersPo.waitForPage();
usersPo.userRetentionLink().checkNotExists();
});
});
});
165 changes: 165 additions & 0 deletions cypress/e2e/tests/pages/users-and-auth/user-retention.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
import UsersPo from '@/cypress/e2e/po/pages/users-and-auth/users.po';
import UserRetentionPo from '@/cypress/e2e/po/pages/users-and-auth/user.retention.po';
import { USERS_BASE_URL } from '@/cypress/support/utils/api-endpoints';

function updateUserRetentionSetting(settingId, newValue) {
cy.getRancherResource('v1', 'management.cattle.io.settings').then((data: any) => {
const retentionSetting = data.body.data.find((setting) => setting.id === settingId);

retentionSetting.value = newValue;

cy.setRancherResource('v1', 'management.cattle.io.settings', settingId, retentionSetting);
});
}

describe('User Retention', { testIsolation: 'off' }, () => {
const runTimestamp = +new Date();
const usernameBlock = `user_to_block_${ runTimestamp }`;
const userIdsList = [];
const userRetentionPo = new UserRetentionPo();

before(() => {
cy.login();
});

beforeEach(() => {
cy.intercept('GET', `${ USERS_BASE_URL }?*`).as('getUsers');
cy.intercept('GET', '/v1/provisioning.cattle.io.clusters?*').as('pageLoad');
});

describe('User retention: admin user', { tags: ['@usersAndAuths', '@adminUser'] }, () => {
it('save button should be disabled when form is invalid', () => {
UserRetentionPo.navTo();
userRetentionPo.waitForPage();
cy.wait('@pageLoad');
userRetentionPo.disableAfterPeriodCheckbox().set();
userRetentionPo.disableAfterPeriodInput().set('30d');

userRetentionPo.saveButton().expectToBeDisabled();
});

it('save button should be enabled when form is valid', () => {
UserRetentionPo.navTo();
userRetentionPo.waitForPage();
cy.wait('@pageLoad');
userRetentionPo.disableAfterPeriodCheckbox().set();
userRetentionPo.disableAfterPeriodInput().set('300h');
userRetentionPo.userRetentionCron().set('0 0 1 1 *');

userRetentionPo.saveButton().expectToBeEnabled();
});

it('can save user retention settings', () => {
UserRetentionPo.navTo();
userRetentionPo.waitForPage();
cy.wait('@pageLoad');

userRetentionPo.disableAfterPeriodCheckbox().set();
userRetentionPo.disableAfterPeriodInput().set('300h');
userRetentionPo.deleteAfterPeriodCheckbox().set();
userRetentionPo.deleteAfterPeriodInput().set('600h');
userRetentionPo.userRetentionCron().set('0 0 1 1 *');
userRetentionPo.userLastLoginDefault().set('1718744536000');

userRetentionPo.saveButton().expectToBeEnabled();

cy.intercept('PUT', '/v1/management.cattle.io.settings/*').as('saveUserRetention');
userRetentionPo.saveButton().click();
cy.wait('@saveUserRetention').its('response.statusCode').should('eq', 200);
cy.get('@saveUserRetention.all').should('have.length', 5);

cy.url().should('include', '/management.cattle.io.user');

const usersPo = new UsersPo();

usersPo.userRetentionLink().checkVisible();
usersPo.userRetentionLink().click();

userRetentionPo.disableAfterPeriodCheckbox().checkExists();
userRetentionPo.disableAfterPeriodCheckbox().isChecked();
userRetentionPo.disableAfterPeriodInput().value().should('equal', '300h');
userRetentionPo.deleteAfterPeriodCheckbox().isChecked();
userRetentionPo.deleteAfterPeriodInput().value().should('equal', '600h');
userRetentionPo.userRetentionCron().value().should('equal', '0 0 1 1 *');
userRetentionPo.userLastLoginDefault().value().should('equal', '1718744536000');
});

it('setup a user account that will be blocked', () => {
const usersPo = new UsersPo();

cy.createUser({
username: usernameBlock,
globalRole: { role: 'user' },
projectRole: {
clusterId: 'local',
projectName: 'Default',
role: 'project-member',
}
}).then((resp: Cypress.Response<any>) => {
const userId = resp.body.id;

userIdsList.push(userId);
});

// Initialize the retention settings in case they are not.

updateUserRetentionSetting('disable-inactive-user-after', '50h');

updateUserRetentionSetting('user-retention-cron', '* * * * *');

updateUserRetentionSetting('delete-inactive-user-after', '500h');

usersPo.goTo();
usersPo.waitForPage();
cy.wait('@getUsers');

// login as test user once to activate the retention
cy.login(usernameBlock, Cypress.env('password'), false);
});

it('verify the user account has countdown timers', () => {
const usersPo = new UsersPo();

cy.logout();
cy.login();
usersPo.goTo();
usersPo.waitForPage();
cy.wait('@getUsers');

// Disable After
usersPo.list().resourceTable().sortableTable().rowWithPartialName(usernameBlock)
.column(7)
.should('not.eq', '-');

// Delete After
usersPo.list().resourceTable().sortableTable().rowWithPartialName(usernameBlock)
.column(8)
.should('not.eq', '-');
});

after(() => {
// reset user retention settings
updateUserRetentionSetting('disable-inactive-user-after', null);

updateUserRetentionSetting('user-retention-cron', null);

updateUserRetentionSetting('delete-inactive-user-after', null);

// delete users
userIdsList.forEach((r) => cy.deleteRancherResource('v3', 'Users', r, false));
});
});

describe('User retention: standard user', { tags: ['@usersAndAuths', '@standardUser'] }, () => {
it('standard user should not have access to user retention page', () => {
const usersPo = new UsersPo();

// login as standard user
cy.login();
usersPo.goTo();
usersPo.waitForPage();
cy.wait('@getUsers');
usersPo.userRetentionLink().checkNotExists();
});
});
});