Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add user test #5

Open
wants to merge 25 commits into
base: 5.5
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions src/test/functional/data.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
export const normalUserTestData = {
password: "QAtpx123#",
userName: "Normal User"
};

export const adminUserTestData = {
password: "QAtpx123#",
userName: "Admin User"
};
export const normalUserTestData = {
password: 'QAtpx123#',
userName: 'Normal User',
};

export const adminUserTestData = {
password: 'QAtpx123#',
userName: 'Admin User',
};

export const adminUserTestDataNOTlocalhost = {
userName: 'Admin',
password: 'admin123',
};

export const newEmployeeData = {
firstname: 'FirstName',
middleName: 'MiddleName',
lastName: 'lastName',
password: 'Password123',
};
6 changes: 6 additions & 0 deletions src/test/functional/locators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export const loginPageLocator = {
nameInput: '[name="username"]',
passwordInput: '[name="password"]',
loginButton: '[type="submit"]',
userNameAfterLogin: '.oxd-userdropdown-name',
};
11 changes: 4 additions & 7 deletions src/test/functional/pages/BasePage.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Page, Browser, chromium, Locator } from "@playwright/test";
import { Browser, chromium, Page } from '@playwright/test';

import config from "../../playwright.config";
import config from '../../playwright.config';

export class BasePage {
private browser: Browser | null = null;
Expand All @@ -25,10 +25,7 @@ export class BasePage {
await this.page.waitForURL(config.baseUrl);
}

async navigateToSubPage(locator: Locator): Promise<void> {
if (typeof locator === "string") {
locator = this.page.locator(locator);
}
await locator.click();
public async navigateToSubPage(pageName: string): Promise<void> {
await this.page.getByRole('link', { name: pageName }).click();
}
}
72 changes: 72 additions & 0 deletions src/test/functional/pages/PersonalDetailsPage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { expect } from '@playwright/test';
import { Locator, Page } from 'playwright';

const randomNumber = (Math.random() * 1000).toString().substring(0, 4);

const nationality = 'Algerian',
nickname = 'NicknameTest',
maritalStatus = 'Married',
gender = 'Female',
smoker = 'Yes',
bloodType = 'A+';

export class PersonalDetailsPage {
readonly page: Page;
readonly pageHeader: Locator;
readonly selectDropdown: Locator;

constructor(page: Page) {
this.page = page;
this.pageHeader = page.getByRole('heading', { name: 'Personal Details' });
this.selectDropdown = page.getByText('-- Select --');
}

public async personalDetailsPageIsOpened(): Promise<void> {
await expect(this.pageHeader).toBeVisible();
}

public async fillPersonalDetails(): Promise<void> {
await this.fillTextboxField('Nickname', 3, nickname);
await this.fillTextboxField('Other Id', 1, randomNumber);
await this.fillTextboxField("Driver's License Number", 2, randomNumber);
await this.fillDatePicker('License Expiry Date', '2020-02-02');
// await this.fillTextboxField('SSN Number', 1, '1234'); //ToFix later
// await this.fillTextboxField('SIN Number', 1, '1224'); //ToFix later
await this.fillDatePicker('Date of Birth', '2000-01-01');
await this.selectDropdown.nth(1).click();
await this.chooseOptionFromDropdown(maritalStatus);
await this.clickCheckbox(gender, 'span');
await this.selectDropdown.first().click();
await this.chooseOptionFromDropdown(nationality);
await this.clickCheckbox(smoker, 'i');
await this.selectDropdown.nth(2).click();
await this.chooseOptionFromDropdown(bloodType);
}

public async fillDatePicker(text: string, date: string): Promise<void> {
await this.page
.locator('form div')
.filter({
hasText: text,
})
.getByPlaceholder('yyyy-mm-dd')
.fill(date);
}

public async fillTextboxField(label: string, nth: number, text: string): Promise<void> {
await this.page
.locator('form div')
.filter({ hasText: label })
.getByRole('textbox')
.nth(nth)
.fill(text);
}

public async chooseOptionFromDropdown(option: string): Promise<void> {
await this.page.getByRole('option', { name: option }).click();
}

public async clickCheckbox(label: string, locator: string): Promise<void> {
await this.page.locator('label').filter({ hasText: label }).locator(locator).click();
}
}
63 changes: 62 additions & 1 deletion src/test/functional/pages/PimPage.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,67 @@
import { BasePage } from "./BasePage";
import { Locator, Page } from 'playwright';

import { newEmployeeData } from '../data';

import { BasePage } from './BasePage';
import { PersonalDetailsPage } from './PersonalDetailsPage';

const randomNumber = (Math.random() * 1000).toString().substring(0, 3);
export class PimPage extends BasePage {
readonly page: Page;
readonly pimPageButton: Locator;
readonly addButton: Locator;
readonly nameInput: Locator;
readonly middleNameInput: Locator;
readonly lastNameInput: Locator;
readonly employeeId: Locator;
readonly createLoginDetailsCheckbox: Locator;
readonly username: Locator;
readonly password: Locator;
readonly passwordConfirmed: Locator;
readonly saveButton: Locator;
readonly cancelButton: Locator;
readonly personalDetailsPage: Page;

constructor(page: Page) {
super(page);
this.page = page;
this.pimPageButton = page.getByRole('link', { name: 'PIM' });
this.addButton = page.getByRole('button', { name: 'Add' });
this.nameInput = page.getByPlaceholder('First Name');
this.middleNameInput = page.getByPlaceholder('Middle Name');
this.lastNameInput = page.getByPlaceholder('Last Name');
this.employeeId = page.locator('form').getByRole('textbox').nth(4);
this.createLoginDetailsCheckbox = page
.locator('div')
.filter({ hasText: /^Create Login Details$/ })
.locator('span');
this.username = page.locator(
'div:nth-child(4) > .oxd-grid-2 > div > .oxd-input-group > div:nth-child(2) > .oxd-input',
);
this.password = page.locator('input[type="password"]').first();
this.passwordConfirmed = page.locator('input[type="password"]').nth(1);
this.saveButton = page.getByRole('button', { name: 'Save' });
this.cancelButton = page.getByRole('button', { name: 'Cancel' });
}

public async addEmployeeWithLoginCredentails(): Promise<void> {
await this.addButton.click();
await this.nameInput.fill(newEmployeeData.firstname + ' ' + randomNumber);
await this.middleNameInput.fill(newEmployeeData.middleName);
await this.lastNameInput.fill(newEmployeeData.lastName);
await this.employeeId.fill('' + randomNumber);
await this.createLoginDetailsCheckbox.click();
await this.username.fill(newEmployeeData.firstname + ' ' + randomNumber);
await this.password.fill(newEmployeeData.password);
await this.passwordConfirmed.fill(newEmployeeData.password);
await this.saveButton.click();
}

public async fillNewEmployeePersonalDetails(): Promise<void> {
const personalDetailsPage = new PersonalDetailsPage(this.page);
await personalDetailsPage.personalDetailsPageIsOpened();
await personalDetailsPage.fillPersonalDetails();
await this.saveButton.click();
await this.page.getByText('Success').isVisible();
}
}
34 changes: 34 additions & 0 deletions src/test/functional/tests/addUser.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { expect, test } from '@playwright/test';

import { adminUserTestData } from '../data';
import { LoginPage } from '../pages/LoginPage';
import { PimPage } from '../pages/PimPage';

let loginPage: LoginPage, pimPage: PimPage;

test.describe('Adding a new employee', () => {
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.initialize();
// await page.goto('https://opensource-demo.orangehrmlive.com/web/index.php/auth/login');
await loginPage.loginUser(adminUserTestData.userName, adminUserTestData.password);
// await loginPage.loginUser(
// adminUserTestDataNOTlocalhost.userName,
// adminUserTestDataNOTlocalhost.password,
// );
await loginPage.navigateToSubPage('PIM');
await expect(page.getByRole('heading', { name: 'Employee Information' })).toBeVisible();
});

test.afterEach(async () => {
await loginPage.close();
});

test('Add new employee user with account & fill new employee personal details', async ({
page,
}) => {
pimPage = new PimPage(page);
await pimPage.addEmployeeWithLoginCredentails();
await pimPage.fillNewEmployeePersonalDetails();
});
});
56 changes: 27 additions & 29 deletions src/test/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.