-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #16761 from boubkerbribri/FunctionalTestOrderMessages
Functional test - CRUD order message
- Loading branch information
Showing
5 changed files
with
329 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
const faker = require('faker'); | ||
|
||
module.exports = class OrderMessage { | ||
constructor(messageToCreate = {}) { | ||
this.name = messageToCreate.name || faker.lorem.word(); | ||
this.message = messageToCreate.name || faker.lorem.sentence(); | ||
this.frName = messageToCreate.frName || this.name; | ||
this.frMessage = messageToCreate.frName || this.message; | ||
} | ||
}; |
131 changes: 131 additions & 0 deletions
131
tests/puppeteer/campaigns/functional/BO/customerService/orderMessages/01_CRUDOrderMessage.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
require('module-alias/register'); | ||
const {expect} = require('chai'); | ||
const helper = require('@utils/helpers'); | ||
const loginCommon = require('@commonTests/loginBO'); | ||
const OrderMessageFaker = require('@data/faker/orderMessage'); | ||
// Importing pages | ||
const BOBasePage = require('@pages/BO/BObasePage'); | ||
const LoginPage = require('@pages/BO/login'); | ||
const DashboardPage = require('@pages/BO/dashboard'); | ||
const OrderMessagesPage = require('@pages/BO/customerService/orderMessages'); | ||
const AddOrderMessagePage = require('@pages/BO/customerService/orderMessages/add'); | ||
|
||
let browser; | ||
let page; | ||
let createOrderMessageData; | ||
let editOrderMessageData; | ||
let numberOfOrderMessages = 0; | ||
|
||
// Init objects needed | ||
const init = async function () { | ||
return { | ||
boBasePage: new BOBasePage(page), | ||
loginPage: new LoginPage(page), | ||
dashboardPage: new DashboardPage(page), | ||
orderMessagesPage: new OrderMessagesPage(page), | ||
addOrderMessagePage: new AddOrderMessagePage(page), | ||
}; | ||
}; | ||
|
||
/* | ||
Create order message | ||
Update order message | ||
Delete order message | ||
*/ | ||
describe('Create, update and delete order message', async () => { | ||
// before and after functions | ||
before(async function () { | ||
browser = await helper.createBrowser(); | ||
page = await helper.newTab(browser); | ||
this.pageObjects = await init(); | ||
createOrderMessageData = await (new OrderMessageFaker()); | ||
editOrderMessageData = await (new OrderMessageFaker()); | ||
}); | ||
after(async () => { | ||
await helper.closeBrowser(browser); | ||
}); | ||
|
||
// Login into BO and go to order messages page | ||
loginCommon.loginBO(); | ||
|
||
it('should go to order messages page', async function () { | ||
await this.pageObjects.boBasePage.goToSubMenu( | ||
this.pageObjects.boBasePage.customerServiceParentLink, | ||
this.pageObjects.boBasePage.orderMessagesLink, | ||
); | ||
await this.pageObjects.boBasePage.closeSfToolBar(); | ||
const pageTitle = await this.pageObjects.orderMessagesPage.getPageTitle(); | ||
await expect(pageTitle).to.contains(this.pageObjects.orderMessagesPage.pageTitle); | ||
}); | ||
|
||
it('should reset all filters', async function () { | ||
numberOfOrderMessages = await this.pageObjects.orderMessagesPage.resetAndGetNumberOfLines(); | ||
await expect(numberOfOrderMessages).to.be.above(0); | ||
}); | ||
|
||
// 1: Create order message | ||
describe('Create order message', async () => { | ||
it('should go to new order message page', async function () { | ||
await this.pageObjects.orderMessagesPage.goToAddNewOrderMessagePage(); | ||
const pageTitle = await this.pageObjects.addOrderMessagePage.getPageTitle(); | ||
await expect(pageTitle).to.contains(this.pageObjects.addOrderMessagePage.pageTitle); | ||
}); | ||
|
||
it('should create order message', async function () { | ||
const result = await this.pageObjects.addOrderMessagePage.AddEditOrderMessage(createOrderMessageData); | ||
await expect(result).to.equal(this.pageObjects.orderMessagesPage.successfulCreationMessage); | ||
}); | ||
|
||
it('should reset filters and check number of order messages', async function () { | ||
const numberOfOrderMessagesAfterReset = await this.pageObjects.orderMessagesPage.resetAndGetNumberOfLines(); | ||
await expect(numberOfOrderMessagesAfterReset).to.be.equal(numberOfOrderMessages + 1); | ||
}); | ||
}); | ||
// 2: Update order message | ||
describe('Update order message', async () => { | ||
it('should filter by name of order message', async function () { | ||
await this.pageObjects.orderMessagesPage.filterTable('name', createOrderMessageData.name); | ||
const numberOfOrderMessagesAfterFilter = await this.pageObjects.orderMessagesPage.getNumberOfElementInGrid(); | ||
await expect(numberOfOrderMessagesAfterFilter).to.be.at.most(numberOfOrderMessages + 1); | ||
const textColumn = await this.pageObjects.orderMessagesPage.getTextColumnFromTable(1, 'name'); | ||
await expect(textColumn).to.contains(createOrderMessageData.name); | ||
}); | ||
|
||
it('should go to edit first order message page', async function () { | ||
await this.pageObjects.orderMessagesPage.gotoEditOrderMessage(1); | ||
const pageTitle = await this.pageObjects.addOrderMessagePage.getPageTitle(); | ||
await expect(pageTitle).to.contains(this.pageObjects.addOrderMessagePage.pageTitleEdit); | ||
}); | ||
|
||
it('should edit order message', async function () { | ||
const result = await this.pageObjects.addOrderMessagePage.AddEditOrderMessage(editOrderMessageData); | ||
await expect(result).to.equal(this.pageObjects.orderMessagesPage.successfulUpdateMessage); | ||
}); | ||
|
||
it('should reset filters and check number of order messages', async function () { | ||
const numberOfOrderMessagesAfterReset = await this.pageObjects.orderMessagesPage.resetAndGetNumberOfLines(); | ||
await expect(numberOfOrderMessagesAfterReset).to.be.equal(numberOfOrderMessages + 1); | ||
}); | ||
}); | ||
// 3: Delete order message | ||
describe('Delete order message', async () => { | ||
it('should filter by name of order message', async function () { | ||
await this.pageObjects.orderMessagesPage.filterTable('name', editOrderMessageData.name); | ||
const numberOfOrderMessagesAfterFilter = await this.pageObjects.orderMessagesPage.getNumberOfElementInGrid(); | ||
await expect(numberOfOrderMessagesAfterFilter).to.be.at.most(numberOfOrderMessages + 1); | ||
const textColumn = await this.pageObjects.orderMessagesPage.getTextColumnFromTable(1, 'name'); | ||
await expect(textColumn).to.contains(editOrderMessageData.name); | ||
}); | ||
|
||
it('should delete order message', async function () { | ||
// delete order message in first row | ||
const result = await this.pageObjects.orderMessagesPage.deleteOrderMessage(1); | ||
await expect(result).to.be.equal(this.pageObjects.orderMessagesPage.successfulDeleteMessage); | ||
}); | ||
|
||
it('should reset filters and check number of order messages', async function () { | ||
const numberOfOrderMessagesAfterReset = await this.pageObjects.orderMessagesPage.resetAndGetNumberOfLines(); | ||
await expect(numberOfOrderMessagesAfterReset).to.be.equal(numberOfOrderMessages); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
58 changes: 58 additions & 0 deletions
58
tests/puppeteer/pages/BO/customerService/orderMessages/add.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
require('module-alias/register'); | ||
const BOBasePage = require('@pages/BO/BObasePage'); | ||
|
||
module.exports = class AddOrderMessage extends BOBasePage { | ||
constructor(page) { | ||
super(page); | ||
|
||
this.pageTitle = 'Add new'; | ||
this.pageTitleEdit = 'Edit:'; | ||
|
||
// Selectors | ||
this.nameLangButton = '#order_message_name'; | ||
this.langDropdownDiv = 'div.dropdown-menu[aria-labelledby=\'order_message_name\']'; | ||
this.nameLangSpan = `${this.langDropdownDiv} span[data-locale='%LANG']`; | ||
this.nameInput = '#order_message_name_%ID'; | ||
this.messageTextarea = '#order_message_message_%ID'; | ||
this.saveButton = 'div.card-footer button'; | ||
} | ||
|
||
/* | ||
Methods | ||
*/ | ||
|
||
/** | ||
* Change form language | ||
* @param lang | ||
* @return {Promise<void>} | ||
*/ | ||
async changeFormLang(lang = 'en') { | ||
await Promise.all([ | ||
this.page.click(this.nameLangButton), | ||
this.page.waitForSelector(`${this.nameLangButton}[aria-expanded='true']`, {visible: true}), | ||
]); | ||
await Promise.all([ | ||
this.page.click(this.nameLangSpan.replace('%LANG', lang)), | ||
this.page.waitForSelector(`${this.nameLangButton}[aria-expanded='false']`, {visible: true}), | ||
]); | ||
} | ||
|
||
/** | ||
* | ||
* @param orderMessageData | ||
* @return {Promise<textContent>} | ||
*/ | ||
async AddEditOrderMessage(orderMessageData) { | ||
// Change lang to 'en' than set inputs value | ||
await this.changeFormLang('en'); | ||
await this.setValue(this.nameInput.replace('%ID', 1), orderMessageData.name); | ||
await this.setValue(this.messageTextarea.replace('%ID', 1), orderMessageData.message); | ||
// Change lang to 'fr' than set inputs value | ||
await this.changeFormLang('fr'); | ||
await this.setValue(this.nameInput.replace('%ID', 2), orderMessageData.frName); | ||
await this.setValue(this.messageTextarea.replace('%ID', 2), orderMessageData.frMessage); | ||
// Save order message | ||
await this.clickAndWaitForNavigation(this.saveButton); | ||
return this.getTextContent(this.alertSuccessBlockParagraph); | ||
} | ||
}; |
125 changes: 125 additions & 0 deletions
125
tests/puppeteer/pages/BO/customerService/orderMessages/index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
require('module-alias/register'); | ||
const BOBasePage = require('@pages/BO/BObasePage'); | ||
|
||
module.exports = class OrderMessages extends BOBasePage { | ||
constructor(page) { | ||
super(page); | ||
|
||
this.pageTitle = 'Order Messages •'; | ||
|
||
// Selectors header | ||
this.newOrderMessageLink = '#page-header-desc-configuration-add'; | ||
|
||
// Selectors grid panel | ||
this.gridPanel = '#order_message_grid_panel'; | ||
this.gridTable = '#order_message_grid_table'; | ||
this.gridHeaderTitle = `${this.gridPanel} h3.card-header-title`; | ||
// Filters | ||
this.filterColumn = `${this.gridTable} #order_message_%FILTERBY`; | ||
this.filterSearchButton = `${this.gridTable} button[name='order_message[actions][search]']`; | ||
this.filterResetButton = `${this.gridTable} button[name='order_message[actions][reset]']`; | ||
// Table rows and columns | ||
this.tableBody = `${this.gridTable} tbody`; | ||
this.tableRow = `${this.tableBody} tr:nth-child(%ROW)`; | ||
this.tableEmptyRow = `${this.tableBody} tr.empty_row`; | ||
this.tableColumn = `${this.tableRow} td.column-%COLUMN`; | ||
// Actions buttons in Row | ||
this.actionsColumn = `${this.tableRow} td.column-actions`; | ||
this.editRowLink = `${this.actionsColumn} a[data-original-title='Edit']`; | ||
this.dropdownToggleButton = `${this.actionsColumn} a.dropdown-toggle`; | ||
this.dropdownToggleMenu = `${this.actionsColumn} div.dropdown-menu`; | ||
this.deleteRowLink = `${this.dropdownToggleMenu} a[data-url*='/delete']`; | ||
} | ||
|
||
/* Header Methods */ | ||
/** | ||
* Go to new order message page | ||
* @return {Promise<void>} | ||
*/ | ||
async goToAddNewOrderMessagePage() { | ||
await this.clickAndWaitForNavigation(this.newOrderMessageLink); | ||
} | ||
|
||
|
||
/* Reset Methods */ | ||
/** | ||
* Reset filters in table | ||
* @return {Promise<void>} | ||
*/ | ||
async resetFilter() { | ||
if (await this.elementVisible(this.filterResetButton, 2000)) { | ||
await this.clickAndWaitForNavigation(this.filterResetButton); | ||
} | ||
} | ||
|
||
/** | ||
* get number of elements in grid | ||
* @return {Promise<integer>} | ||
*/ | ||
async getNumberOfElementInGrid() { | ||
return this.getNumberFromText(this.gridHeaderTitle); | ||
} | ||
|
||
/** | ||
* Reset Filter And get number of elements in list | ||
* @return {Promise<integer>} | ||
*/ | ||
async resetAndGetNumberOfLines() { | ||
await this.resetFilter(); | ||
return this.getNumberOfElementInGrid(); | ||
} | ||
|
||
/* filter Methods */ | ||
/** | ||
* Filter Table | ||
* @param filterBy, which column | ||
* @param value, value to put in filter | ||
* @return {Promise<void>} | ||
*/ | ||
async filterTable(filterBy, value) { | ||
await this.setValue(this.filterColumn.replace('%FILTERBY', filterBy), value); | ||
await this.clickAndWaitForNavigation(this.filterSearchButton); | ||
} | ||
|
||
/* Column Methods */ | ||
/** | ||
* Edit order message | ||
* @param row | ||
* @return {Promise<void>} | ||
*/ | ||
async gotoEditOrderMessage(row = 1) { | ||
await this.clickAndWaitForNavigation(this.editRowLink.replace('%ROW', row)); | ||
} | ||
|
||
/** | ||
* Delete Row in table | ||
* @param row, row to delete | ||
* @return {Promise<textContent>} | ||
*/ | ||
async deleteOrderMessage(row = 1) { | ||
this.dialogListener(true); | ||
await Promise.all([ | ||
this.page.click(this.dropdownToggleButton.replace('%ROW', row)), | ||
this.page.waitForSelector( | ||
`${this.dropdownToggleButton}[aria-expanded='true']`.replace('%ROW', row), | ||
), | ||
]); | ||
await this.clickAndWaitForNavigation(this.deleteRowLink.replace('%ROW', row)); | ||
await this.page.waitForSelector(this.alertSuccessBlockParagraph, {visible: true}); | ||
return this.getTextContent(this.alertSuccessBlockParagraph); | ||
} | ||
|
||
/** | ||
* get text from a column | ||
* @param row, row in table | ||
* @param column, which column | ||
* @return {Promise<textContent>} | ||
*/ | ||
async getTextColumnFromTable(row, column) { | ||
return this.getTextContent( | ||
this.tableColumn | ||
.replace('%ROW', row) | ||
.replace('%COLUMN', column), | ||
); | ||
} | ||
}; |