Skip to content

Commit

Permalink
ui automation: users and roles tests (rancher#9355)
Browse files Browse the repository at this point in the history
* Add users and roles tests

* Refactor: split user-and-auth.po into user.po and roles.po and added roles tests

* Refactor users to reflect underlying list, create/edit and detail components
- Make Users PO root page for users list.
  - contains list po which extends BaseResourceList
  - contains user specific list stuff
- Move create edit stuff to own PO
- Move detail stuff to own PO, extend ResourceDetailPo

* Update roles as per previous changes to users
- different to users given different resource types

* split users and roles tests

* Remove unrequried command.ts, make http 200 check more lenient

---------

Co-authored-by: Yonas Berhe <[email protected]>
Co-authored-by: Richard Cox <[email protected]>
  • Loading branch information
3 people authored Aug 1, 2023
1 parent ec4762e commit 5be8469
Show file tree
Hide file tree
Showing 30 changed files with 852 additions and 182 deletions.
4 changes: 4 additions & 0 deletions cypress/e2e/po/components/resource-table.po.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@ export default class ResourceTablePo extends ComponentPo {
sortableTable() {
return new SortableTablePo(this.self());
}

downloadYamlButton() {
return cy.getId('sortable-table-download');
}
}
19 changes: 19 additions & 0 deletions cypress/e2e/po/detail/management.cattle.io.globalrole.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import RoleDetailPo from '@/cypress/e2e/po/detail/role.po';
import GlobalRoleEditPo from '@/cypress/e2e/po/edit/management.cattle.io.globalrole.po';
import ResourceDetailPo from '@/cypress/e2e/po/edit/resource-detail.po';

class GlobalRoleDetailComponentPo extends ResourceDetailPo {
userCreateEditView(clusterId: string, userId?: string ) {
return new GlobalRoleEditPo(clusterId, userId);
}
}

export default class GlobalRoleDetailPo extends RoleDetailPo {
constructor(clusterId = '_', roleId: string) {
super(clusterId, 'management.cattle.io.globalrole', roleId);
}

detail() {
return new GlobalRoleDetailComponentPo(this.self());
}
}
19 changes: 19 additions & 0 deletions cypress/e2e/po/detail/management.cattle.io.roletemplate.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import RoleDetailPo from '@/cypress/e2e/po/detail/role.po';
import RoleTemplateEditPo from '@/cypress/e2e/po/edit/management.cattle.io.roletemplate.po';
import ResourceDetailPo from '@/cypress/e2e/po/edit/resource-detail.po';

class RoleTemplateDetailComponentPo extends ResourceDetailPo {
userCreateEditView(clusterId: string, userId?: string ) {
return new RoleTemplateEditPo(clusterId, userId);
}
}

export default class RoleTemplateDetailPo extends RoleDetailPo {
constructor(clusterId = '_', roleId: string) {
super(clusterId, 'management.cattle.io.roletemplate', roleId);
}

detail() {
return new RoleTemplateDetailComponentPo(this.self());
}
}
27 changes: 27 additions & 0 deletions cypress/e2e/po/detail/management.cattle.io.user.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import MgmtUserEditPo from '@/cypress/e2e/po/edit/management.cattle.io.user.po';
import ResourceDetailPo from '@/cypress/e2e/po/edit/resource-detail.po';
import PagePo from '@/cypress/e2e/po/pages/page.po';

class MgmtUserResourceDetailComponentPo extends ResourceDetailPo {
userCreateEditView(clusterId: string, userId?: string ) {
return new MgmtUserEditPo(clusterId, userId);
}
}

export default class MgmtUserResourceDetailPo extends PagePo {
private static createPath(clusterId: string, userId: string ) {
return `/c/${ clusterId }/auth/management.cattle.io.user/${ userId }`;
}

static goTo(path: string): Cypress.Chainable<Cypress.AUTWindow> {
throw new Error('invalid');
}

constructor(clusterId: string, userId: string) {
super(MgmtUserResourceDetailPo.createPath(clusterId, userId));
}

detail() {
return new MgmtUserResourceDetailComponentPo(this.self());
}
}
15 changes: 15 additions & 0 deletions cypress/e2e/po/detail/role.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';

export default abstract class RoleDetailPo extends PagePo {
private static createPath(clusterId: string, resource: string, roleId: string) {
return `/c/${ clusterId }/auth/roles/${ resource }/${ roleId }`;
}

static goTo(path: string): Cypress.Chainable<Cypress.AUTWindow> {
throw new Error('invalid');
}

constructor(clusterId = '_', resource: string, roleId: string) {
super(RoleDetailPo.createPath(clusterId, resource, roleId));
}
}
7 changes: 7 additions & 0 deletions cypress/e2e/po/edit/management.cattle.io.globalrole.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import RoleEditPo from '@/cypress/e2e/po/edit/role.po';

export default class GlobalRoleEditPo extends RoleEditPo {
constructor(clusterId = '_', roleId?: string) {
super(clusterId, 'management.cattle.io.globalrole', roleId);
}
}
7 changes: 7 additions & 0 deletions cypress/e2e/po/edit/management.cattle.io.roletemplate.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import RoleEditPo from '@/cypress/e2e/po/edit/role.po';

export default class RoleTemplateEditPo extends RoleEditPo {
constructor(clusterId = '_', roleId?: string) {
super(clusterId, 'management.cattle.io.roletemplate', roleId);
}
}
56 changes: 56 additions & 0 deletions cypress/e2e/po/edit/management.cattle.io.user.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import LabeledInputPo from '@/cypress/e2e/po/components/labeled-input.po';
import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po';
import CheckboxInputPo from '@/cypress/e2e/po/components/checkbox-input.po';
import { CypressChainable } from '@/cypress/e2e/po/po.types';

export default class MgmtUserEditPo extends PagePo {
private static createPath(clusterId: string, userId?: string ) {
const root = `/c/${ clusterId }/auth/management.cattle.io.user`;

return userId ? `${ root }/${ userId }?mode=edit` : `${ root }/create`;
}

static goTo(path: string): Cypress.Chainable<Cypress.AUTWindow> {
throw new Error('invalid');
}

constructor(clusterId = '_', userId?: string) {
super(MgmtUserEditPo.createPath(clusterId, userId));
}

name(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'Name');
}

username(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'Username');
}

description(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'Description');
}

newPass(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'New Password');
}

confirmNewPass(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'Confirm Password');
}

selectCheckbox(label:string): CheckboxInputPo {
return CheckboxInputPo.byLabel(this.self(), label);
}

saveCreateForm(): AsyncButtonPo {
return new AsyncButtonPo('[data-testid="form-save"]', this.self());
}

saveAndWaitForRequests(method: string, url: any, multipleCalls?: boolean): CypressChainable {
cy.intercept(method, url).as('request');
this.saveCreateForm().click();

return (multipleCalls ? cy.wait(['@request', '@request'], { timeout: 10000 }) : cy.wait('@request', { timeout: 10000 }));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import ClusterManagerCreatePagePo from '@/cypress/e2e/po/edit/provisioning.cattl
import EmberInputPo from '@/cypress/e2e/po/components/ember/ember-input.po';
import ClusterManagerCreateRKE1PagePo from '@/cypress/e2e/po/edit/provisioning.cattle.io.cluster/create/cluster-create-rke1.po';
import EmberAccordionPo from '@/cypress/e2e/po/components/ember/ember-accordion.po';
import EmberFormMembersPo from '~/cypress/e2e/po/components/ember/ember-form-members.po';
import EmberFormMembersPo from '@/cypress/e2e/po/components/ember/ember-form-members.po';

/**
* Create page for an RKE1 custom cluster
Expand Down
73 changes: 73 additions & 0 deletions cypress/e2e/po/edit/role.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';

import LabeledInputPo from '@/cypress/e2e/po/components/labeled-input.po';
import LabeledSelectPo from '@/cypress/e2e/po/components/labeled-select.po';
import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po';
import CheckboxInputPo from '@/cypress/e2e/po/components/checkbox-input.po';
import { CypressChainable } from '@/cypress/e2e/po/po.types';
import RadioGroupInputPo from '@/cypress/e2e/po/components/radio-group-input.po';

export default abstract class RoleEditPo extends PagePo {
private static createPath(clusterId: string, resource: string, roleId?: string) {
const root = `/c/${ clusterId }/auth/roles/${ resource }`;

return roleId ? `${ root }/${ roleId }?mode=edit` : `${ root }/create`;
}

static goTo(path: string): Cypress.Chainable<Cypress.AUTWindow> {
throw new Error('invalid');
}

constructor(clusterId = '_', resource: string, roleId?: string) {
super(RoleEditPo.createPath(clusterId, resource, roleId));
}

name(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'Name');
}

description(): LabeledInputPo {
return LabeledInputPo.byLabel(this.self(), 'Description');
}

selectCheckbox(label:string): CheckboxInputPo {
return CheckboxInputPo.byLabel(this.self(), label);
}

saveCreateForm(): AsyncButtonPo {
return new AsyncButtonPo('[data-testid="form-save"]', this.self());
}

saveAndWaitForRequests(method: string, url: any): CypressChainable {
cy.intercept(method, url).as('request');
this.saveCreateForm().click();

return cy.wait('@request', { timeout: 10000 });
}

selectVerbs(itemRow: number, optionIndex: number) {
const selectVerb = new LabeledSelectPo(`[data-testid="grant-resources-verbs${ itemRow }"]`, this.self());

selectVerb.toggle();
selectVerb.clickOption(optionIndex);
}

selectResourcesByLabelValue(itemRow: number, label: string) {
const selectResources = new LabeledSelectPo(`[data-testid="grant-resources-resources${ itemRow }"]`, this.self());

selectResources.toggle();
selectResources.clickOptionWithLabel(label);
}

selectCreatorDefaultRadioBtn(optionIndex: number): CypressChainable {
const selectRadio = new RadioGroupInputPo('[data-testid="roletemplate-creator-default-options"] div > .radio-container', this.self());

return selectRadio.set(optionIndex);
}

selectLockedRadioBtn(optionIndex: number): CypressChainable {
const selectRadio = new RadioGroupInputPo('[data-testid="roletemplate-locked-options"] div > .radio-container', this.self());

return selectRadio.set(optionIndex);
}
}
2 changes: 1 addition & 1 deletion cypress/e2e/po/lists/home-cluster-list.po.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import BaseResourceList from '~/cypress/e2e/po/lists/base-resource-list.po';
import BaseResourceList from '@/cypress/e2e/po/lists/base-resource-list.po';

/**
* List component for home page cluster resources
Expand Down
52 changes: 52 additions & 0 deletions cypress/e2e/po/lists/management.cattle.io.user.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import BaseResourceList from '@/cypress/e2e/po/lists/base-resource-list.po';
import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po';

/**
* List component for api key resources
*/
export default class MgmtUsersListPo extends BaseResourceList {
create() {
return this.masthead().actions().eq(0).click();
}

refreshGroupMembership(): AsyncButtonPo {
return new AsyncButtonPo('[data-testid="action-button-async-button"]', this.self());
}

deactivate() {
return cy.getId('sortable-table-deactivate');
}

activate() {
return cy.getId('sortable-table-activate');
}

openBulkActionDropdown() {
return this.resourceTable().sortableTable().bulkActionDropDownOpen();
}

bulkActionButton(name: string) {
return this.resourceTable().sortableTable().bulkActionDropDownButton(name);
}

selectAll() {
return this.resourceTable().sortableTable().selectAllCheckbox();
}

elements() {
return this.resourceTable().sortableTable().rowElements();
}

elementWithName(name: string) {
return this.resourceTable().sortableTable().rowElementWithName(name);
}

details(name: string, index: number) {
return this.resourceTable().sortableTable().rowWithName(name).column(index);
}

clickRowActionMenuItem(name: string, itemLabel:string) {
return this.resourceTable().sortableTable().rowActionMenuOpen(name, 7).getMenuItem(itemLabel)
.click();
}
}
23 changes: 23 additions & 0 deletions cypress/e2e/po/lists/role-list.po.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import BaseResourceList from '@/cypress/e2e/po/lists/base-resource-list.po';

export default class RoleListPo extends BaseResourceList {
downloadYaml() {
return this.resourceTable().downloadYamlButton().first();
}

delete() {
return this.resourceTable().sortableTable().deleteButton().first();
}

elements() {
return this.resourceTable().sortableTable().rowElements();
}

elementWithName(name: string) {
return this.resourceTable().sortableTable().rowElementWithName(name);
}

details(name: string, index: number) {
return this.resourceTable().sortableTable().rowWithName(name).column(index);
}
}
2 changes: 1 addition & 1 deletion cypress/e2e/po/pages/explorer/api-services.po.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import BaseResourceList from '~/cypress/e2e/po/lists/base-resource-list.po';
import BaseResourceList from '@/cypress/e2e/po/lists/base-resource-list.po';

export class APIServicesPagePo extends PagePo {
private static createPath(clusterId: string) {
Expand Down
2 changes: 1 addition & 1 deletion cypress/e2e/po/pages/explorer/workloads/workloads.po.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import LabeledInputPo from '@/cypress/e2e/po/components/labeled-input.po';
import AsyncButtonPo from '@/cypress/e2e/po/components/async-button.po';
import LabeledSelectPo from '@/cypress/e2e/po/components/labeled-select.po';
import WorkloadPagePo from '@/cypress/e2e/po/pages/explorer/workloads.po';
import PromptRemove from '~/cypress/e2e/po/prompts/promptRemove.po';
import PromptRemove from '@/cypress/e2e/po/prompts/promptRemove.po';
import { WorkloadType } from '@shell/types/fleet';
export class workloadDetailsPageBasePo extends PagePo {
static url: string;
Expand Down
2 changes: 1 addition & 1 deletion cypress/e2e/po/pages/extensions.po.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import ActionMenuPo from '@/cypress/e2e/po/components/action-menu.po';
import NameNsDescriptionPo from '@/cypress/e2e/po/components/name-ns-description.po';
import ReposListPagePo from '@/cypress/e2e/po/pages/repositories.po';
import AppClusterRepoEditPo from '@/cypress/e2e/po/edit/catalog.cattle.io.clusterrepo.po';
import BannersPo from '~/cypress/e2e/po/components/banners.po';
import BannersPo from '@/cypress/e2e/po/components/banners.po';

export default class ExtensionsPagePo extends PagePo {
static url = '/c/local/uiplugins'
Expand Down
8 changes: 4 additions & 4 deletions cypress/e2e/po/pages/home.po.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import PagePo from '@/cypress/e2e/po/pages/page.po';
import PageActions from '@/cypress/e2e/po/side-bars/page-actions.po';
import BannerGraphicPo from '~/cypress/e2e/po/components/banner-graphic.po';
import BannersPo from '~/cypress/e2e/po/components/banners.po';
import SimpleBoxPo from '~/cypress/e2e/po/components/simple-box.po';
import HomeClusterListPo from '~/cypress/e2e/po/lists/home-cluster-list.po';
import BannerGraphicPo from '@/cypress/e2e/po/components/banner-graphic.po';
import BannersPo from '@/cypress/e2e/po/components/banners.po';
import SimpleBoxPo from '@/cypress/e2e/po/components/simple-box.po';
import HomeClusterListPo from '@/cypress/e2e/po/lists/home-cluster-list.po';

export default class HomePagePo extends PagePo {
static url = '/home'
Expand Down
8 changes: 4 additions & 4 deletions cypress/e2e/po/pages/page.po.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import ComponentPo from '@/cypress/e2e/po/components/component.po';
import BurgerMenuPo from '~/cypress/e2e/po/side-bars/burger-side-menu.po';
import ProductNavPo from '~/cypress/e2e/po/side-bars/product-side-nav.po';
import BurgerMenuPo from '@/cypress/e2e/po/side-bars/burger-side-menu.po';
import ProductNavPo from '@/cypress/e2e/po/side-bars/product-side-nav.po';

export default class PagePo extends ComponentPo {
constructor(protected path: string, selector = '.dashboard-root') {
Expand Down Expand Up @@ -34,8 +34,8 @@ export default class PagePo extends ComponentPo {
}
}

goTo(): Cypress.Chainable<Cypress.AUTWindow> {
return PagePo.goTo(this.path);
goTo(params?: string, fragment?: string): Cypress.Chainable<Cypress.AUTWindow> {
return PagePo.goTo(`${ this.path }${ !!params ? `?${ params }` : '' }${ !!fragment ? `#${ fragment }` : '' }`);
}

waitForPage(params?: string, fragment?: string) {
Expand Down
Loading

0 comments on commit 5be8469

Please sign in to comment.