1 import { by, element } from 'protractor';
2 import { PageHelper } from '../page-helper.po';
5 index: '/#/rgw/bucket',
6 create: '/#/rgw/bucket/create'
9 export class BucketsPageHelper extends PageHelper {
11 versioningStateEnabled = 'Enabled';
12 versioningStateSuspended = 'Suspended';
14 private async selectOwner(owner: string) {
15 return this.selectOption('owner', owner);
18 private async selectPlacementTarget(placementTarget: string) {
19 return this.selectOption('placement-target', placementTarget);
23 * TODO add check to verify the existance of the bucket!
24 * TODO let it print a meaningful error message (for devs) if it does not exist!
26 @PageHelper.restrictTo(pages.create)
27 async create(name: string, owner: string, placementTarget: string) {
28 // Enter in bucket name
29 await element(by.id('bid')).sendKeys(name);
31 // Select bucket owner
32 await this.selectOwner(owner);
33 await expect(element(by.id('owner')).getAttribute('class')).toContain('ng-valid');
35 // Select bucket placement target:
36 await this.selectPlacementTarget(placementTarget);
37 await expect(element(by.id('placement-target')).getAttribute('class')).toContain('ng-valid');
39 // Click the create button and wait for bucket to be made
40 const createButton = element(by.cssContainingText('button', 'Create Bucket'));
41 await createButton.click();
43 return this.waitPresence(
44 this.getFirstTableCellWithText(name),
45 'Timed out waiting for bucket creation'
49 @PageHelper.restrictTo(pages.index)
50 async edit(name: string, new_owner: string) {
51 await this.waitClickableAndClick(this.getFirstTableCellWithText(name)); // wait for table to load and click
52 await element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page
53 await this.waitTextToBePresent(this.getBreadcrumb(), 'Edit');
54 await expect(element(by.css('input[name=placement-target]')).getAttribute('value')).toBe(
57 await this.selectOwner(new_owner);
60 await expect(element(by.css('input[id=versioning]')).getAttribute('checked')).toBeFalsy();
61 await element(by.css('label[for=versioning]')).click();
62 await expect(element(by.css('input[id=versioning]')).getAttribute('checked')).toBeTruthy();
64 await element(by.cssContainingText('button', 'Edit Bucket')).click();
66 // wait to be back on buckets page with table visible and click
67 await this.waitClickableAndClick(
68 this.getFirstTableCellWithText(name),
69 'Could not return to buckets page and load table after editing bucket'
72 // check its details table for edited owner field
73 let bucketDataTable = element.all(by.css('.table.table-striped.table-bordered')).first();
74 await expect(bucketDataTable.getText()).toMatch(new_owner);
76 // Check versioning enabled:
77 const ownerValueCell = bucketDataTable
82 await expect(ownerValueCell.getText()).toEqual(new_owner);
83 let versioningValueCell = bucketDataTable
88 await expect(versioningValueCell.getText()).toEqual(this.versioningStateEnabled);
90 // Disable versioning:
91 await this.uncheckAllTableRows();
92 await this.waitClickableAndClick(this.getFirstTableCellWithText(name)); // wait for table to load and click
93 await element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page
94 await this.waitTextToBePresent(this.getBreadcrumb(), 'Edit');
95 await element(by.css('label[for=versioning]')).click();
96 await expect(element(by.css('input[id=versioning]')).getAttribute('checked')).toBeFalsy();
97 await element(by.cssContainingText('button', 'Edit Bucket')).click();
99 // Check versioning suspended:
100 await this.waitClickableAndClick(
101 this.getFirstTableCellWithText(name),
102 'Could not return to buckets page and load table after editing bucket'
104 bucketDataTable = element.all(by.css('.table.table-striped.table-bordered')).first();
105 versioningValueCell = bucketDataTable
110 return expect(versioningValueCell.getText()).toEqual(this.versioningStateSuspended);
113 async testInvalidCreate() {
114 await this.navigateTo('create');
115 const nameInputField = element(by.id('bid')); // Grabs name box field
117 // Gives an invalid name (too short), then waits for dashboard to determine validity
118 await nameInputField.sendKeys('rq');
120 await element(by.id('owner')).click(); // To trigger a validation
122 await this.waitFn(async () => {
123 // Waiting for website to decide if name is valid or not
124 const klass = await nameInputField.getAttribute('class');
125 return !klass.includes('ng-pending');
126 }, 'Timed out waiting for dashboard to decide bucket name validity');
128 // Check that name input field was marked invalid in the css
129 await expect(nameInputField.getAttribute('class')).toContain('ng-invalid');
131 // Check that error message was printed under name input field
132 await expect(element(by.css('#bid + .invalid-feedback')).getText()).toMatch(
133 'The value is not valid.'
136 // Test invalid owner input
137 // select some valid option. The owner drop down error message will not appear unless a valid user was selected at
138 // one point before the invalid placeholder user is selected.
139 await this.selectOwner('dev');
141 // select the first option, which is invalid because it is a placeholder
142 await this.selectOwner('Select a user');
144 await nameInputField.click();
146 // Check that owner drop down field was marked invalid in the css
147 await expect(element(by.id('owner')).getAttribute('class')).toContain('ng-invalid');
149 // Check that error message was printed under owner drop down field
150 await expect(element(by.css('#owner + .invalid-feedback')).getText()).toMatch(
151 'This field is required.'
154 // Check invalid placement target input
155 await this.selectOwner('dev');
156 // The drop down error message will not appear unless a valid option is previsously selected.
157 await this.selectPlacementTarget('default-placement');
158 await this.selectPlacementTarget('Select a placement target');
159 await nameInputField.click(); // Trigger validation
160 await expect(element(by.id('placement-target')).getAttribute('class')).toContain('ng-invalid');
161 await expect(element(by.css('#placement-target + .invalid-feedback')).getText()).toMatch(
162 'This field is required.'
165 // Clicks the Create Bucket button but the page doesn't move. Done by testing
166 // for the breadcrumb
167 await element(by.cssContainingText('button', 'Create Bucket')).click(); // Clicks Create Bucket button
168 await this.waitTextToBePresent(this.getBreadcrumb(), 'Create');
169 // content in fields seems to subsist through tests if not cleared, so it is cleared
170 await nameInputField.clear();
171 return element(by.cssContainingText('button', 'Cancel')).click();
174 async testInvalidEdit(name: string) {
175 await this.navigateTo();
177 await this.waitClickableAndClick(this.getFirstTableCellWithText(name)); // wait for table to load and click
178 await element(by.cssContainingText('button', 'Edit')).click(); // click button to move to edit page
180 await this.waitTextToBePresent(this.getBreadcrumb(), 'Edit');
182 await expect(element(by.css('input[id=versioning]')).getAttribute('checked')).toBeFalsy();
184 // Chooses 'Select a user' rather than a valid owner on Edit Bucket page
185 // and checks if it's an invalid input
187 // select the first option, which is invalid because it is a placeholder
188 await this.selectOwner('Select a user');
190 // Changes when updated to bootstrap 4 -> Error message takes a long time to appear unless another field
191 // is clicked on. For that reason, I'm having the test click on the edit button before checking for errors
192 await element(by.cssContainingText('button', 'Edit Bucket')).click();
194 // Check that owner drop down field was marked invalid in the css
195 await expect(element(by.id('owner')).getAttribute('class')).toContain('ng-invalid');
197 // Check that error message was printed under owner drop down field
198 await expect(element(by.css('#owner + .invalid-feedback')).getText()).toMatch(
199 'This field is required.'
202 await this.waitTextToBePresent(this.getBreadcrumb(), 'Edit');