diff --git a/package.json b/package.json index 46ee36fe..f8ee50ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@prestashop-core/ui-testing", - "version": "0.0.8", + "version": "0.0.9", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/index.ts b/src/index.ts index dee94db5..380b4138 100644 --- a/src/index.ts +++ b/src/index.ts @@ -55,6 +55,7 @@ export {default as boLoginPage} from '@pages/BO/login'; export {default as boDashboardPage} from '@pages/BO/dashboard'; export {default as boOrdersPage} from '@pages/BO/orders'; export {default as boModuleManagerPage} from '@pages/BO/modules/moduleManager'; +export {default as boModuleManagerUninstalledModulesPage} from '@pages/BO/modules/moduleManager/uninstalledModules'; // Export Pages FO export * as FOBasePage from '@pages/FO/FOBasePage'; // Export Pages FO/Classic diff --git a/src/interfaces/BO/modules/moduleManager/uninstalledModules.ts b/src/interfaces/BO/modules/moduleManager/uninstalledModules.ts new file mode 100644 index 00000000..0a174566 --- /dev/null +++ b/src/interfaces/BO/modules/moduleManager/uninstalledModules.ts @@ -0,0 +1,9 @@ +import {BOBasePagePageInterface} from '@interfaces/BO'; +import type {Page} from '@playwright/test'; + +export interface ModuleManagerUninstalledModulesPageInterface extends BOBasePagePageInterface { + readonly installMessageSuccessful: (moduleTag: string) => string; + + goToTabUninstalledModules(page: Page): Promise; + installModule(page: Page, moduleTag: string): Promise; +} diff --git a/src/pages/BO/BOBasePage.ts b/src/pages/BO/BOBasePage.ts index 2720629c..04784ad1 100644 --- a/src/pages/BO/BOBasePage.ts +++ b/src/pages/BO/BOBasePage.ts @@ -2,7 +2,9 @@ import CommonPage from '@pages/commonPage'; import {Frame, Page} from '@playwright/test'; +import testContext from '@utils/testContext'; import type {PageFunction} from 'playwright-core/types/structs'; +import semver from 'semver'; /** * BO parent page, contains functions that can be used on all BO page @@ -715,10 +717,18 @@ export default class BOBasePage extends CommonPage { await this.clickSubMenu(page, parentSelector); await this.scrollTo(page, linkSelector); await this.clickAndWaitForURL(page, linkSelector); + + const psVersion = testContext.getPSVersion(); + let linkActiveClass: string = '-active'; + + if (semver.gte(psVersion, '8.0.0')) { + linkActiveClass = 'link-active'; + } + if (await this.isSidebarCollapsed(page)) { - await this.waitForHiddenSelector(page, `${linkSelector}.link-active`); + await this.waitForHiddenSelector(page, `${linkSelector}.${linkActiveClass}`); } else { - await this.waitForVisibleSelector(page, `${linkSelector}.link-active`); + await this.waitForVisibleSelector(page, `${linkSelector}.${linkActiveClass}`); } } @@ -1044,7 +1054,13 @@ export default class BOBasePage extends CommonPage { * @return {Promise} */ async getGrowlMessageContent(page: Page, timeout: number = 10000): Promise { - return page.textContent(this.growlMessageBlock, {timeout}); + const psVersion = testContext.getPSVersion(); + let {growlMessageBlock} = this; + + if (semver.lt(psVersion, '8.0.0')) { + growlMessageBlock = `${this.growlDiv} .growl-message`; + } + return page.textContent(growlMessageBlock, {timeout}); } /** diff --git a/src/pages/BO/modules/moduleManager/uninstalledModules.ts b/src/pages/BO/modules/moduleManager/uninstalledModules.ts new file mode 100644 index 00000000..54d8845d --- /dev/null +++ b/src/pages/BO/modules/moduleManager/uninstalledModules.ts @@ -0,0 +1,16 @@ +import type {ModuleManagerUninstalledModulesPageInterface} from '@interfaces/BO/modules/moduleManager/uninstalledModules'; +import testContext from '@utils/testContext'; +import semver from 'semver'; + +const psVersion = testContext.getPSVersion(); + +/* eslint-disable global-require, @typescript-eslint/no-var-requires */ +function requirePage(): ModuleManagerUninstalledModulesPageInterface { + if (semver.gte(psVersion, '8.0.0')) { + return require('@versions/mock/pages/BO/modules/moduleManager/uninstalledModules'); + } + return require('@versions/1.7.8/pages/BO/modules/moduleManager/uninstalledModules'); +} +/* eslint-enable global-require, @typescript-eslint/no-var-requires */ + +export default requirePage(); diff --git a/src/pages/FO/classic/checkout/orderConfirmation.ts b/src/pages/FO/classic/checkout/orderConfirmation.ts index 89a946b8..403b1ca9 100644 --- a/src/pages/FO/classic/checkout/orderConfirmation.ts +++ b/src/pages/FO/classic/checkout/orderConfirmation.ts @@ -6,10 +6,10 @@ const psVersion = testContext.getPSVersion(); /* eslint-disable global-require, @typescript-eslint/no-var-requires */ function requirePage(): FoCheckoutOrderConfirmationPageInterface { - if (semver.gte(psVersion, '0.0.0')) { + if (semver.gte(psVersion, '8.0.0')) { return require('@versions/develop/pages/FO/classic/checkout/orderConfirmation').orderConfirmationPage; } - return require('@versions/develop/pages/FO/classic/checkout/orderConfirmation').orderConfirmationPage; + return require('@versions/1.7.8/pages/FO/classic/checkout/orderConfirmation'); } /* eslint-enable global-require, @typescript-eslint/no-var-requires */ diff --git a/src/versions/1.7.8/pages/BO/modules/moduleManager/uninstalledModules.ts b/src/versions/1.7.8/pages/BO/modules/moduleManager/uninstalledModules.ts new file mode 100644 index 00000000..f40232a9 --- /dev/null +++ b/src/versions/1.7.8/pages/BO/modules/moduleManager/uninstalledModules.ts @@ -0,0 +1,57 @@ +import {ModuleManagerUninstalledModulesPageInterface} from '@interfaces/BO/modules/moduleManager/uninstalledModules'; +import BOBasePage from '@pages/BO/BOBasePage'; +import {Page} from '@playwright/test'; + +/** + * Module catalog page, contains selectors and functions for the page + * @class + * @extends BOBasePage + */ +class UninstalledModules extends BOBasePage implements ModuleManagerUninstalledModulesPageInterface { + public readonly installMessageSuccessful: (moduleTag: string) => string; + + private readonly subTabUninstalledModules: string; + + private readonly installModuleButton: (moduleName: string) => string; + + /** + * @constructs + * Setting up titles and selectors to use on module catalog page + */ + constructor() { + super(); + + this.installMessageSuccessful = (moduleTag: string) => `Install action on module ${moduleTag} succeeded.`; + + // Selectors + this.subTabUninstalledModules = '#subtab-AdminPsMboUninstalledModules'; + this.installModuleButton = (moduleTag: string) => `div[data-tech-name="${moduleTag}"] button.module_action_menu_install`; + } + + /* + Methods + */ + /** + * Go to the "Uninstalled modules" tab + * @param {Page} page + * @returns {Promise} + */ + async goToTabUninstalledModules(page: Page): Promise { + await this.waitForSelectorAndClick(page, this.subTabUninstalledModules); + await this.waitForVisibleSelector(page, `${this.subTabUninstalledModules}.active`, 2000); + } + + /** + * Install the module and return the growl message + * @param {Page} page + * @param {string} moduleTag + * @returns {Promise} + */ + async installModule(page: Page, moduleTag: string): Promise { + await page.locator(this.installModuleButton(moduleTag)).click(); + + return this.getGrowlMessageContent(page); + } +} + +module.exports = new UninstalledModules(); diff --git a/src/versions/1.7.8/pages/FO/classic/checkout/orderConfirmation.ts b/src/versions/1.7.8/pages/FO/classic/checkout/orderConfirmation.ts new file mode 100644 index 00000000..0fe259c3 --- /dev/null +++ b/src/versions/1.7.8/pages/FO/classic/checkout/orderConfirmation.ts @@ -0,0 +1,23 @@ +// Import pages +import type {FoCheckoutOrderConfirmationPageInterface} from '@interfaces/FO/checkout/orderConfirmation'; +import {OrderConfirmationPage} from '@versions/develop/pages/FO/classic/checkout/orderConfirmation'; + +/** + * Order confirmation page, contains functions that can be used on the page + * @class + * @extends OrderConfirmationPage + */ +class OrderConfirmation extends OrderConfirmationPage implements FoCheckoutOrderConfirmationPageInterface { + /** + * @constructs + * Setting up texts and selectors to use on order confirmation page + */ + constructor(theme: string = 'classic') { + super(theme); + + // Selectors + this.orderReferenceValue = `${this.orderDetailsTable} ul li:nth-child(1)`; + } +} + +module.exports = new OrderConfirmation(); diff --git a/src/versions/develop/pages/BO/orders/index.ts b/src/versions/develop/pages/BO/orders/index.ts index 069c67b2..44afddf4 100644 --- a/src/versions/develop/pages/BO/orders/index.ts +++ b/src/versions/develop/pages/BO/orders/index.ts @@ -147,7 +147,7 @@ class Order extends BOBasePage implements BOOrdersPageInterface { this.tableEmptyRow = `${this.tableRows}.empty_row`; this.tableColumn = (row: number, column: string) => `${this.tableRow(row)} td.column-${column}`; this.tableColumnStatus = (row: number) => `${this.tableRow(row)} td.column-osname`; - this.updateStatusInTableButton = (row: number) => `${this.tableColumnStatus(row)}.choice-type.text-left > div > button`; + this.updateStatusInTableButton = (row: number) => `${this.tableColumnStatus(row)}.choice-type > div > button`; this.updateStatusInTableDropdown = (row: number) => `${this.tableColumnStatus(row)} div.js-choice-options`; this.updateStatusInTableDropdownChoice = (row: number, statusId: number) => `${this.updateStatusInTableDropdown(row)}` + ` button[data-value='${statusId}']`; diff --git a/src/versions/mock/pages/BO/modules/moduleManager/uninstalledModules.ts b/src/versions/mock/pages/BO/modules/moduleManager/uninstalledModules.ts new file mode 100644 index 00000000..a3395c84 --- /dev/null +++ b/src/versions/mock/pages/BO/modules/moduleManager/uninstalledModules.ts @@ -0,0 +1,42 @@ +import {ModuleManagerUninstalledModulesPageInterface} from '@interfaces/BO/modules/moduleManager/uninstalledModules'; +import BOBasePage from '@pages/BO/BOBasePage'; + +/** + * Mock Page for unsupported version + * @class + * @extends BOBasePage + */ +class UninstalledModules extends BOBasePage implements ModuleManagerUninstalledModulesPageInterface { + public readonly installMessageSuccessful: (moduleTag: string) => string; + + /** + * @constructs + * Setting up titles and selectors to use on module catalog page + */ + constructor() { + super(); + + this.installMessageSuccessful = () => ''; + } + + /* + Methods + */ + /** + * Go to the "Uninstalled modules" tab + * @returns {Promise} + */ + async goToTabUninstalledModules(): Promise { + // do nothing. + } + + /** + * Install the module and return the growl message + * @returns {Promise} + */ + async installModule(): Promise { + return ''; + } +} + +module.exports = new UninstalledModules();