Skip to content

Commit 6d0ed66

Browse files
Merge pull request #244 from nesrineabdmouleh/addMethodsInCartPage
Add methods in cart page and Adapt sanity tests with 1.7.2
2 parents 242dded + 58153ca commit 6d0ed66

File tree

23 files changed

+370
-19
lines changed

23 files changed

+370
-19
lines changed

src/data/demo/categories.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const women: FakerCategory = new FakerCategory({
1313
id: 5,
1414
name: 'Women',
1515
description: 'T-shirts, sweaters, hoodies and women\'s accessories. From basics to original creations, '
16-
+ 'for every style.',
16+
+ 'for every style.',
1717
position: 2,
1818
displayed: true,
1919
products: ['demo_3'],
@@ -39,7 +39,7 @@ const clothes: FakerCategory = new FakerCategory({
3939
id: 3,
4040
name: 'Clothes',
4141
description: 'Discover our favorites fashionable discoveries, a selection of cool items to integrate in your '
42-
+ 'wardrobe. Compose a unique style with personality which matches your own.',
42+
+ 'wardrobe. Compose a unique style with personality which matches your own.',
4343
position: 1,
4444
displayed: true,
4545
children: [
@@ -68,6 +68,24 @@ const art: FakerCategory = new FakerCategory({
6868
displayed: true,
6969
products: ['demo_5', 'demo_6', 'demo_7', 'demo_18', 'demo_19', 'demo_20'],
7070
});
71+
// Categories demo for PS version <= 1.7.2
72+
//@todo : to find for a solution in case of upgrade 1.7.2 to 1.7.8
73+
const oldWomen: FakerCategory = new FakerCategory({
74+
id: 3,
75+
name: 'Women',
76+
description: 'You will find here all woman fashion collections. This category includes all the basics of your '
77+
+ 'wardrobe and much more: shoes, accessories, printed t-shirts, feminine dresses, women\'s jeans!\'',
78+
position: 1,
79+
displayed: true,
80+
});
81+
//@todo : to find for a solution in case of upgrade 1.7.2 to 1.7.8
82+
const eveningDresses: FakerCategory = new FakerCategory({
83+
id: 10,
84+
name: 'Evening Dresses',
85+
description: 'Browse our different dresses to choose the perfect dress for an unforgettable evening!',
86+
position: 2,
87+
displayed: true,
88+
});
7189

7290
export default {
7391
home: new FakerCategory({
@@ -90,4 +108,6 @@ export default {
90108
stationery,
91109
homeAccessories,
92110
art,
111+
oldWomen,
112+
eveningDresses,
93113
};

src/data/demo/products.ts

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ export default {
99
category: 'Men',
1010
summary: 'Regular fit, round neckline, short sleeves. Made of extra long staple pima cotton.',
1111
description: 'Symbol of lightness and delicacy, the hummingbird evokes curiosity and joy. Studio Design\' '
12-
+ 'PolyFaune collection features classic products with colorful patterns, inspired by the traditional japanese '
13-
+ 'origamis. To wear with a chino or jeans. The sublimation textile printing process provides an exceptional '
14-
+ 'color rendering and a color, guaranteed overtime.',
12+
+ 'PolyFaune collection features classic products with colorful patterns, inspired by the traditional japanese '
13+
+ 'origamis. To wear with a chino or jeans. The sublimation textile printing process provides an exceptional '
14+
+ 'color rendering and a color, guaranteed overtime.',
1515
retailPrice: 28.68,
1616
tax: 20,
1717
price: 23.90,
@@ -245,4 +245,58 @@ export default {
245245
category: 'Home Accessories',
246246
status: true,
247247
}),
248+
// Products demo for PS version <= 1.7.2
249+
//@todo : to find for a solution in case of upgrade 1.7.2 to 1.7.8
250+
old_demo_1: new FakerProduct({
251+
id: 1,
252+
name: 'Faded Short Sleeves T-shirt',
253+
description: 'Fashion has been creating well-designed collections since 2010.',
254+
finalPrice: 19.81,
255+
reference: 'demo_1',
256+
category: 'T-shirts',
257+
status: true,
258+
}),
259+
old_demo_2: new FakerProduct({
260+
id: 2,
261+
name: 'Blouse',
262+
finalPrice: 32.39,
263+
reference: 'demo_2',
264+
category: 'Blouses',
265+
status: true,
266+
}),
267+
old_demo_3: new FakerProduct({
268+
id: 3,
269+
name: 'Printed Dress',
270+
reference: 'demo_3',
271+
category: 'Casual Dresses',
272+
status: true,
273+
}),
274+
old_demo_4: new FakerProduct({
275+
id: 4,
276+
name: 'Printed Dress',
277+
reference: 'demo_4',
278+
category: 'Evening Dresses',
279+
status: true,
280+
}),
281+
old_demo_5: new FakerProduct({
282+
id: 5,
283+
name: 'Printed Summer Dress',
284+
reference: 'demo_5',
285+
category: 'Summer Dresses',
286+
status: true,
287+
}),
288+
old_demo_6: new FakerProduct({
289+
id: 6,
290+
name: 'Printed Summer Dress',
291+
reference: 'demo_6',
292+
category: 'Summer Dresses',
293+
status: true,
294+
}),
295+
old_demo_7: new FakerProduct({
296+
id: 7,
297+
name: 'Printed Chiffon Dress',
298+
reference: 'demo_7',
299+
category: 'Summer Dresses',
300+
status: true,
301+
}),
248302
};

src/interfaces/FO/cart/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ export interface FoCartPageInterface extends FOBasePagePageInterface {
3636
getProductAttributes(page: Page, row: number): Promise<ProductAttribute[]>;
3737
getProductCustomizationModal(page: Page, row?: number): Promise<string>;
3838
getProductDetail(page: Page, row: number): Promise<ProductDetailsWithDiscount>;
39+
getProductName(page: Page, row: number): Promise<string>;
40+
getProductPrice(page: Page, row: number): Promise<number>;
41+
getProductQuantity(page: Page, row: number): Promise<number>;
3942
getProductsNumber(page: Page): Promise<number>;
4043
getSubtotalDiscountValue(page: Page): Promise<number>;
4144
isAlertWarningForMinimumPurchaseVisible(page: Page): Promise<boolean>;

src/pages/BO/catalog/products/create/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ const psVersion = testContext.getPSVersion();
66

77
/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
88
function requirePage(): BOProductsCreatePageInterface {
9+
if (semver.lt(psVersion, '7.3.0')) {
10+
return require('@versions/1.7.2/pages/BO/catalog/products/create').createProduct;
11+
}
912
if (semver.lt(psVersion, '7.4.0')) {
1013
return require('@versions/1.7.3/pages/BO/catalog/products/create').createProduct;
1114
}

src/pages/BO/catalog/products/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ const psVersion = testContext.getPSVersion();
66

77
/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
88
function requirePage(): BOProductsPageInterface {
9+
if (semver.lt(psVersion, '7.3.0')) {
10+
return require('@versions/1.7.2/pages/BO/catalog/products').productsPage;
11+
}
912
if (semver.lt(psVersion, '7.4.0')) {
1013
return require('@versions/1.7.3/pages/BO/catalog/products').productsPage;
1114
}

src/pages/BO/login/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ const psVersion = testContext.getPSVersion();
66

77
/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
88
function requirePage(): LoginPageInterface {
9+
if (semver.lt(psVersion, '7.3.0')) {
10+
return require('@versions/1.7.2/pages/BO/login').loginPage;
11+
}
912
if (semver.lt(psVersion, '8.0.0')) {
10-
return require('@versions/1.7.8/pages/BO/login');
13+
return require('@versions/1.7.8/pages/BO/login').loginPage;
1114
}
1215
if (semver.lt(psVersion, '9.0.0')) {
1316
return require('@versions/8.1/pages/BO/login').loginPage;

src/pages/BO/orders/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ const psVersion = testContext.getPSVersion();
66

77
/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
88
function requirePage(): BOOrdersPageInterface {
9+
if (semver.lt(psVersion, '7.3.0')) {
10+
return require('@versions/1.7.2/pages/BO/orders').ordersPage;
11+
}
912
if (semver.lt(psVersion, '7.7.0')) {
1013
return require('@versions/1.7.6/pages/BO/orders').ordersPage;
1114
}

src/pages/BO/orders/view/viewOrderBasePage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import semver from 'semver';
55
const psVersion = testContext.getPSVersion();
66
/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
77
function requirePage(): BOViewOrderBasePageInterface {
8+
if (semver.lt(psVersion, '7.3.0')) {
9+
return require('@versions/1.7.2/pages/BO/orders/view/viewOrderBasePage').viewOrderBasePage;
10+
}
811
if (semver.lt(psVersion, '7.7.0')) {
912
return require('@versions/1.7.6/pages/BO/orders/view/viewOrderBasePage').viewOrderBasePage;
1013
}

src/pages/FO/FOBasePage.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,8 @@ export default class FOBasePage extends CommonPage implements FOBasePagePageInte
529529
*/
530530
async goToSubCategory(page: Page, categoryID: number, subCategoryID: number): Promise<void> {
531531
await page.locator(this.categoryMenu(categoryID)).first().hover();
532-
await this.clickAndWaitForURL(page, this.categoryMenu(subCategoryID));
532+
await page.locator(this.categoryMenu(subCategoryID)).click();
533+
await page.waitForLoadState();
533534
}
534535

535536
/**

src/pages/FO/classic/login/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ const psVersion = testContext.getPSVersion();
66

77
/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
88
function requirePage(): FoLoginPageInterface {
9-
if (semver.gte(psVersion, '0.0.0')) {
10-
return require('@versions/develop/pages/FO/classic/login').loginPage;
9+
if (semver.lte(psVersion, '7.3.0')) {
10+
return require('@versions/1.7.2/pages/FO/classic/login').loginPage;
1111
}
1212
return require('@versions/develop/pages/FO/classic/login').loginPage;
1313
}
14+
1415
/* eslint-enable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
1516

1617
export default requirePage();
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Import pages
2+
import type {BOProductsCreatePageInterface} from '@interfaces/BO/catalog/products/create';
3+
import {CreateProduct} from '@versions/1.7.3/pages/BO/catalog/products/create';
4+
import {type Page} from '@playwright/test';
5+
6+
/**
7+
* Bo create product page, contains functions that can be used on the page
8+
* @class
9+
* @extends CreateProduct
10+
*/
11+
class BOCreateProductVersion extends CreateProduct implements BOProductsCreatePageInterface {
12+
private readonly confirmationModalContinueButton: string;
13+
14+
/**
15+
* @constructs
16+
* Setting up texts and selectors to use on create products page
17+
*/
18+
constructor() {
19+
super();
20+
21+
this.deleteProductButton = '#product_form_delete_btn';
22+
this.confirmationModalContinueButton = '#confirmation_modal button.continue';
23+
this.alertSuccessBlock = `${this.alertBlock}.flash-message-list.alert-success`;
24+
}
25+
26+
/**
27+
* Delete product
28+
* @param page {Page} Browser tab
29+
* @returns {Promise<string>}
30+
*/
31+
async deleteProduct(page: Page): Promise<string> {
32+
await page.locator(this.deleteProductButton).click();
33+
await this.clickAndWaitForURL(page, this.confirmationModalContinueButton);
34+
35+
return this.getAlertSuccessBlockContent(page);
36+
}
37+
}
38+
39+
const createProduct = new BOCreateProductVersion();
40+
export {createProduct, BOCreateProductVersion as CreateProduct};
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Import pages
2+
import type {BOProductsPageInterface} from '@interfaces/BO/catalog/products';
3+
import {ProductsPage} from '@versions/1.7.3/pages/BO/catalog/products';
4+
import {type Page} from '@playwright/test';
5+
6+
/**
7+
* Bo products page, contains functions that can be used on the page
8+
* @class
9+
* @extends ProductsPage
10+
*/
11+
class BOProductsVersion extends ProductsPage implements BOProductsPageInterface {
12+
/**
13+
* @constructs
14+
* Setting up texts and selectors to use on products page
15+
*/
16+
constructor() {
17+
super();
18+
19+
this.alertSuccessBlock = `${this.alertBlock}.flash-message-list.alert-success`;
20+
21+
// Products list
22+
this.productListTableDropDownList = (row: number) => `${this.productsListTableRow(row)} td div.btn-group-action `
23+
+ 'a[data-toggle="dropdown"]';
24+
25+
// Modal dialog
26+
this.modalDialog = '.modal[style*="display"]';
27+
this.modalDialogFooter = `${this.modalDialog} div.modal-footer`;
28+
this.modalDialogConfirmButton = `${this.modalDialogFooter} button[value="confirm"]`;
29+
30+
// Bulk actions
31+
this.bulkActionsDropDownMenu = 'div.dropup.open div.dropdown-menu';
32+
}
33+
34+
/**
35+
* Confirm dialog product
36+
* @param page {Page} Browser tab
37+
* @returns {Promise<string>}
38+
*/
39+
async clickOnConfirmDialogButton(page: Page): Promise<string> {
40+
await this.waitForSelectorAndClick(page, this.modalDialogConfirmButton);
41+
42+
return this.getAlertSuccessBlockContent(page);
43+
}
44+
45+
/**
46+
* Bulk actions products
47+
* @param page {Page} Browser tab
48+
* @param action {string} Enable/disable/duplicate or delete
49+
* @returns {Promise<string>}
50+
*/
51+
async bulkActionsProduct(page: Page, action: string): Promise<string> {
52+
const actionSelector: string = (action === 'enable' || action === 'disable') ? `${action}_all` : `${action}`;
53+
await this.clickAndWaitForURL(page, this.modalDialogBulkActionButton(actionSelector));
54+
55+
return this.getAlertSuccessBlockContent(page);
56+
}
57+
}
58+
59+
const productsPage = new BOProductsVersion();
60+
export {productsPage, BOProductsVersion as ProductsPage};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Import pages
2+
import type {LoginPageInterface} from '@interfaces/BO/login';
3+
import {LoginPage} from '@versions/develop/pages/BO/login';
4+
5+
/**
6+
* Bo login page, contains functions that can be used on the page
7+
* @class
8+
* @extends ProductsPage
9+
*/
10+
class BOLoginVersion extends LoginPage implements LoginPageInterface {
11+
/**
12+
* @constructs
13+
* Setting up texts and selectors to use on login page
14+
*/
15+
constructor() {
16+
super();
17+
18+
this.submitLoginButton = 'button[name="submitLogin"]';
19+
}
20+
}
21+
22+
const loginPage = new BOLoginVersion();
23+
export {loginPage, BOLoginVersion as LoginPage};
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Import pages
2+
import type {BOOrdersPageInterface} from '@interfaces/BO/orders';
3+
import {OrdersPage} from '@versions/1.7.6/pages/BO/orders/index';
4+
import type {Page} from 'playwright-core';
5+
6+
/**
7+
* Orders page, contains functions that can be used on the page
8+
* @class
9+
* @extends OrdersPage
10+
*/
11+
class OrdersPageVersion extends OrdersPage implements BOOrdersPageInterface {
12+
/**
13+
* @constructs
14+
* Setting up texts and selectors to use on orders page
15+
*/
16+
constructor() {
17+
super();
18+
19+
// Selectors grid panel
20+
this.gridTable = 'table.table.order';
21+
this.filterSearchButton = `${this.gridTable} #submitFilterButtonorder`;
22+
this.filterResetButton = `${this.gridTable} button[name='submitResetorder']`;
23+
24+
// Table rows
25+
this.tableBody = `${this.gridTable} tbody`;
26+
this.tableRows = `${this.tableBody} tr`;
27+
this.tableRow = (row: number) => `${this.tableRows}:nth-child(${row})`;
28+
this.tableRowColumn = (row: number, column: number) => `${this.tableRow(row)} td:nth-child(${column})`;
29+
this.viewRowLink = (row: number) => `${this.tableRow(row)} a[href*='view']`;
30+
}
31+
32+
/**
33+
* Filter Orders
34+
* @param page {Page} Browser tab
35+
* @param filterType {string} Type of filter
36+
* @param filterBy {string} Column to filter with
37+
* @param value {string} Value to filter
38+
* @returns {Promise<void>}
39+
*/
40+
async filterOrders(page: Page, filterType: string, filterBy: string, value: string = ''): Promise<void> {
41+
await this.resetFilter(page);
42+
switch (filterType) {
43+
case 'input':
44+
await this.setValue(page, this.filterColumn(filterBy), value);
45+
break;
46+
case 'select':
47+
await this.selectByVisibleText(page, this.filterColumn(filterBy), value);
48+
break;
49+
default:
50+
// Do nothing
51+
}
52+
// click on search
53+
await page.locator(this.filterSearchButton).click();
54+
await page.waitForLoadState();
55+
}
56+
}
57+
58+
const ordersPage = new OrdersPageVersion();
59+
export {ordersPage, OrdersPageVersion as OrdersPage};

0 commit comments

Comments
 (0)