diff --git a/src/index.ts b/src/index.ts index 7ba4c167..44881a01 100644 --- a/src/index.ts +++ b/src/index.ts @@ -238,6 +238,7 @@ export {default as boMaintenancePage} from '@pages/BO/shopParameters/general/mai export {default as boMarketplacePage} from '@pages/BO/modules/marketplace'; export {default as boInstalledModulesPage} from '@pages/BO/modules/modulesAndServices/installedModules'; export {default as boMerchandiseReturnsPage} from '@pages/BO/customerService/merchandiseReturns'; +export {default as boMerchandiseReturnsEditPage} from '@pages/BO/customerService/merchandiseReturns/edit'; export {default as boModuleCatalogPage} from '@pages/BO/modules/moduleCatalog'; export {default as boModuleManagerAlertsPage} from '@pages/BO/modules/moduleManager/alerts'; export {default as boModuleManagerPage} from '@pages/BO/modules/moduleManager'; diff --git a/src/interfaces/BO/customerService/merchandiseReturns/edit.ts b/src/interfaces/BO/customerService/merchandiseReturns/edit.ts new file mode 100644 index 00000000..ca871b00 --- /dev/null +++ b/src/interfaces/BO/customerService/merchandiseReturns/edit.ts @@ -0,0 +1,13 @@ +import {BOBasePagePageInterface} from '@interfaces/BO'; +import {type Page} from '@playwright/test'; + +export interface BOMerchandiseReturnsEditPageInterface extends BOBasePagePageInterface { + readonly pageTitle: string; + + clickOnCancelButton(page: Page): Promise; + clickOnDeleteLastProductButton(page: Page, row?: number): Promise; + deleteProduct(page: Page, row?: number): Promise; + downloadPDF(page: Page): Promise; + getFileName(page: Page): Promise; + setStatus(page: Page, status: string, saveAndStay?: boolean): Promise; +} diff --git a/src/pages/BO/customerService/merchandiseReturns/edit.ts b/src/pages/BO/customerService/merchandiseReturns/edit.ts new file mode 100644 index 00000000..2c9bdc74 --- /dev/null +++ b/src/pages/BO/customerService/merchandiseReturns/edit.ts @@ -0,0 +1,9 @@ +import {type BOMerchandiseReturnsEditPageInterface} from '@interfaces/BO/customerService/merchandiseReturns/edit'; + +/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */ +function requirePage(): BOMerchandiseReturnsEditPageInterface { + return require('@versions/develop/pages/BO/customerService/merchandiseReturns/edit'); +} +/* eslint-enable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */ + +export default requirePage(); diff --git a/src/versions/develop/pages/BO/customerService/merchandiseReturns/edit.ts b/src/versions/develop/pages/BO/customerService/merchandiseReturns/edit.ts new file mode 100644 index 00000000..d8deec94 --- /dev/null +++ b/src/versions/develop/pages/BO/customerService/merchandiseReturns/edit.ts @@ -0,0 +1,126 @@ +import {type BOMerchandiseReturnsEditPageInterface} from '@interfaces/BO/customerService/merchandiseReturns/edit'; +import BOBasePage from '@pages/BO/BOBasePage'; +import {type Page} from '@playwright/test'; + +/** + * Edit merchandise returns page, contains selectors and functions for the page + * @class + * @extends BOBasePage + */ +class BOMerchandiseReturnsEditPage extends BOBasePage implements BOMerchandiseReturnsEditPageInterface { + public readonly pageTitle: string; + + private readonly status: string; + + private readonly productsTableRow: (row: number) => string; + + private readonly productsTableDeleteColumn: (row: number) => string; + + private readonly continueButton: string; + + private readonly cancelButton: string; + + private readonly orderReturnSaveButton: string; + + private readonly orderReturnCancelButton: string; + + private readonly saveAndStayButton: string; + + private readonly fileName: string; + + /** + * @constructs + * Setting up titles and selectors to use on edit merchandise return page + */ + constructor() { + super(); + + this.pageTitle = 'Merchandise Returns > Edit •'; + + // Selectors + this.status = '#state'; + this.productsTableRow = (row: number) => `table tbody tr:nth-child(${row})`; + this.productsTableDeleteColumn = (row: number) => `${this.productsTableRow(row)} td a.btn-default`; + this.orderReturnSaveButton = '#order_return_form_submit_btn'; + this.orderReturnCancelButton = '#order_return_form_cancel_btn'; + this.saveAndStayButton = 'button[name=submitAddorder_returnAndStay]'; + this.fileName = '#fieldset_0 div.form-wrapper div:nth-child(8) div p:nth-child(1)'; + // Selectors in security page + this.continueButton = 'body div.container div.action-container a.btn-continue'; + this.cancelButton = 'body div.container div.action-container a.btn-cancel'; + } + + /* + Methods + */ + /** + * Set merchandise return status + * @param page {Page} Browser tab + * @param status {string} Status to select + * @param saveAndStay {boolean} True if we need to click on save and stay button + * @returns {Promise} + */ + async setStatus(page: Page, status: string, saveAndStay: boolean = false): Promise { + await this.selectByVisibleText(page, this.status, status); + if (saveAndStay) { + await this.clickAndWaitForURL(page, this.saveAndStayButton); + } else { + await this.clickAndWaitForURL(page, this.orderReturnSaveButton); + } + return this.getAlertSuccessBlockContent(page); + } + + /** + * Get file name + * @param page {Page} Browser tab + * @returns {Promise} + */ + async getFileName(page: Page): Promise { + return this.getTextContent(page, this.fileName); + } + + /** + * Download PDF + * @param page {Page} Browser tab + * @returns {Promise} + */ + async downloadPDF(page: Page): Promise { + return this.clickAndWaitForDownload(page, `${this.fileName} a`); + } + + /** + * Click on cancel button + * @param page {Page} Browser tab + * @returns {Promise} + */ + async clickOnCancelButton(page: Page): Promise { + await this.waitForSelectorAndClick(page, this.orderReturnCancelButton); + await this.clickAndWaitForURL(page, this.orderReturnCancelButton); + } + + /** + * Click on delete last product button + * @param page {Page} Browser tab + * @param row {number} Row in products table + * @returns {Promise} + */ + async clickOnDeleteLastProductButton(page: Page, row: number = 1): Promise { + await this.clickAndWaitForURL(page, this.productsTableDeleteColumn(row)); + + return this.getTextContent(page, this.alertBlock); + } + + /** + * Delete product + * @param page {Page} Browser tab + * @param row {number} Row in products table + * @returns {Promise} + */ + async deleteProduct(page: Page, row: number = 1): Promise { + await this.clickAndWaitForURL(page, this.productsTableDeleteColumn(row)); + + return this.getTextContent(page, this.alertBlock); + } +} + +module.exports = new BOMerchandiseReturnsEditPage();