From: Adam King Date: Tue, 13 Aug 2019 15:26:15 +0000 (-0400) Subject: mgr/dashboard: User Management E2E tests X-Git-Tag: v15.1.0~1794^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=bfdf7714e3619bb65ad22798d4653eae096b71d3;p=ceph-ci.git mgr/dashboard: User Management E2E tests Test breadcrumbs for user management pages Test creating, editing and deleting a user Test creating, editing and deleting a role Fixes: https://tracker.ceph.com/issues/41231 Fixes: https://tracker.ceph.com/issues/41232 Fixes: https://tracker.ceph.com/issues/41233 Signed-off-by: Adam King Signed-off-by: Rafael Quintero --- diff --git a/src/pybind/mgr/dashboard/frontend/e2e/helper.po.ts b/src/pybind/mgr/dashboard/frontend/e2e/helper.po.ts index 1adaf728231..e0891edaf46 100644 --- a/src/pybind/mgr/dashboard/frontend/e2e/helper.po.ts +++ b/src/pybind/mgr/dashboard/frontend/e2e/helper.po.ts @@ -17,6 +17,7 @@ import { PoolPageHelper } from './pools/pools.po'; import { BucketsPageHelper } from './rgw/buckets.po'; import { DaemonsPageHelper } from './rgw/daemons.po'; import { UsersPageHelper } from './rgw/users.po'; +import { UserMgmtPageHelper } from './user-mgmt.po'; export class Helper { static EC = browser.ExpectedConditions; @@ -40,6 +41,7 @@ export class Helper { iscsi: IscsiPageHelper; mirroring: MirroringPageHelper; dashboard: DashboardPageHelper; + usermgmt: UserMgmtPageHelper; constructor() { this.buckets = new BucketsPageHelper(); @@ -60,6 +62,7 @@ export class Helper { this.iscsi = new IscsiPageHelper(); this.mirroring = new MirroringPageHelper(); this.dashboard = new DashboardPageHelper(); + this.usermgmt = new UserMgmtPageHelper(); } /** diff --git a/src/pybind/mgr/dashboard/frontend/e2e/user-mgmt.e2e-spec.ts b/src/pybind/mgr/dashboard/frontend/e2e/user-mgmt.e2e-spec.ts new file mode 100644 index 00000000000..bd3ecb0853a --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/e2e/user-mgmt.e2e-spec.ts @@ -0,0 +1,65 @@ +import { Helper } from './helper.po'; + +describe('User Management page', () => { + let usermgmt: Helper['usermgmt']; + const user_name = 'user_mgmt_create_edit_delete_user'; + const role_name = 'user_mgmt_create_edit_delete_role'; + + beforeAll(() => { + usermgmt = new Helper().usermgmt; + }); + + afterEach(() => { + Helper.checkConsole(); + }); + + describe('breadcrumb tests', () => { + it('should check breadcrumb on users tab of user management page', () => { + usermgmt.navigateTo('users'); + expect(usermgmt.getBreadcrumbText()).toEqual('Users'); + }); + + it('should check breadcrumb on roles tab of user management page', () => { + usermgmt.navigateTo('roles'); + expect(usermgmt.getBreadcrumbText()).toEqual('Roles'); + }); + + it('should check breadcrumb on user creation page', () => { + usermgmt.navigateTo('userCreate'); + expect(usermgmt.getBreadcrumbText()).toEqual('Create'); + }); + + it('should check breadcrumb on role creation page', () => { + usermgmt.navigateTo('roleCreate'); + expect(usermgmt.getBreadcrumbText()).toEqual('Create'); + }); + }); + + describe('user create, edit & delete test', () => { + it('should create a user', () => { + usermgmt.userCreate(user_name, 'cool_password', 'Jeff', 'realemail@realwebsite.com'); + }); + + it('should edit a user', () => { + usermgmt.userEdit(user_name, 'cool_password_number_2', 'Geoff', 'w@m'); + }); + + it('should delete a user', () => { + usermgmt.userDelete(user_name); + }); + }); + + describe('role create, edit & delete test', () => { + it('should create a role', () => { + usermgmt.roleCreate(role_name, 'An interesting description'); + }); + + it('should edit a role', () => { + usermgmt.roleEdit(role_name, 'A far more interesting description'); + }); + + it('should delete a role', () => { + usermgmt.roleDelete(role_name); + }); + }); +}); diff --git a/src/pybind/mgr/dashboard/frontend/e2e/user-mgmt.po.ts b/src/pybind/mgr/dashboard/frontend/e2e/user-mgmt.po.ts new file mode 100644 index 00000000000..ecd636572b7 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/e2e/user-mgmt.po.ts @@ -0,0 +1,121 @@ +import { $, browser, by, element } from 'protractor'; +import { Helper } from './helper.po'; +import { PageHelper } from './page-helper.po'; + +export class UserMgmtPageHelper extends PageHelper { + pages = { + index: '/#/user-management', + users: '/#/user-management/users', + userCreate: '/#/user-management/users/create', + roles: '/#/user-management/roles', + roleCreate: '/#/user-management/roles/create' + }; + + userCreate(username, password, name, email) { + this.navigateTo('userCreate'); + + // fill in fields + element(by.id('username')).sendKeys(username); + element(by.id('password')).sendKeys(password); + element(by.id('confirmpassword')).sendKeys(password); + element(by.id('name')).sendKeys(name); + element(by.id('email')).sendKeys(email); + + // Click the create button and wait for user to be made + const createButton = element(by.cssContainingText('button', 'Create User')); + this.moveClick(createButton).then(() => { + browser.wait(Helper.EC.presenceOf(this.getTableCell(username)), Helper.TIMEOUT); + }); + } + + userEdit(username, password, name, email) { + this.navigateTo('users'); + + this.getTableCell(username).click(); // select user from table + element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page + + // fill in fields with new values + element(by.id('password')).clear(); + element(by.id('password')).sendKeys(password); + element(by.id('confirmpassword')).clear(); + element(by.id('confirmpassword')).sendKeys(password); + element(by.id('name')).clear(); + element(by.id('name')).sendKeys(name); + element(by.id('email')).clear(); + element(by.id('email')).sendKeys(email); + + // Click the edit button and check new values are present in table + const editButton = element(by.cssContainingText('button', 'Edit User')); + this.moveClick(editButton).then(() => { + browser.wait(Helper.EC.presenceOf(this.getTableCell(email)), Helper.TIMEOUT); + browser.wait(Helper.EC.presenceOf(this.getTableCell(name)), Helper.TIMEOUT); + }); + } + + userDelete(username) { + this.navigateTo('users'); + + this.getTableCell(username).click(); // select user from table + $('.table-actions button.dropdown-toggle').click(); // click toggle menu + $('li.delete a').click(); // click delete + + browser.wait(Helper.EC.visibilityOf($('.custom-control-label')), Helper.TIMEOUT); + $('.custom-control-label').click(); // click confirmation checkbox + element(by.cssContainingText('button', 'Delete User')) // click delete user button + .click() + .then(() => { + browser.wait( + Helper.EC.stalenessOf(this.getFirstTableCellWithText(username)), + Helper.TIMEOUT + ); + }); + } + + roleCreate(name, description) { + this.navigateTo('roleCreate'); + + // fill in fields + element(by.id('name')).sendKeys(name); + element(by.id('description')).sendKeys(description); + + // Click the create button and wait for user to be made + const createButton = element(by.cssContainingText('button', 'Create Role')); + this.moveClick(createButton).then(() => { + browser.wait(Helper.EC.presenceOf(this.getTableCell(name)), Helper.TIMEOUT); + }); + } + + roleEdit(name, description) { + this.navigateTo('roles'); + + this.getTableCell(name).click(); // select role from table + element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page + + // fill in fields with new values + element(by.id('description')).clear(); + element(by.id('description')).sendKeys(description); + + // Click the edit button and check new values are present in table + const editButton = element(by.cssContainingText('button', 'Edit Role')); + this.moveClick(editButton).then(() => { + browser.wait(Helper.EC.presenceOf(this.getTableCell(name)), Helper.TIMEOUT); + browser.wait(Helper.EC.presenceOf(this.getTableCell(description)), Helper.TIMEOUT); + }); + } + + roleDelete(name) { + this.navigateTo('roles'); + + this.getTableCell(name).click(); // select role from table + $('.table-actions button.dropdown-toggle').click(); // click toggle menu + $('li.delete a').click(); // click delete + + browser.wait(Helper.EC.visibilityOf($('.custom-control-label')), Helper.TIMEOUT); + $('.custom-control-label').click(); // click confirmation checkbox + element(by.cssContainingText('button', 'Delete Role')) // click delete user button + .click() + .then(() => { + browser.wait(Helper.EC.stalenessOf(this.getFirstTableCellWithText(name)), Helper.TIMEOUT); + }); + } +}