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/BO/orders/view/messagesBlock from Core #347

Merged
merged 1 commit into from
Jan 23, 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
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ export {default as boOrdersPage} from '@pages/BO/orders';
export {default as boOrdersCreatePage} from '@pages/BO/orders/create';
export {default as boOrdersViewBasePage} from '@pages/BO/orders/view/viewOrderBasePage';
export {default as boOrdersViewBlockCustomersPage} from '@pages/BO/orders/view/blockCustomers';
export {default as boOrdersViewBlockMessagesPage} from '@pages/BO/orders/view/blockMessages';
export {default as boOrdersViewBlockProductsPage} from '@pages/BO/orders/view/blockProducts';
export {default as boOrdersViewBlockTabListPage} from '@pages/BO/orders/view/blockTabList';
export {default as boOrderSettingsPage} from '@pages/BO/shopParameters/orderSettings';
Expand Down
13 changes: 13 additions & 0 deletions src/interfaces/BO/orders/view/blockMessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {type OrderMessage} from '@data/types/order';
import {BOViewOrderBasePageInterface} from '@interfaces/BO/orders/view/viewOrderBasePage';
import {type Page} from '@playwright/test';

export interface BOProductBlockMessagesPageInterface extends BOViewOrderBasePageInterface {
clickOnConfigureMessageLink(page: Page): Promise<void>;
getMessagesNumber(page: Page): Promise<number>;
getTextMessage(page: Page, messageID?: number, messageFrom?: string): Promise<string>;
isEmployeeIconVisible(page: Page, messageID?: number): Promise<boolean>;
isEmployeePrivateIconVisible(page: Page, messageID?: number): Promise<boolean>;
isMessageVisible(page: Page, messageID?: number, messageFrom?: string): Promise<boolean>;
sendMessage(page: Page, messageData: OrderMessage): Promise<string>;
}
1 change: 1 addition & 0 deletions src/interfaces/BO/orders/view/viewOrderBasePage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {BOBasePagePageInterface} from '@interfaces/BO';
import type {Page} from '@playwright/test';

export interface BOViewOrderBasePageInterface extends BOBasePagePageInterface {
readonly commentSuccessfullMessage: string;
readonly discountCannotExceedTotalErrorMessage: string;
readonly discountMustBeNumberErrorMessage: string;
readonly errorAddSameProduct: string;
Expand Down
9 changes: 9 additions & 0 deletions src/pages/BO/orders/view/blockMessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import {type BOProductBlockMessagesPageInterface} from '@interfaces/BO/orders/view/blockMessages';

/* eslint-disable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
function requirePage(): BOProductBlockMessagesPageInterface {
return require('@versions/develop/pages/BO/orders/view/blockMessages');
}
/* eslint-enable global-require, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */

export default requirePage();
155 changes: 155 additions & 0 deletions src/versions/develop/pages/BO/orders/view/blockMessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import {type OrderMessage} from '@data/types/order';
import {type BOProductBlockMessagesPageInterface} from '@interfaces/BO/orders/view/blockMessages';
import {type Page} from '@playwright/test';
import {ViewOrderBasePage} from '@versions/develop/pages/BO/orders/view/viewOrderBasePage';

/**
* Messages block, contains functions that can be used on view/edit messages block on view order page
* @class
* @extends ViewOrderBasePage
*/
class BOProductBlockMessagesPage extends ViewOrderBasePage implements BOProductBlockMessagesPageInterface {
private readonly messageBlock: string;

private readonly messageBlockTitle: string;

private readonly orderMessageSelect: string;

private readonly displayToCustometCheckbox: string;

private readonly messageTextarea: string;

private readonly sendMessageButton: string;

private readonly messageBlockList: string;

private readonly messageListChild: (messageID: number) => string;

private readonly messageBlockEmployee: (messageID: number) => string;

private readonly messageBlockCustomer: (messageID: number) => string;

private readonly messageEmployeeBlockContent: (messageID: number) => string;

private readonly messageCustomerBlockContent: (messageID: number) => string;

private readonly messageBlockIcon: (messageID: number) => string;

private readonly configureLink: string;

/**
* @constructs
* Setting up texts and selectors to use on view/edit messages block
*/
constructor() {
super();

// Messages block
this.messageBlock = 'div[data-role=\'message-card\']';
this.messageBlockTitle = `${this.messageBlock} .card-header-title`;
this.orderMessageSelect = '#order_message_order_message';
this.displayToCustometCheckbox = `${this.messageBlock} .md-checkbox label`;
this.messageTextarea = '#order_message_message';
this.sendMessageButton = `${this.messageBlock} .btn-primary`;
this.messageBlockList = `${this.messageBlock} .messages-block`;
this.messageListChild = (messageID: number) => `${this.messageBlockList} li:nth-child(${messageID})`;
this.messageBlockEmployee = (messageID: number) => `${this.messageListChild(messageID)}.messages-block-employee`;
this.messageBlockCustomer = (messageID: number) => `${this.messageListChild(messageID)}.messages-block-customer`;
this.messageEmployeeBlockContent = (messageID: number) => `${this.messageBlockEmployee(messageID)} .messages-block-content`;
this.messageCustomerBlockContent = (messageID: number) => `${this.messageBlockCustomer(messageID)} .messages-block-content`;
this.messageBlockIcon = (messageID: number) => `${this.messageBlockEmployee(messageID)} .messages-block-icon`;
this.configureLink = `${this.messageBlock} .configure-link`;
}

/*
Methods
*/
/**
* Send message
* @param page {Page} Browser tab
* @param messageData {OrderMessage} Data to set on the form
* @returns {Promise<string>}
*/
async sendMessage(page: Page, messageData: OrderMessage): Promise<string> {
await this.selectByVisibleText(page, this.orderMessageSelect, messageData.orderMessage);
await this.setChecked(page, this.displayToCustometCheckbox, messageData.displayToCustomer);

if (messageData.message !== '') {
await this.setValue(page, this.messageTextarea, messageData.message);
}

await this.waitForSelectorAndClick(page, this.sendMessageButton);

return this.getAlertSuccessBlockParagraphContent(page);
}

/**
* Get messages number
* @param page {Page} Browser tab
* @returns {Promise<number>}
*/
async getMessagesNumber(page: Page): Promise<number> {
return this.getNumberFromText(page, this.messageBlockTitle);
}

/**
* Is message visible
* @param page {Page} Browser tab
* @param messageID {number} Message ID on the list
* @param messageFrom {string} The message sender
* @returns {Promise<boolean>}
*/
async isMessageVisible(page: Page, messageID: number = 1, messageFrom: string = 'employee'): Promise<boolean> {
if (messageFrom === 'employee') {
return this.elementVisible(page, this.messageEmployeeBlockContent(messageID), 1000);
}

return this.elementVisible(page, this.messageCustomerBlockContent(messageID), 1000);
}

/**
* Is employee icon visible
* @param page {Page} Browser tab
* @param messageID {number} Message id number
* @returns {Promise<boolean>}
*/
async isEmployeeIconVisible(page: Page, messageID: number = 1): Promise<boolean> {
return this.elementVisible(page, `${this.messageBlockIcon(messageID)} .employee-icon`, 1000);
}

/**
* Is employee private icon visible
* @param page {Page} Browser tab
* @param messageID {number} Message id number
* @returns {Promise<boolean>}
*/
async isEmployeePrivateIconVisible(page: Page, messageID: number = 1): Promise<boolean> {
return this.elementVisible(page, `${this.messageBlockIcon(messageID)} .employee-icon--private`, 1000);
}

/**
* Get text message
* @param page {Page} Browser tab
* @param messageID {number} Message ID on the list
* @param messageFrom {string} The message sender
* @returns {Promise<string>}
*/
async getTextMessage(page: Page, messageID: number = 1, messageFrom: string = 'employee'): Promise<string> {
if (messageFrom === 'employee') {
return this.getTextContent(page, this.messageEmployeeBlockContent(messageID));
}

return this.getTextContent(page, this.messageCustomerBlockContent(messageID));
}

/**
* Click on configure predefined messages link
* @param page {Page} Browser tab
* @returns {Promise<void>}
*/
async clickOnConfigureMessageLink(page: Page): Promise<void> {
await this.clickAndWaitForURL(page, this.configureLink);
}
}

module.exports = new BOProductBlockMessagesPage();
Loading