diff --git a/src/index.ts b/src/index.ts index 834afad4..1b252f0b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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'; @@ -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'; diff --git a/src/interfaces/FO/myAccount/addresses.ts b/src/interfaces/FO/myAccount/addresses.ts new file mode 100644 index 00000000..3bfa2620 --- /dev/null +++ b/src/interfaces/FO/myAccount/addresses.ts @@ -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; + getAddressPosition(page: Page, alias: string): Promise; + goToEditAddressPage(page: Page, position?: string | number): Promise; + openNewAddressForm(page: Page): Promise; +} diff --git a/src/pages/FO/classic/myAccount/addresses.ts b/src/pages/FO/classic/myAccount/addresses.ts new file mode 100644 index 00000000..7d7353a3 --- /dev/null +++ b/src/pages/FO/classic/myAccount/addresses.ts @@ -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(); diff --git a/src/pages/FO/hummingbird/myAccount/addresses.ts b/src/pages/FO/hummingbird/myAccount/addresses.ts new file mode 100644 index 00000000..0df041a4 --- /dev/null +++ b/src/pages/FO/hummingbird/myAccount/addresses.ts @@ -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(); diff --git a/src/versions/develop/pages/FO/classic/myAccount/addresses.ts b/src/versions/develop/pages/FO/classic/myAccount/addresses.ts new file mode 100644 index 00000000..7eca1b89 --- /dev/null +++ b/src/versions/develop/pages/FO/classic/myAccount/addresses.ts @@ -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} + * @constructor + */ + async openNewAddressForm(page: Page): Promise { + 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} + */ + async getAddressPosition(page: Page, alias: string): Promise { + 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} + */ + async goToEditAddressPage(page: Page, position: string | number = 'last'): Promise { + 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} + */ + async deleteAddress(page: Page, position: string | number = 'last'): Promise { + 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}; diff --git a/src/versions/develop/pages/FO/hummingbird/myAccount/addresses.ts b/src/versions/develop/pages/FO/hummingbird/myAccount/addresses.ts new file mode 100644 index 00000000..c046beca --- /dev/null +++ b/src/versions/develop/pages/FO/hummingbird/myAccount/addresses.ts @@ -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();