Skip to content

Commit bb1805b

Browse files
authored
Merge pull request #109 from Gid733/master
Added tests for device user page
2 parents cc69cfe + 9156c12 commit bb1805b

21 files changed

+581
-124
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// these functions navigate user from login page to another page
2+
import {LoginPage} from '../Page objects/LoginPage';
3+
import {waitTillVisibleAndClick} from './other-helper-methods';
4+
import {Navbar} from '../Page objects/Navbar';
5+
import {browser} from 'protractor';
6+
import data from '../data';
7+
8+
const loginPage = new LoginPage();
9+
const navbar = new Navbar();
10+
11+
export function goToSettingsPage() {
12+
browser.get(data.startPageUrl);
13+
loginPage.login();
14+
waitTillVisibleAndClick(navbar.advancedButton);
15+
waitTillVisibleAndClick(navbar.settingsButton);
16+
}
17+
18+
export function goToDeviceUsersPage() {
19+
browser.get(data.startPageUrl);
20+
loginPage.login();
21+
waitTillVisibleAndClick(navbar.deviceUsersButton);
22+
}
23+
24+
export function myEFormsPage() {
25+
26+
}
27+
28+
export function gotToSites() {
29+
30+
}
31+
32+
export function gotToWorkers() {
33+
34+
}
35+
36+
export function gotToUnits() {
37+
38+
}
39+
40+
export function gotToSearchableList() {
41+
42+
}
43+
44+
export function gotSelectableList() {
45+
46+
}
47+
48+
export function gotToUserManagement() {
49+
50+
}
51+
52+
export function gotToGoogleAuthenticator() {
53+
54+
}
55+
56+
export function goToChangePassword() {
57+
58+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {browser, ExpectedConditions} from 'protractor';
2+
import {LoginPage} from '../Page objects/LoginPage';
3+
import {default as data} from '../data';
4+
import {Navbar} from '../Page objects/Navbar';
5+
6+
const loginPage = new LoginPage();
7+
const navbar = new Navbar();
8+
const startPageUrl = data.startPageUrl;
9+
10+
export function waitTillVisibleAndClick(element): void {
11+
browser.wait(ExpectedConditions.visibilityOf(element));
12+
element.click();
13+
}
14+
15+
export function getToPage(page) {
16+
browser.get(data.startPageUrl);
17+
loginPage.login();
18+
waitTillVisibleAndClick(page);
19+
}
20+
21+
export function signOut() {
22+
navbar.signOutDropdown.click();
23+
navbar.signOutButton.click();
24+
browser.wait(ExpectedConditions.elementToBeClickable(loginPage.loginButton));
25+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {$, $$, browser, by, element, ElementFinder, ExpectedConditions} from 'protractor';
2+
import {OtpModal} from './otp.modal';
3+
import {AddNewUserModal} from './add-new-user.modal';
4+
import data from '../../data';
5+
import {getRowObject, RowObject} from './row-object';
6+
import {DeleteModal} from './delete.modal';
7+
8+
9+
export class DeviceUsersPage {
10+
11+
// modal windows
12+
OTPModal = new OtpModal();
13+
addNewUserModal = new AddNewUserModal();
14+
deleteModal = new DeleteModal();
15+
// elements
16+
newDeviceUserButton: ElementFinder;
17+
deleteUserButton: ElementFinder;
18+
lastUser: RowObject;
19+
20+
// actions
21+
async getRowsNumber() {
22+
return $$(data.DeviceUsersPage.rowCountSelector).count();
23+
}
24+
25+
async usersCleanup() {
26+
let startNum = await this.getRowsNumber();
27+
while (startNum > 2) {
28+
this.deleteUserButton.click();
29+
this.deleteModal.okButton.click();
30+
startNum = await this.getRowsNumber();
31+
}
32+
return;
33+
}
34+
35+
constructor() {
36+
this.newDeviceUserButton = $('#newDeviceUserButton');
37+
this.deleteUserButton = element(by.xpath(data.DeviceUsersPage.deleteUserXPath));
38+
}
39+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {$, ElementFinder} from 'protractor';
2+
import data from '../../data';
3+
4+
export class EditUserPage {
5+
// elements
6+
public firstNameInput: ElementFinder;
7+
public lastNameInput: ElementFinder;
8+
public saveButton: ElementFinder;
9+
10+
// actions
11+
save(): void {
12+
this.saveButton.click();
13+
}
14+
15+
fillInputs() {
16+
this.firstNameInput.clear();
17+
this.firstNameInput.sendKeys(data.DeviceUsersPage.sampleEditFistName);
18+
this.lastNameInput.clear();
19+
this.lastNameInput.sendKeys(data.DeviceUsersPage.sampleEditLastName);
20+
}
21+
22+
constructor() {
23+
this.firstNameInput = $('#firstName');
24+
this.lastNameInput = $('#lastName');
25+
this.saveButton = $('#saveButton');
26+
}
27+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import data from '../../data';
2+
import {$, ElementFinder} from 'protractor';
3+
4+
export class AddNewUserModal {
5+
6+
// elements
7+
public firstNameInput: ElementFinder;
8+
public lastNameInput: ElementFinder;
9+
public saveButton: ElementFinder;
10+
public cancelButton: ElementFinder;
11+
12+
// actions
13+
fillFirstNameInput(): void {
14+
this.firstNameInput.sendKeys(data.DeviceUsersPage.sampleFirstName);
15+
16+
}
17+
18+
fillLastNameInput(): void {
19+
this.lastNameInput.sendKeys(data.DeviceUsersPage.sampleLastName);
20+
}
21+
22+
save(): void {
23+
this.saveButton.click();
24+
}
25+
26+
cancel(): void {
27+
this.cancelButton.click();
28+
}
29+
30+
constructor() {
31+
this.firstNameInput = $('#firstName');
32+
this.lastNameInput = $('#lastName');
33+
this.saveButton = $('#saveButton');
34+
this.cancelButton = $('#cancelButton');
35+
}
36+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {$, ElementFinder} from 'protractor';
2+
3+
export class DeleteModal {
4+
public okButton: ElementFinder;
5+
public cancelButton: ElementFinder;
6+
7+
constructor() {
8+
this.okButton = $('#deleteOkButton');
9+
this.cancelButton = $('#deleteCancelButton');
10+
}
11+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export class OtpModal {
2+
3+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import {by, element} from 'protractor';
2+
3+
// returning row with some number like an object.
4+
export function getRowObject(rowNumber: number): RowObject {
5+
const rowObject = new RowObject();
6+
// cells of the row
7+
rowObject.siteID = element(by.xpath(`//*[@id="simple_sites"]/tbody/tr[${rowNumber}]/td[1]`)).getText();
8+
rowObject.firstName = element(by.css(`#tableBody > tr:nth-child(${rowNumber}) > td:nth-child(2) > span:nth-last-child(1)`)).getText();
9+
rowObject.lastName = element(by.css(`#tableBody > tr:nth-child(${rowNumber}) > td:nth-child(3) > span:nth-last-child(1)`)).getText();
10+
rowObject.deviceId = element(by.xpath(`//*[@id="simple_sites"]/tbody/tr[${rowNumber}]/td[4]/div`)).getText();
11+
rowObject.otpCode = element(by.xpath(`//*[@id="simple_sites"]/tbody/tr[${rowNumber}]/td[5]/div`)).getText();
12+
rowObject.retrieveOtpCodeButton = rowNumber < 3 ? element(by
13+
.xpath(`//*[@id="simple_sites"]/tbody/tr[${rowNumber}]/td[5]/button`)) : null;
14+
15+
rowObject.editButton = element(by.xpath(`//*[@id="tableBody"]/tr[${rowNumber}]/td[6]/a`));
16+
rowObject.deleteButton = element(by.xpath(`//*[@id="simple_sites"]/tbody/tr[${rowNumber}]/td[1]`));
17+
return rowObject;
18+
}
19+
20+
export class RowObject {
21+
public siteID;
22+
public firstName;
23+
public lastName;
24+
public deviceId;
25+
public otpCode;
26+
public retrieveOtpCodeButton;
27+
public editButton;
28+
public deleteButton;
29+
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import {$, by, element, ElementFinder} from 'protractor';
22

3-
export class MainPage {
3+
export class Navbar {
44

55
advancedButton: ElementFinder;
66
settingsButton: ElementFinder;
7+
deviceUsersButton: ElementFinder;
78
headerImage: ElementFinder;
9+
signOutDropdown: ElementFinder;
10+
signOutButton: ElementFinder;
811

912
constructor() {
1013
this.advancedButton = element(by.xpath('//*[@id="bs-example-navbar-collapse-1"]/ul/li[3]/a'));
1114
this.settingsButton = $('a[href="/settings"]');
15+
this.deviceUsersButton = $('a[href="/simplesites"]');
1216
this.headerImage = element(by.xpath('//*[@id="header_full_top"]/div/div/div[1]/img'));
17+
this.signOutDropdown = $('#sign-out-dropdown');
18+
this.signOutButton = $('#sign-out');
1319
}
1420
}

eform-client/e2e/Page objects/SettingsPage.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ export class SettingsPage {
2020
public saveButton: ElementFinder;
2121
public headerMainText: ElementFinder;
2222
public headerSecondaryText: ElementFinder;
23-
public signOutDropdown: ElementFinder;
24-
public signOutButton: ElementFinder;
2523
public fileInput: ElementFinder;
2624

2725
// helper functions
@@ -32,12 +30,6 @@ export class SettingsPage {
3230
browser.waitForAngular();
3331
}
3432

35-
public signOut(): void {
36-
this.signOutDropdown.click();
37-
this.signOutButton.click();
38-
browser.waitForAngular();
39-
}
40-
4133
constructor() {
4234
// parts of settings
4335
this.SiteHeader = new SiteHeader();
@@ -50,7 +42,6 @@ export class SettingsPage {
5042
this.saveButton = $('button.btn-ar.btn-danger');
5143
this.headerMainText = element(this.mainTextHeaderMatcher);
5244
this.headerSecondaryText = element(this.secondaryTextHeaderMatcher);
53-
this.signOutDropdown = $('#sign-out-dropdown');
54-
this.signOutButton = $('#sign-out');
45+
5546
}
5647
}

0 commit comments

Comments
 (0)