UNPKG

@openveo/test

Version:
640 lines (519 loc) 19.4 kB
'use strict'; /** * @module e2e/asserts/TableAssert */ var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); var browserExt = process.requireTest('lib/e2e/browser.js'); // Load assertion library var assert = chai.assert; chai.use(chaiAsPromised); /** * Defines a table assertion helper to help writing assertions for table pages. * * @example * var TableAssert = require('@openveo/test').e2e.asserts.TableAssert; * * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * * @class TableAssert * @constructor * @param {module:e2e/pages/TablePage~TablePage} page The table page to test * @param {module:e2e/helpers/Helper~Helper} helper The helper to manipulate entities without interacting with the web * browser */ function TableAssert(page, helper) { Object.defineProperties(this, /** @lends module:e2e/asserts/TableAssert~TableAssert */ { /** * The page containing the table to test. * * @type {module:e2e/pages/TablePage~TablePage} * @instance * @readonly */ page: {value: page}, /** * The helper to manipulate entities. * * @type {module:e2e/helpers/Helper~Helper} * @instance * @readonly */ helper: {value: helper} } ); } module.exports = TableAssert; /** * Checks that table navigation is working. * * Use table navigation links to navigate on pages and verify, on each page, the current page, total pages, * total lines and the number of lines in the page. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkPagination(50, 10); * * @private * @method checkNavigation * @memberof module:e2e/asserts/TableAssert~TableAssert * @this module:e2e/asserts/TableAssert~TableAssert * @param {Number} totalElements The total number of elements * @param {Number} numberPerPage The number of elements displayed per page * @param {Number} [index] The page index * @return {Promise} Promise resolving when navigation has been checked */ function checkNavigation(totalElements, numberPerPage, index) { index = index || 1; var self = this; var totalPages = Math.ceil(totalElements / numberPerPage); if (index <= totalPages) { // Select page return this.page.selectPage(index).then(function() { // Calculate the theorical total number of elements in this page var linesNumber = numberPerPage; // Last page if (index === totalPages) linesNumber = numberPerPage - ((numberPerPage * index) - totalElements); // Check navigation assert.eventually.equal(self.page.getCurrentPage(), index, 'Current page incorrect'); assert.eventually.equal(self.page.getTotalPages(), totalPages, 'Total pages incorrect'); assert.eventually.equal(self.page.getTotalLines(), totalElements, 'Total lines incorrect'); assert.eventually.equal(self.page.getLinesInPageNumber(), linesNumber, 'Number of lines in page incorrect'); return browser.waitForAngular(); }).then(function() { return checkNavigation.call(self, totalElements, numberPerPage, ++index); }); } else { return protractor.promise.fulfilled(); } } /** * Checks if lines are correctly sorted for both ascending and descending order. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using helper addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkSort('My column'); * * @param {String} property The name of the column to sort on * @return {Promise} Promise resolving when sort has been checked */ TableAssert.prototype.checkSort = function(property) { var self = this; var totalLinesInPage; var totalLinesToAdd = 2; var name = 'test sort'; var lines; return browser.waitForAngular().then(function() { // Add lines self.helper.addEntitiesAuto(name, totalLinesToAdd).then(function(addedLines) { lines = addedLines; return self.page.refresh(); }); // Select first page self.page.selectPage(1); // Get the number of lines in the page self.page.getLinesInPageNumber().then(function(total) { totalLinesInPage = total; }); // Sort by property asc and verify that values are correctly sorted self.page.sortBy(property, true); self.page.getLineValues(property).then(function(values) { var sortedValues = values.slice().sort(); for (var i = 0; i < totalLinesInPage.length; i++) assert.equal(values[i], sortedValues[i]); }); // Sort by property desc and verify that values are correctly sorted self.page.sortBy(property, false); self.page.getLineValues(property).then(function(values) { var sortedValues = values.slice().sort().reverse(); for (var i = 0; i < totalLinesInPage.length; i++) assert.equal(values[i], sortedValues[i]); }); return browser.waitForAngular().then(function() { // Removes lines self.helper.removeEntities(lines); return self.page.refresh(); }); }); }; /** * Checks if buttons to change the number of displayed items per page are displayed correctly depending on the * actual number of lines in the table. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkItemsPerPageButtons(); * * @private * @method checkItemsPerPageButtons * @memberof module:e2e/asserts/TableAssert~TableAssert * @this module:e2e/asserts/TableAssert~TableAssert * @return {Promise} Promise resolving when buttons have been checked */ function checkItemsPerPageButtons() { var self = this; // Get the total number of lines (all pages combined) return this.page.getTotalLines().then(function(totalLines) { if (totalLines < 6) { // Only one page assert.eventually.equal(self.page.itemsPerPageLinkElements.count(), 0); } else { // Several pages var expectedNumberOfButtons = Math.min(Math.ceil(totalLines / 10) + 1, 4); assert.eventually.equal(self.page.itemsPerPageLinkElements.count(), expectedNumberOfButtons); } }); } /** * Checks if buttons to change the number of displayed items per page are correctly displayed regarding the * total number of lines. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using page addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkItemsPerPage(); * * @return {Promise} Promise resolving when buttons per page have been checked */ TableAssert.prototype.checkItemsPerPage = function() { var self = this; var totalLinesToAdd = 31; var i = 0; var query = 'test items per page buttons'; var lines = []; var search = {query: query}; // Verify buttons to change the number of displayed items return this.page.search(search).then(function() { checkItemsPerPageButtons.call(self); // Add lines 6 lines self.helper.addEntitiesAuto(query, i + 6).then(function(addedLines) { self.page.refresh(); self.page.search(search); lines = lines.concat(addedLines); }); i += 6; // Verify buttons to change the number of displayed items checkItemsPerPageButtons.call(self); // Add lines to have 11 lines self.helper.addEntitiesAuto(query, 5, i + 1).then(function(addedLines) { self.page.refresh(); self.page.search(search); lines = lines.concat(addedLines); }); i += 5; // Verify buttons to change the number of displayed items checkItemsPerPageButtons.call(self); // Add 10 lines by 10 lines and verify, each time, that a new button to change the number of displayed items per // page is added while (i < totalLinesToAdd) { self.helper.addEntitiesAuto(query, Math.min(i + 10, totalLinesToAdd), i).then(function(addedLines) { self.page.refresh(); self.page.search(search); lines = lines.concat(addedLines); }); i = Math.min(i + 10, totalLinesToAdd); // Verify buttons to change the number of displayed items checkItemsPerPageButtons.call(self); } // Clear search engine self.page.clearSearch(); return browser.waitForAngular().then(function() { // Removes lines self.helper.removeEntities(lines); return self.page.refresh(); }); }); }; /** * Checks if removing several lines at the same time works correctly. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using page addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkMassiveRemove(); * * @return {Promise} Promise resolving when massive remove has been checked */ TableAssert.prototype.checkMassiveRemove = function() { var self = this; var totalLinesToAdd = 4; var query = 'test massive remove'; var search = {query: query}; return browser.waitForAngular().then(function() { // Add lines self.helper.addEntitiesAuto(query, totalLinesToAdd).then(function() { self.page.refresh(); // Search for those lines self.page.search(search); }); // Select the first half of lines for (var i = 0; i < (totalLinesToAdd / 2); i++) self.page.selectLine(query + ' ' + i); // Remove first half self.page.removeAllSelectedLinesInPage(); // Remove last half of applications self.page.removeAllLinesInPage(); // Clear search fields return self.page.clearSearch(); }); }; /** * Checks if pagination works correctly. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using page addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkPagination(); * * @return {Promise} Promise resolving when pagination has been checked */ TableAssert.prototype.checkPagination = function() { var self = this; var lines; var totalLinesToAdd = 31; var query = 'test pagination'; var search = {query: query}; return browser.waitForAngular().then(function() { // Add lines self.helper.addEntitiesAuto(query, totalLinesToAdd).then(function(addedLines) { self.page.refresh(); self.page.search(search); lines = addedLines; }); // Test pagination self.page.getTotalLines().then(function(totalLines) { var itemsPerPage = [5, 10, 20, 30]; for (var i = 0; i < itemsPerPage.length; i++) { var lastIndex = (i - 1) || 0; var itemPerPage = itemsPerPage[i]; if (totalLines > itemsPerPage[lastIndex]) { self.page.setLinesNumber(itemPerPage); checkNavigation.call(self, totalLines, itemPerPage); } } }); // Clear search engine self.page.clearSearch(); return browser.waitForAngular().then(function() { // Removes lines self.helper.removeEntities(lines); return self.page.refresh(); }); }); }; /** * Checks if search engine works correctly. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * * var expectedValues = ['Test 1', 'Test 2']; * var search = { name: 'Name' }; * * // Execute search and get all values of column 'Name' then compare this values to the expected values * tableAssert.checkSearch(search, expectedValues, 'Name'); * * @param {Object} search A search description object * @param {Array} expectedValues The expected list of line values corresponding to the research * @param {String} columnName The name of the column to extract value from and compare to expectedValues * @return {Promise} Promise resolving when search has been checked */ TableAssert.prototype.checkSearch = function(search, expectedValues, columnName) { var self = this; // Execute search return this.page.search(search).then(function() { // Get all line values after search self.page.getLineValues(columnName).then(function(values) { for (var i = 0; i < expectedValues.length; i++) assert.ok(values.indexOf(expectedValues[i]) >= 0); // Check if values correspond to expected ones assert.equal(values.length, expectedValues.length, expectedValues.length + ' line(s) must correspond to ' + 'the search'); }); return self.page.clearSearch(); }); }; /** * Checks if canceling a remove action is working correctly. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using page addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkCancelRemove(); * * @return {Promise} Promise resolving when cancel is checked */ TableAssert.prototype.checkCancelRemove = function() { var self = this; var name = 'test cancel'; var lines; return browser.waitForAngular().then(function() { // Create line self.helper.addEntitiesAuto(name, 1).then(function(addedLines) { lines = addedLines; self.page.refresh(); }); // Perform remove action and cancel it self.page.performAction(name + ' 0', self.page.translations.CORE.UI.REMOVE); browser.wait(self.page.EC.visibilityOf(self.page.dialogElement), 1000, 'Missing confirmation dialog'); self.page.cancelAction(); return browser.waitForAngular().then(function() { // Removes lines self.helper.removeEntities(lines); return self.page.refresh(); }); }); }; /** * Checks if selecting lines works. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using page addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkLinesSelection(); * * @param {String} nameProperty The property holding the name of the entity * @return {Promise} Promise resolving when selection have been checked */ TableAssert.prototype.checkLinesSelection = function(nameProperty) { var self = this; var name = 'test lines selection'; var lines; return browser.waitForAngular().then(function() { // Create lines self.helper.addEntitiesAuto(name, 2).then(function(addedLines) { self.page.refresh(); lines = addedLines; }).then(function() { // Search for those lines return self.page.search({query: name}); }).then(function() { // Select all lines using global checkbox browserExt.click(self.page.selectAllElement); // Check that all lines are selected lines.forEach(function(line) { assert.eventually.ok(self.page.isSelectedLine(line[nameProperty || 'name'])); }); // Check that action button is displayed assert.eventually.ok(self.page.actionsButtonElement.isPresent()); // Unselect all lines using global checkbox browserExt.click(self.page.selectAllElement); // Select lines one by one lines.forEach(function(line) { self.page.selectLine(line[nameProperty || 'name']); }); // Check that global checkbox is selected assert.eventually.ok(browserExt.getProperty(self.page.selectAllElement, 'checked')); // Check that action button is displayed assert.eventually.ok(self.page.actionsButtonElement.isPresent()); // Deselect one line self.page.deselectLine(lines[0][nameProperty || 'name']); // Check that global checkbox is not selected assert.eventually.notOk(browserExt.getProperty(self.page.selectAllElement, 'checked')); // Check that action button is displayed assert.eventually.ok(self.page.actionsButtonElement.isPresent()); // Deselect all lines lines.forEach(function(line) { self.page.deselectLine(line[nameProperty || 'name']); }); // Check that global checkbox is not selected assert.eventually.notOk(browserExt.getProperty(self.page.selectAllElement, 'checked')); // Check that action button is not displayed assert.eventually.notOk(self.page.actionsButtonElement.isPresent()); }).then(function() { // Removes lines self.helper.removeEntities(lines); return self.page.refresh(); }); }); }; /** * Checks that line actions and global actions are the same. * * You don't need to add lines to the table before calling this method. Necessary lines are automatically added * and then removed using page addEntitiesAuto / removeEntities methods. * * @example * // With MyTablePage extending TablePage * var page = new MyTablePage(); * var helper = new MyHelper(new MyProvider()); * var tableAssert = new TableAssert(page, helper); * tableAssert.checkActions(['Action 1', 'Action 2']); * * @param {Array} expectedActions Expected actions * @return {Promise} Promise resolving when actions have been checked */ TableAssert.prototype.checkActions = function(expectedActions) { var self = this; var name = 'test actions'; var lines; return browser.waitForAngular().then(function() { // Create lines self.helper.addEntitiesAuto(name, 2).then(function(addedLines) { self.page.refresh(); lines = addedLines; }).then(function() { // Search for those lines return self.page.search({query: name}); }).then(function() { // Select all lines using global checkbox browserExt.click(self.page.selectAllElement); // Validate line actions lines.forEach(function(line) { assert.eventually.sameMembers(self.page.getLineActions(line.name), expectedActions); }); // Validate global actions assert.eventually.sameMembers(self.page.getGlobalActions(), expectedActions); }).then(function() { // Removes lines self.helper.removeEntities(lines); return self.page.refresh(); }); }); };