Skip to content

Commit

Permalink
Merge pull request #16761 from boubkerbribri/FunctionalTestOrderMessages
Browse files Browse the repository at this point in the history
Functional test  - CRUD order message
  • Loading branch information
SimonGrn committed Dec 11, 2019
2 parents 533a621 + d05aaf7 commit 15809f4
Show file tree
Hide file tree
Showing 5 changed files with 329 additions and 0 deletions.
10 changes: 10 additions & 0 deletions tests/puppeteer/campaigns/data/faker/orderMessage.js
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;
}
};
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);
});
});
});
5 changes: 5 additions & 0 deletions tests/puppeteer/pages/BO/BObasePage.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ module.exports = class BOBasePage extends CommonPage {
this.customersParentLink = 'li#subtab-AdminParentCustomer';
this.customersLink = '#subtab-AdminCustomers';

// Customer Service
this.customerServiceParentLink = '#subtab-AdminParentCustomerThreads';
// Order Messages
this.orderMessagesLink = '#subtab-AdminOrderMessage';

// Improve
// Modules
this.modulesParentLink = '#subtab-AdminParentModulesSf';
Expand Down
58 changes: 58 additions & 0 deletions tests/puppeteer/pages/BO/customerService/orderMessages/add.js
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 tests/puppeteer/pages/BO/customerService/orderMessages/index.js
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),
);
}
};

0 comments on commit 15809f4

Please sign in to comment.