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

Migrate @pages/FO/{classic|hummingbird}/myAccount/addresses from Core #421

Merged
merged 1 commit into from
Feb 19, 2025
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
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ export {default as foClassicModalBlockCartPage} from '@pages/FO/classic/modal/bl
export {default as foClassicModalQuickViewPage} from '@pages/FO/classic/modal/quickView';
export {default as foClassicModalWishlistPage} from '@pages/FO/classic/modal/wishlist';
export {default as foClassicMyAccountPage} from '@pages/FO/classic/myAccount';
export {default as foClassicMyAddressesPage} from '@pages/FO/classic/myAccount/addresses';
export {default as foClassicMyMerchandiseReturnsPage} from '@pages/FO/classic/myAccount/merchandiseReturns';
export {default as foClassicMyOrderDetailsPage} from '@pages/FO/classic/myAccount/orderDetails';
export {default as foClassicMyOrderHistoryPage} from '@pages/FO/classic/myAccount/orderHistory';
Expand All @@ -363,6 +364,7 @@ export {default as foHummingbirdLoginPage} from '@pages/FO/hummingbird/login';
export {default as foHummingbirdModalBlockCartPage} from '@pages/FO/hummingbird/modal/blockCart';
export {default as foHummingbirdModalQuickViewPage} from '@pages/FO/hummingbird/modal/quickView';
export {default as foHummingbirdMyAccountPage} from '@pages/FO/hummingbird/myAccount';
export {default as foHummingbirdMyAddressesPage} from '@pages/FO/hummingbird/myAccount/addresses';
export {default as foHummingbirdMyMerchandiseReturnsPage} from '@pages/FO/hummingbird/myAccount/merchandiseReturns';
export {default as foHummingbirdMyOrderDetailsPage} from '@pages/FO/hummingbird/myAccount/orderDetails';
export {default as foHummingbirdMyOrderHistoryPage} from '@pages/FO/hummingbird/myAccount/orderHistory';
Expand Down
16 changes: 16 additions & 0 deletions src/interfaces/FO/myAccount/addresses.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {FOBasePagePageInterface} from '@interfaces/FO';
import {type Page} from '@playwright/test';

export interface FoMyAddressesPageInterface extends FOBasePagePageInterface {
readonly addAddressSuccessfulMessage: string;
readonly addressPageTitle: string;
readonly deleteAddressErrorMessage: string;
readonly deleteAddressSuccessfulMessage: string;
readonly pageTitle: string;
readonly updateAddressSuccessfulMessage: string;

deleteAddress(page: Page, position?: string | number): Promise<string>;
getAddressPosition(page: Page, alias: string): Promise<number>;
goToEditAddressPage(page: Page, position?: string | number): Promise<void>;
openNewAddressForm(page: Page): Promise<void>;
}
9 changes: 9 additions & 0 deletions src/pages/FO/classic/myAccount/addresses.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import {type FoMyAddressesPageInterface} from '@interfaces/FO/myAccount/addresses';

/* eslint-disable global-require, @typescript-eslint/no-require-imports */
function requirePage(): FoMyAddressesPageInterface {
return require('@versions/develop/pages/FO/classic/myAccount/addresses').foMyAddressesPage;
}
/* eslint-enable global-require, @typescript-eslint/no-require-imports */

export default requirePage();
9 changes: 9 additions & 0 deletions src/pages/FO/hummingbird/myAccount/addresses.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import {type FoMyAddressesPageInterface} from '@interfaces/FO/myAccount/addresses';

/* eslint-disable global-require, @typescript-eslint/no-require-imports */
function requirePage(): FoMyAddressesPageInterface {
return require('@versions/develop/pages/FO/hummingbird/myAccount/addresses');
}
/* eslint-enable global-require, @typescript-eslint/no-require-imports */

export default requirePage();
121 changes: 121 additions & 0 deletions src/versions/develop/pages/FO/classic/myAccount/addresses.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import {type FoMyAddressesPageInterface} from '@interfaces/FO/myAccount/addresses';
import FOBasePage from '@pages/FO/FOBasePage';
import {type Page} from '@playwright/test';

/**
* Addresses page, contains functions that can be used on the page
* @class
* @extends FOBasePage
*/
class FoMyAddressesPage extends FOBasePage implements FoMyAddressesPageInterface {
public readonly pageTitle: string;

public readonly addressPageTitle: string;

public readonly addAddressSuccessfulMessage: string;

public readonly updateAddressSuccessfulMessage: string;

public readonly deleteAddressSuccessfulMessage: string;

public readonly deleteAddressErrorMessage: string;

private readonly addressBlock: string;

protected addressBodyTitle: string;

protected createNewAddressLink: string;

private readonly editAddressLink: string;

private readonly deleteAddressLink: string;

/**
* @constructs
* Setting up texts and selectors to use on addresses page
*/
constructor(theme: string = 'classic') {
super(theme);

this.pageTitle = 'Addresses';
this.addressPageTitle = 'Address';
this.addAddressSuccessfulMessage = 'Address successfully added.';
this.updateAddressSuccessfulMessage = 'Address successfully updated.';
this.deleteAddressSuccessfulMessage = 'Address successfully deleted.';
this.deleteAddressErrorMessage = 'Could not delete the address since it is used in the shopping cart.';

// Selectors
this.addressBlock = 'article.address';
this.addressBodyTitle = `${this.addressBlock} .address-body h4`;
this.createNewAddressLink = '#content div.addresses-footer a[data-link-action=\'add-address\']';
this.editAddressLink = 'a[data-link-action=\'edit-address\']';
this.deleteAddressLink = 'a[data-link-action=\'delete-address\']';
}

/*
Methods
*/
/**
* Open create new address form
* @param page {Page} Browser tab
* @returns {Promise<void>}
* @constructor
*/
async openNewAddressForm(page: Page): Promise<void> {
if (await this.elementVisible(page, this.createNewAddressLink, 2000)) {
await this.clickAndWaitForURL(page, this.createNewAddressLink);
}
}

/**
* Get address position from its alias
* @param page {Page} Browser tab
* @param alias {string} Alias of the address
* @return {Promise<number>}
*/
async getAddressPosition(page: Page, alias: string): Promise<number> {
const titles = await page.locator(this.addressBodyTitle).allTextContents();

return titles.indexOf(alias) + 1;
}

/**
* Go to edit address page in FO
* @param page {Page} Browser tab
* @param position {string} String of the position
* @returns {Promise<void>}
*/
async goToEditAddressPage(page: Page, position: string | number = 'last'): Promise<void> {
const editButtonsLocators = page.locator(this.editAddressLink);
const positionEditButtons: number = typeof position === 'string'
? ((await editButtonsLocators.count()) - 1) : (position - 1);
const currentUrl: string = page.url();

await Promise.all([
page.waitForURL((url: URL): boolean => url.toString() !== currentUrl, {waitUntil: 'networkidle'}),
editButtonsLocators.nth(positionEditButtons).click(),
]);
}

/**
* Delete address in FO
* @param page {Page} Browser tab
* @param position {string} String of the position
* @returns {Promise<string>}
*/
async deleteAddress(page: Page, position: string | number = 'last'): Promise<string> {
const deleteButtonsLocator = page.locator(this.deleteAddressLink);
const positionDeleteButtons: number = typeof position === 'string'
? ((await deleteButtonsLocator.count()) - 1) : (position - 1);

await Promise.all([
page.waitForLoadState(),
deleteButtonsLocator.nth(positionDeleteButtons).click(),
]);

return this.getTextContent(page, this.notificationsBlock);
}
}

const foMyAddressesPage = new FoMyAddressesPage();
export {foMyAddressesPage, FoMyAddressesPage};
24 changes: 24 additions & 0 deletions src/versions/develop/pages/FO/hummingbird/myAccount/addresses.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {type FoMyAddressesPageInterface} from '@interfaces/FO/myAccount/addresses';
import {
FoMyAddressesPage as FoMyAddressesPageClassic,
} from '@versions/develop/pages/FO/classic/myAccount/addresses';

/**
* Create account page, contains functions that can be used on the page
* @class
* @extends FoMyAddressesPageClassic
*/
class FoMyAddressesPage extends FoMyAddressesPageClassic implements FoMyAddressesPageInterface {
/**
* @constructs
* Setting up texts and selectors to use on create account page
*/
constructor() {
super('hummingbird');

this.createNewAddressLink = '#content a.addresses__new-address';
this.addressBodyTitle = 'article.address .card-body p';
}
}

module.exports = new FoMyAddressesPage();