Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 8 additions & 3 deletions src/data/faker/customer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ const risksRating: string[] = ['None', 'Low', 'Medium', 'High'];
export default class FakerCustomer {
public readonly id: number;

public readonly guestAccount: boolean;

public readonly socialTitle: string;

public readonly firstName: string;

public readonly lastName: string;
public readonly lastName: string | null;

public email: string;

Expand Down Expand Up @@ -57,20 +59,23 @@ export default class FakerCustomer {
/** @type {number} ID of the customer */
this.id = customerToCreate.id || 0;

/** @type {boolean} True to enable guest account */
this.guestAccount = customerToCreate.guestAccount === undefined ? false : customerToCreate.guestAccount;

/** @type {string} Social title of the customer (Mr, Mrs) */
this.socialTitle = customerToCreate.socialTitle || faker.helpers.arrayElement(genders);

/** @type {string} Firstname of the customer */
this.firstName = customerToCreate.firstName || faker.person.firstName();

/** @type {string} Lastname of the customer */
this.lastName = customerToCreate.lastName || faker.person.lastName();
this.lastName = customerToCreate.lastName === undefined ? faker.person.lastName() : customerToCreate.lastName;

/** @type {string} Email for the customer account */
this.email = customerToCreate.email || faker.internet.email(
{
firstName: this.firstName,
lastName: this.lastName,
lastName: this.lastName!,
provider: 'prestashop.com',
},
);
Expand Down
3 changes: 2 additions & 1 deletion src/data/types/customer.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
export type CustomerCreator = {
id?: number
guestAccount?: boolean
socialTitle?: string
firstName?: string
lastName?: string
lastName?: string|null
birthdate?: string
yearOfBirth?: string
monthOfBirth?: string
Expand Down
13 changes: 12 additions & 1 deletion src/interfaces/BO/customers/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,18 @@ import {type Frame, type Page} from '@playwright/test';
export interface BOCustomersCreatePageInterface extends BOBasePagePageInterface {
readonly pageTitleCreate: string;
readonly pageTitleEdit: string;
readonly requiredFieldErrorMessage: string;

createEditB2BCustomer(page: Page, customerData: FakerCustomer): Promise<string>;
createEditCustomer(page: Frame|Page, customerData: FakerCustomer, waitForNavigation?: boolean): Promise<string>
createEditCustomer(page: Frame | Page, customerData: FakerCustomer, waitForNavigation?: boolean): Promise<string>;
getRequiredInputErrorMessage(page: Frame | Page, input:string): Promise<string>;
enableGuestAccount(page: Frame | Page, guestAccount: boolean): Promise<void>;
isDefaultCustomerGroupDisabled(page: Frame | Page): Promise<boolean>;
isDefaultCustomerGroupEnabled(page: Frame | Page): Promise<boolean>;
isCustomerDisabled(page: Frame | Page): Promise<boolean>;
isCustomerEnabled(page: Frame | Page): Promise<boolean>;
isGroupAccessDisabled(page: Frame | Page): Promise<boolean>;
isGroupAccessEnabled(page: Frame | Page): Promise<boolean>;
isPasswordDisabled(page: Frame | Page): Promise<boolean>;
isPasswordEnabled(page: Frame | Page): Promise<boolean>;
}
1 change: 1 addition & 0 deletions src/interfaces/BO/orders/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export interface BOOrdersCreatePageInterface extends BOBasePagePageInterface {
getDeliveryOptions(page: Page): Promise<string>;
getEditAddressIframe(page: Page): Frame | null;
getInvoiceAddressDetails(page: Page): Promise<string>;
getNewCustomerIframe(page: Page): Frame | null;
getNoCustomerFoundError(page: Page): Promise<string>;
getOrderIframe(page: Page, orderID: number): Frame | null;
getOrdersNumber(page: Page): Promise<number>;
Expand Down
128 changes: 123 additions & 5 deletions src/versions/develop/pages/BO/customers/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ class BOCustomersCreatePage extends BOBasePage implements BOCustomersCreatePageI

public readonly updateSuccessfullMessage: string;

public readonly requiredFieldErrorMessage: string;

private readonly socialTitleInput: (id: number) => string;

private readonly guestAccountToggleInput: (toggle: number) => string;

private readonly firstNameInput: string;

private readonly lastNameInput: string;
Expand Down Expand Up @@ -65,8 +69,10 @@ class BOCustomersCreatePage extends BOBasePage implements BOCustomersCreatePageI
this.pageTitleCreate = `New customer • ${global.INSTALL.SHOP_NAME}`;
this.pageTitleEdit = 'Editing customer';
this.updateSuccessfullMessage = 'Update successful';
this.requiredFieldErrorMessage = 'Veuillez renseigner ce champ.';

// Selectors
this.guestAccountToggleInput = (toggle: number) => `#customer_is_guest_${toggle}`;
this.socialTitleInput = (id: number) => `#customer_gender_id_${id}`;
this.firstNameInput = '#customer_first_name';
this.lastNameInput = '#customer_last_name';
Expand Down Expand Up @@ -96,19 +102,131 @@ class BOCustomersCreatePage extends BOBasePage implements BOCustomersCreatePageI
Methods
*/

/**
* Enable guest account
* @param page {Frame|Page} Browser tab
* @param guestAccount {boolean} True to enable guest account
* @return {Promise<void>}
*/
async enableGuestAccount(page: Frame | Page, guestAccount: boolean): Promise<void> {
await page.locator(this.guestAccountToggleInput(guestAccount ? 1 : 0)).click();
}

/**
* Get if password is enabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isPasswordEnabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.passwordInput}:not(:disabled)`, 2000);
}

/**
* Get if password is disabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isPasswordDisabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.passwordInput}[disabled]`, 2000);
}

/**
* Get if customer is enabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isCustomerEnabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.statusToggleInput(0)}:not(:disabled)`, 2000);
}

/**
* Get if customer is disabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isCustomerDisabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.statusToggleInput(0)}[disabled]`, 2000);
}

/**
* Get if group access is enabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isGroupAccessEnabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.customerCheckbox}:not(:disabled)`, 2000);
}

/**
* Get if group access is disabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isGroupAccessDisabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.customerCheckbox}[disabled]`, 2000);
}

/**
* get if default customer group is enabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isDefaultCustomerGroupEnabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.defaultCustomerGroupSelect}:not(:disabled)`, 2000);
}

/**
* Get if default customer group is disabled
* @param page {Frame|Page} Browser tab
* @return {Promise<boolean>}
*/
async isDefaultCustomerGroupDisabled(page: Frame | Page): Promise<boolean> {
return this.elementVisible(page, `${this.defaultCustomerGroupSelect}[disabled]`, 2000);
}

/**
* Get required input error message
* @param page {Frame|Page} Browser tab
* @param input {string} The input to get error message from
* @return {Promise<string>}
*/
async getRequiredInputErrorMessage(page: Frame | Page, input: string): Promise<string> {
let selector: string = this.firstNameInput;

switch (input) {
case 'lastName':
selector = this.lastNameInput;
break;
case 'email':
selector = this.emailInput;
break;
case 'password':
selector = this.passwordInput;
break;
default:
// Do nothing
}

const validationMessage = await page.locator(selector).evaluate(
(element: HTMLInputElement) => element.validationMessage,
);

return validationMessage;
}

/**
* Fill form for add/edit customer
* @param page {Frame|Page} Browser tab
* @param customerData {FakerCustomer} Data to set on new customer form
* @return {Promise<void>}
*/
async fillCustomerForm(page: Frame|Page, customerData: FakerCustomer): Promise<void> {
async fillCustomerForm(page: Frame | Page, customerData: FakerCustomer): Promise<void> {
// Click on label for social input
await this.setHiddenCheckboxValue(page, this.socialTitleInput(customerData.socialTitle === 'Mr.' ? 0 : 1));

// Fill form
await this.setValue(page, this.firstNameInput, customerData.firstName);
await this.setValue(page, this.lastNameInput, customerData.lastName);
await this.setValue(page, this.lastNameInput, customerData.lastName!);
await this.setValue(page, this.emailInput, customerData.email);
await this.setValue(page, this.passwordInput, customerData.password);
await this.selectByVisibleText(page, this.yearOfBirthSelect, customerData.yearOfBirth);
Expand All @@ -132,7 +250,7 @@ class BOCustomersCreatePage extends BOBasePage implements BOCustomersCreatePageI

// Fill form
await this.setValue(page, this.firstNameInput, customerData.firstName);
await this.setValue(page, this.lastNameInput, customerData.lastName);
await this.setValue(page, this.lastNameInput, customerData.lastName!);
await this.setValue(page, this.emailInput, customerData.email);
await this.setValue(page, this.passwordInput, customerData.password);
await this.selectByVisibleText(page, this.yearOfBirthSelect, customerData.yearOfBirth);
Expand All @@ -154,7 +272,7 @@ class BOCustomersCreatePage extends BOBasePage implements BOCustomersCreatePageI
* @param waitForNavigation {boolean} True if we need save and waitForNavigation, false if not
* @return {Promise<string>}
*/
async createEditCustomer(page: Frame|Page, customerData: FakerCustomer, waitForNavigation: boolean = true): Promise<string> {
async createEditCustomer(page: Frame | Page, customerData: FakerCustomer, waitForNavigation: boolean = true): Promise<string> {
// Fill form
await this.fillCustomerForm(page, customerData);

Expand Down Expand Up @@ -188,7 +306,7 @@ class BOCustomersCreatePage extends BOBasePage implements BOCustomersCreatePageI
* @param customerGroup {string} Value to set on customer group input
* @return {Promise<void>}
*/
async setCustomerGroupAccess(page: Frame|Page, customerGroup: string): Promise<void> {
async setCustomerGroupAccess(page: Frame | Page, customerGroup: string): Promise<void> {
switch (customerGroup) {
case 'Customer':
await this.setCheckedWithIcon(page, this.visitorCheckbox, false);
Expand Down
15 changes: 13 additions & 2 deletions src/versions/develop/pages/BO/orders/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -417,15 +417,26 @@ class BOOrderCreatePage extends BOBasePage implements BOOrdersCreatePageInterfac
return this.elementVisible(page, this.iframe, 5000);
}

/**
* Get new customer frame
* @param page {Page} Browser tab
* @return {*}
*/
getNewCustomerIframe(page: Page): Frame | null {
return page.frame({url: /sell\/customers\/new/gmi});
}

/**
* Click on add new customer and new customer iFrame
* @param page {Page} Browser tab
* @param customerData {FakerCustomer} Customer data fake object
* @returns {Promise<string>}
*/
async addNewCustomer(page: Page, customerData: FakerCustomer): Promise<string> {
await page.locator(this.addCustomerLink).click();
await this.waitForVisibleSelector(page, this.iframe);
if (await this.elementNotVisible(page, this.iframe)) {
await page.locator(this.addCustomerLink).click();
await this.waitForVisibleSelector(page, this.iframe);
}

const customerFrame = page.frame({url: /sell\/customers\/new/gmi});

Expand Down
2 changes: 1 addition & 1 deletion src/versions/develop/pages/FO/classic/checkout/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ class CheckoutPage extends FOBasePage implements FoCheckoutPageInterface {
await this.setChecked(page, this.checkoutGuestGenderInput(customerData.socialTitle === 'Mr.' ? 1 : 2));

await this.setValue(page, this.checkoutGuestFirstnameInput, customerData.firstName);
await this.setValue(page, this.checkoutGuestLastnameInput, customerData.lastName);
await this.setValue(page, this.checkoutGuestLastnameInput, customerData.lastName!);
await this.setValue(page, this.checkoutGuestEmailInput, customerData.email);
if (this.theme === 'hummingbird') {
await this.setChecked(page, this.createAccountCheckbox, true);
Expand Down
2 changes: 1 addition & 1 deletion src/versions/develop/pages/FO/classic/myAccount/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ class FoCreateAccountPage extends FOBasePage implements FoCreateAccountPageInter
async createAccount(page: Page, customer: FakerCustomer): Promise<void> {
await this.waitForSelectorAndClick(page, this.genderRadioButton(customer.socialTitle === 'Mr.' ? 1 : 2));
await this.setValue(page, this.firstNameInput, customer.firstName);
await this.setValue(page, this.lastNameInput, customer.lastName);
await this.setValue(page, this.lastNameInput, customer.lastName!);
await this.setValue(page, this.newEmailInput, customer.email);
await this.setValue(page, this.newPasswordInput, customer.password);

Expand Down
Loading