From ec2d74132a40b24f2c8e9fc94b0f7198c11dc3ae Mon Sep 17 00:00:00 2001 From: Patrick Seidensal Date: Mon, 19 Aug 2019 10:21:50 +0200 Subject: [PATCH] mgr/dashboard: migrate E2E rgw-users to async/await Fixes: https://tracker.ceph.com/issues/40693 Signed-off-by: Patrick Seidensal --- .../frontend/e2e/rgw/users.e2e-spec.ts | 44 +-- .../dashboard/frontend/e2e/rgw/users.po.ts | 258 ++++++++---------- 2 files changed, 141 insertions(+), 161 deletions(-) diff --git a/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.e2e-spec.ts b/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.e2e-spec.ts index 1791e4974f8..33870b3cb8a 100644 --- a/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.e2e-spec.ts +++ b/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.e2e-spec.ts @@ -8,52 +8,52 @@ describe('RGW users page', () => { users = new Helper().users; }); - afterEach(() => { - Helper.checkConsole(); + afterEach(async () => { + await Helper.checkConsole(); }); describe('breadcrumb test', () => { - beforeAll(() => { - users.navigateTo(); + beforeAll(async () => { + await users.navigateTo(); }); - it('should open and show breadcrumb', () => { - expect(users.getBreadcrumbText()).toEqual('Users'); + it('should open and show breadcrumb', async () => { + expect(await users.getBreadcrumbText()).toEqual('Users'); }); }); describe('create, edit & delete user test', () => { - beforeAll(() => { - users.navigateTo(); + beforeAll(async () => { + await users.navigateTo(); }); - it('should create user', () => { - users.create(user_name, 'Some Name', 'original@website.com', '1200'); - expect(users.getTableCell(user_name).isPresent()).toBe(true); + it('should create user', async () => { + await users.create(user_name, 'Some Name', 'original@website.com', '1200'); + expect(await users.getTableCell(user_name).isPresent()).toBe(true); }); - it('should edit users full name, email and max buckets', () => { - users.edit(user_name, 'Another Identity', 'changed@othersite.com', '1969'); + it('should edit users full name, email and max buckets', async () => { + await users.edit(user_name, 'Another Identity', 'changed@othersite.com', '1969'); // checks for succsessful editing are done within edit function }); - it('should delete user', () => { - users.delete(user_name); - expect(users.getTableCell(user_name).isPresent()).toBe(false); + it('should delete user', async () => { + await users.delete(user_name); + expect(await users.getTableCell(user_name).isPresent()).toBe(false); }); }); describe('Invalid input test', () => { - beforeAll(() => { - users.navigateTo(); + beforeAll(async () => { + await users.navigateTo(); }); - it('should put invalid input into user creation form and check fields are marked invalid', () => { - users.invalidCreate(); + it('should put invalid input into user creation form and check fields are marked invalid', async () => { + await users.invalidCreate(); }); - it('should put invalid input into user edit form and check fields are marked invalid', () => { - users.invalidEdit(); + it('should put invalid input into user edit form and check fields are marked invalid', async () => { + await users.invalidEdit(); }); }); }); diff --git a/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.po.ts b/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.po.ts index a8a8189ba30..d146ca6e9f6 100644 --- a/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.po.ts +++ b/src/pybind/mgr/dashboard/frontend/e2e/rgw/users.po.ts @@ -9,226 +9,206 @@ export class UsersPageHelper extends PageHelper { create: '/#/rgw/user/create' }; - create(username, fullname, email, maxbuckets) { - this.navigateTo('create'); + async create(username, fullname, email, maxbuckets) { + await this.navigateTo('create'); - expect(this.getBreadcrumbText()).toBe('Create'); + expect(await this.getBreadcrumbText()).toBe('Create'); // Enter in username - element(by.id('uid')).sendKeys(username); + await element(by.id('uid')).sendKeys(username); // Enter in full name - this.moveClick(element(by.id('display_name'))); - element(by.id('display_name')).sendKeys(fullname); + await element(by.id('display_name')).click(); + await element(by.id('display_name')).sendKeys(fullname); // Enter in email - this.moveClick(element(by.id('email'))); - element(by.id('email')).sendKeys(email); + await element(by.id('email')).click(); + await element(by.id('email')).sendKeys(email); - // Eneter max buckets - this.moveClick(element(by.id('max_buckets'))); - element(by.id('max_buckets')).clear(); - element(by.id('max_buckets')).sendKeys(maxbuckets); + // Enter max buckets + await element(by.id('max_buckets')).click(); + await element(by.id('max_buckets')).clear(); + await element(by.id('max_buckets')).sendKeys(maxbuckets); // 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)), 10000); - }); + await element(by.cssContainingText('button', 'Create User')).click(); + await browser.wait(Helper.EC.presenceOf(this.getTableCell(username)), 10000); } - edit(name, new_fullname, new_email, new_maxbuckets) { - this.navigateTo(); + async edit(name, new_fullname, new_email, new_maxbuckets) { + await this.navigateTo(); - browser.wait(Helper.EC.elementToBeClickable(this.getTableCell(name)), 10000); // wait for table to load - this.getTableCell(name).click(); // click on the bucket you want to edit in the table - element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page + await browser.wait(Helper.EC.elementToBeClickable(this.getTableCell(name)), 10000); // wait for table to load + await this.getTableCell(name).click(); // click on the bucket you want to edit in the table + await element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page - expect(this.getBreadcrumbText()).toEqual('Edit'); + expect(await this.getBreadcrumbText()).toEqual('Edit'); // Change the full name field - this.moveClick(element(by.id('display_name'))); - element(by.id('display_name')).clear(); - element(by.id('display_name')).sendKeys(new_fullname); + await element(by.id('display_name')).click(); + await element(by.id('display_name')).clear(); + await element(by.id('display_name')).sendKeys(new_fullname); // Change the email field - this.moveClick(element(by.id('email'))); - element(by.id('email')).clear(); - element(by.id('email')).sendKeys(new_email); + await element(by.id('email')).click(); + await element(by.id('email')).clear(); + await element(by.id('email')).sendKeys(new_email); // Change the max buckets field - this.moveClick(element(by.id('max_buckets'))); - element(by.id('max_buckets')).clear(); - element(by.id('max_buckets')).sendKeys(new_maxbuckets); + await element(by.id('max_buckets')).click(); + await element(by.id('max_buckets')).clear(); + await element(by.id('max_buckets')).sendKeys(new_maxbuckets); const editbutton = element(by.cssContainingText('button', 'Edit User')); - this.moveClick(editbutton).then(() => { - browser.wait(Helper.EC.elementToBeClickable(this.getTableCell(name)), 10000).then(() => { - // Click the user and check its details table for updated content - this.getTableCell(name).click(); - expect($('.active.tab-pane').getText()).toMatch(new_fullname); // check full name was changed - expect($('.active.tab-pane').getText()).toMatch(new_email); // check email was changed - expect($('.active.tab-pane').getText()).toMatch(new_maxbuckets); // check max buckets was changed - }); - }); + await editbutton.click(); + await browser.wait(Helper.EC.elementToBeClickable(this.getTableCell(name)), 10000); + // Click the user and check its details table for updated content + await this.getTableCell(name).click(); + expect(await $('.active.tab-pane').getText()).toMatch(new_fullname); // check full name was changed + expect(await $('.active.tab-pane').getText()).toMatch(new_email); // check email was changed + expect(await $('.active.tab-pane').getText()).toMatch(new_maxbuckets); // check max buckets was changed } - delete(name) { - this.navigateTo(); + async delete(name) { + await this.navigateTo(); // wait for table to load const my_user = this.getFirstTableCellWithText(name); - browser.wait(Helper.EC.elementToBeClickable(my_user), 10000); + await browser.wait(Helper.EC.elementToBeClickable(my_user), 10000); - my_user.click(); // click on the user you want to delete in the table - $('.table-actions button.dropdown-toggle').click(); // click toggle menu - $('li.delete a').click(); // click delete + await my_user.click(); // click on the user you want to delete in the table + await $('.table-actions button.dropdown-toggle').click(); // click toggle menu + await $('li.delete a').click(); // click delete // wait for pop-up to be visible (checks for title of pop-up) - browser.wait(Helper.EC.visibilityOf($('.modal-title.float-left')), 10000).then(() => { - browser.wait(Helper.EC.visibilityOf($('.custom-control-label')), 5000); - $('.custom-control-label').click(); // click confirmation checkbox - element(by.cssContainingText('button', 'Delete user')) - .click() - .then(() => { - browser.wait( - Helper.EC.not(Helper.EC.presenceOf(this.getFirstTableCellWithText(name))), - 10000 - ); - }); - }); + await browser.wait(Helper.EC.visibilityOf($('.modal-title.float-left')), 10000); + await browser.wait(Helper.EC.visibilityOf($('.custom-control-label')), 5000); + await $('.custom-control-label').click(); // click confirmation checkbox + await element(by.cssContainingText('button', 'Delete user')).click(); + await browser.wait( + Helper.EC.not(Helper.EC.presenceOf(this.getFirstTableCellWithText(name))), + 10000 + ); } - invalidCreate() { + async invalidCreate() { const uname = '000invalid_create_user'; // creating this user in order to check that you can't give two users the same name - this.create(uname, 'xxx', 'xxx@xxx', '1'); + await this.create(uname, 'xxx', 'xxx@xxx', '1'); - this.navigateTo('create'); + await this.navigateTo('create'); const username_field = element(by.id('uid')); // No username had been entered. Field should be invalid - expect(username_field.getAttribute('class')).toContain('ng-invalid'); + expect(await username_field.getAttribute('class')).toContain('ng-invalid'); // Try to give user already taken name. Should make field invalid. - username_field.clear().then(() => { - username_field.sendKeys(uname).then(() => { - browser - .wait(function() { - return username_field.getAttribute('class').then(function(classValue) { - return classValue.indexOf('ng-pending') === -1; - }); - }, 6000) - .then(() => { - expect(username_field.getAttribute('class')).toContain('ng-invalid'); - this.moveClick(element(by.id('display_name'))); // trigger validation check - expect(element(by.css('#uid + .invalid-feedback')).getText()).toMatch( - 'The chosen user ID is already in use.' - ); - }); - }); - }); + await username_field.clear(); + await username_field.sendKeys(uname); + await browser.wait( + async () => !(await username_field.getAttribute('class')).includes('ng-pending'), + 6000 + ); + expect(await username_field.getAttribute('class')).toContain('ng-invalid'); + await element(by.id('display_name')).click(); // trigger validation check + expect(await element(by.css('#uid + .invalid-feedback')).getText()).toMatch( + 'The chosen user ID is already in use.' + ); // check that username field is marked invalid if username has been cleared off for (let i = 0; i < uname.length; i++) { - username_field.sendKeys(protractor.Key.BACK_SPACE); + await username_field.sendKeys(protractor.Key.BACK_SPACE); } - expect(username_field.getAttribute('class')).toContain('ng-invalid'); - this.moveClick(element(by.id('display_name'))); // trigger validation check - expect(element(by.css('#uid + .invalid-feedback')).getText()).toMatch( + expect(await username_field.getAttribute('class')).toContain('ng-invalid'); + await element(by.id('display_name')).click(); // trigger validation check + expect(await element(by.css('#uid + .invalid-feedback')).getText()).toMatch( 'This field is required.' ); // No display name has been given so field should be invalid - expect(element(by.id('display_name')).getAttribute('class')).toContain('ng-invalid'); + expect(await element(by.id('display_name')).getAttribute('class')).toContain('ng-invalid'); // display name field should also be marked invalid if given input then emptied - this.moveClick(element(by.id('display_name'))); - element(by.id('display_name')).sendKeys('a'); - element(by.id('display_name')).sendKeys(protractor.Key.BACK_SPACE); - expect(element(by.id('display_name')).getAttribute('class')).toContain('ng-invalid'); - this.moveClick(username_field); // trigger validation check - expect(element(by.css('#display_name + .invalid-feedback')).getText()).toMatch( + await element(by.id('display_name')).click(); + await element(by.id('display_name')).sendKeys('a'); + await element(by.id('display_name')).sendKeys(protractor.Key.BACK_SPACE); + expect(await element(by.id('display_name')).getAttribute('class')).toContain('ng-invalid'); + await username_field.click(); // trigger validation check + expect(await element(by.css('#display_name + .invalid-feedback')).getText()).toMatch( 'This field is required.' ); // put invalid email to make field invalid - this.moveClick(element(by.id('email'))); - element(by.id('email')).sendKeys('a'); - expect(element(by.id('email')).getAttribute('class')).toContain('ng-invalid'); - this.moveClick(username_field); // trigger validation check - expect(element(by.css('#email + .invalid-feedback')).getText()).toMatch( + await element(by.id('email')).click(); + await element(by.id('email')).sendKeys('a'); + expect(await element(by.id('email')).getAttribute('class')).toContain('ng-invalid'); + await username_field.click(); // trigger validation check + expect(await element(by.css('#email + .invalid-feedback')).getText()).toMatch( 'This is not a valid email address.' ); // put negative max buckets to make field invalid - this.moveClick(element(by.id('max_buckets'))); - element(by.id('max_buckets')).clear(); - element(by.id('max_buckets')).sendKeys('-5'); - expect(element(by.id('max_buckets')).getAttribute('class')).toContain('ng-invalid'); - this.moveClick(username_field); // trigger validation check - expect(element(by.css('#max_buckets + .invalid-feedback')).getText()).toMatch( + await element(by.id('max_buckets')).click(); + await element(by.id('max_buckets')).clear(); + await element(by.id('max_buckets')).sendKeys('-5'); + expect(await element(by.id('max_buckets')).getAttribute('class')).toContain('ng-invalid'); + await username_field.click(); // trigger validation check + expect(await element(by.css('#max_buckets + .invalid-feedback')).getText()).toMatch( 'The entered value must be >= 0.' ); - this.delete(uname); + await this.delete(uname); } - invalidEdit() { + async invalidEdit() { const uname = '000invalid_edit_user'; // creating this user to edit for the test - this.create(uname, 'xxx', 'xxx@xxx', '1'); + await this.create(uname, 'xxx', 'xxx@xxx', '1'); - this.navigateTo(); + await this.navigateTo(); - browser.wait(Helper.EC.elementToBeClickable(this.getTableCell(uname)), 10000); // wait for table to load - this.getTableCell(uname).click(); // click on the bucket you want to edit in the table - element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page + await browser.wait(Helper.EC.elementToBeClickable(this.getTableCell(uname)), 10000); // wait for table to load + await this.getTableCell(uname).click(); // click on the bucket you want to edit in the table + await element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page - expect(this.getBreadcrumbText()).toEqual('Edit'); + expect(await this.getBreadcrumbText()).toEqual('Edit'); // put invalid email to make field invalid - this.moveClick(element(by.id('email'))); - element(by.id('email')).clear(); - element(by.id('email')).sendKeys('a'); - browser - .wait(function() { - return element(by.id('email')) - .getAttribute('class') - .then(function(classValue) { - return classValue.indexOf('ng-pending') === -1; - }); - }, 6000) - .then(() => { - expect(element(by.id('email')).getAttribute('class')).toContain('ng-invalid'); - this.moveClick(element(by.id('display_name'))); // trigger validation check - expect(element(by.css('#email + .invalid-feedback')).getText()).toMatch( - 'This is not a valid email address.' - ); - }); + await element(by.id('email')).click(); + await element(by.id('email')).clear(); + await element(by.id('email')).sendKeys('a'); + await browser.wait( + async () => !(await element(by.id('email')).getAttribute('class')).includes('ng-pending'), + 6000 + ); + expect(await element(by.id('email')).getAttribute('class')).toContain('ng-invalid'); + await element(by.id('display_name')).click(); // trigger validation check + expect(await element(by.css('#email + .invalid-feedback')).getText()).toMatch( + 'This is not a valid email address.' + ); // empty the display name field making it invalid - this.moveClick(element(by.id('display_name'))); + await element(by.id('display_name')).click(); for (let i = 0; i < 3; i++) { - element(by.id('display_name')).sendKeys(protractor.Key.BACK_SPACE); + await element(by.id('display_name')).sendKeys(protractor.Key.BACK_SPACE); } - expect(element(by.id('display_name')).getAttribute('class')).toContain('ng-invalid'); - this.moveClick(element(by.id('email'))); // trigger validation check - expect(element(by.css('#display_name + .invalid-feedback')).getText()).toMatch( + expect(await element(by.id('display_name')).getAttribute('class')).toContain('ng-invalid'); + await element(by.id('email')).click(); // trigger validation check + expect(await element(by.css('#display_name + .invalid-feedback')).getText()).toMatch( 'This field is required.' ); // put negative max buckets to make field invalid - this.moveClick(element(by.id('max_buckets'))); - element(by.id('max_buckets')).clear(); - element(by.id('max_buckets')).sendKeys('-5'); - expect(element(by.id('max_buckets')).getAttribute('class')).toContain('ng-invalid'); - this.moveClick(element(by.id('email'))); // trigger validation check - expect(element(by.css('#max_buckets + .invalid-feedback')).getText()).toMatch( + await element(by.id('max_buckets')).click(); + await element(by.id('max_buckets')).clear(); + await element(by.id('max_buckets')).sendKeys('-5'); + expect(await element(by.id('max_buckets')).getAttribute('class')).toContain('ng-invalid'); + await element(by.id('email')).click(); // trigger validation check + expect(await element(by.css('#max_buckets + .invalid-feedback')).getText()).toMatch( 'The entered value must be >= 0.' ); - this.delete(uname); + await this.delete(uname); } } -- 2.39.5