diff --git a/e2e/content-services/tree_view_component.e2e.ts b/e2e/content-services/tree_view_component.e2e.ts new file mode 100644 index 0000000000..ee8330733d --- /dev/null +++ b/e2e/content-services/tree_view_component.e2e.ts @@ -0,0 +1,139 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { LoginPage } from '../pages/adf/loginPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { TreeViewPage } from '../pages/adf/content_services/treeViewPage'; + +import AcsUserModel = require('../models/ACS/acsUserModel'); + +import TestConfig = require('../test.config'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from '../actions/ACS/upload.actions'; + +describe('Tree View Component', () => { + + const loginPage = new LoginPage(); + const navigationBarPage = new NavigationBarPage(); + const treeViewPage = new TreeViewPage(); + + let acsUser = new AcsUserModel(); + let uploadActions = new UploadActions(); + + let treeFolder, secondTreeFolder, thirdTreeFolder; + + let nodeNames = { + folder: 'Folder1', + secondFolder: 'Folder2', + thirdFolder: 'Folder3', + parentFolder: '-my-', + document: 'MyFile' + }; + + beforeAll(async (done) => { + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + treeFolder = await this.alfrescoJsApi.nodes.addNode(nodeNames.parentFolder, {name: nodeNames.folder, nodeType: 'cm:folder'}); + secondTreeFolder = await this.alfrescoJsApi.nodes.addNode(nodeNames.parentFolder, {name: nodeNames.secondFolder, nodeType: 'cm:folder'}); + thirdTreeFolder = await this.alfrescoJsApi.nodes.addNode(secondTreeFolder.entry.id, {name: nodeNames.thirdFolder, nodeType: 'cm:folder'}); + await this.alfrescoJsApi.nodes.addNode(thirdTreeFolder.entry.id, {name: nodeNames.document, nodeType: 'cm:content'}); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + navigationBarPage.clickTreeViewButton(); + + done(); + }); + + afterAll(async (done) => { + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, treeFolder.entry.id); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, secondTreeFolder.entry.id); + + done(); + }); + + it('[C289972] Should be able to show folders and sub-folders of a node as a tree view', () => { + treeViewPage.checkTreeViewTitleIsDisplayed(); + + expect(treeViewPage.getNodeId()).toEqual(nodeNames.parentFolder); + + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.folder); + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.secondFolder); + + treeViewPage.clickNode(nodeNames.secondFolder); + + treeViewPage.checkClickedNodeName(nodeNames.secondFolder); + treeViewPage.checkNodeIsDisplayedAsOpen(nodeNames.secondFolder); + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.thirdFolder); + + treeViewPage.clickNode(nodeNames.thirdFolder); + + treeViewPage.checkClickedNodeName(nodeNames.thirdFolder); + treeViewPage.checkNodeIsDisplayedAsOpen(nodeNames.thirdFolder); + + treeViewPage.clickNode(nodeNames.secondFolder); + + treeViewPage.checkClickedNodeName(nodeNames.secondFolder); + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.secondFolder); + treeViewPage.checkNodeIsNotDisplayed(nodeNames.thirdFolder); + }); + + it('[C289973] Should be able to change the default nodeId', () => { + treeViewPage.clearNodeIdInput(); + + treeViewPage.checkNoNodeIdMessageIsDisplayed(); + treeViewPage.addNodeId(secondTreeFolder.entry.id); + + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.thirdFolder); + + treeViewPage.addNodeId('ThisIdDoesNotExist'); + treeViewPage.checkErrorMessageIsDisplayed(); + + treeViewPage.addNodeId(nodeNames.parentFolder); + + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.folder); + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.secondFolder); + + treeViewPage.clickNode(nodeNames.secondFolder); + + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.thirdFolder); + }); + + it('[C290071] Should not be able to display files', () => { + treeViewPage.addNodeId(secondTreeFolder.entry.id); + + treeViewPage.checkNodeIsDisplayedAsClosed(nodeNames.thirdFolder); + + treeViewPage.clickNode(nodeNames.thirdFolder); + + expect(treeViewPage.getTotalNodes()).toEqual(1); + }); + +}); diff --git a/e2e/pages/adf/content_services/treeViewPage.ts b/e2e/pages/adf/content_services/treeViewPage.ts new file mode 100644 index 0000000000..0ec34ebe68 --- /dev/null +++ b/e2e/pages/adf/content_services/treeViewPage.ts @@ -0,0 +1,92 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Util = require('../../../util/util'); +import { element, by, protractor } from 'protractor'; + +export class TreeViewPage { + + treeViewTitle = element(by.cssContainingText('app-tree-view div', 'TREE VIEW TEST')); + nodeIdInput = element(by.css('input[placeholder="Node Id"]')); + noNodeMessage = element(by.id('adf-tree-view-missing-node')); + nodesOnPage = element.all(by.css('mat-tree-node')); + + checkTreeViewTitleIsDisplayed() { + return Util.waitUntilElementIsVisible(this.treeViewTitle); + } + + getNodeId() { + Util.waitUntilElementIsVisible(this.nodeIdInput); + return this.nodeIdInput.getAttribute('value'); + } + + clickNode(nodeName) { + let node = element(by.css('mat-tree-node[id="' + nodeName + '-tree-child-node"] button')); + Util.waitUntilElementIsClickable(node); + return node.click(); + } + + checkNodeIsDisplayedAsClosed(nodeName) { + let node = element(by.css('mat-tree-node[id="' + nodeName + '-tree-child-node"][aria-expanded="false"]')); + return Util.waitUntilElementIsVisible(node); + } + + checkNodeIsDisplayedAsOpen(nodeName) { + let node = element(by.css('mat-tree-node[id="' + nodeName + '-tree-child-node"][aria-expanded="true"]')); + return Util.waitUntilElementIsVisible(node); + } + + checkClickedNodeName(nodeName) { + let clickedNode = element(by.cssContainingText('span', ' CLICKED NODE: ' + nodeName + '')); + return Util.waitUntilElementIsVisible(clickedNode); + } + + checkNodeIsNotDisplayed(nodeName) { + let node = element(by.id('' + nodeName + '-tree-child-node')); + return Util.waitUntilElementIsNotVisible(node); + } + + clearNodeIdInput() { + Util.waitUntilElementIsVisible(this.nodeIdInput); + this.nodeIdInput.getAttribute('value').then((value) => { + for (let i = value.length; i >= 0; i--) { + this.nodeIdInput.sendKeys(protractor.Key.BACK_SPACE); + } + }); + } + + checkNoNodeIdMessageIsDisplayed() { + return Util.waitUntilElementIsVisible(this.noNodeMessage); + } + + addNodeId(nodeId) { + Util.waitUntilElementIsVisible(this.nodeIdInput); + this.nodeIdInput.click(); + this.nodeIdInput.clear(); + this.nodeIdInput.sendKeys(nodeId + ' '); + this.nodeIdInput.sendKeys(protractor.Key.BACK_SPACE); + } + + checkErrorMessageIsDisplayed() { + let clickedNode = element(by.cssContainingText('span', 'An Error Occurred ')); + return Util.waitUntilElementIsVisible(clickedNode); + } + + getTotalNodes() { + return this.nodesOnPage.count(); + } +} diff --git a/e2e/pages/adf/navigationBarPage.ts b/e2e/pages/adf/navigationBarPage.ts index 01840e4a0c..c557111c81 100644 --- a/e2e/pages/adf/navigationBarPage.ts +++ b/e2e/pages/adf/navigationBarPage.ts @@ -17,7 +17,7 @@ import Util = require('../../util/util'); import TestConfig = require('../../test.config'); -import { element, by } from 'protractor'; +import { element, by, browser } from 'protractor'; import { ProcessServicesPage } from './process_services/processServicesPage'; import { AppListCloudComponent } from './process_cloud/appListCloudComponent'; @@ -40,6 +40,7 @@ export class NavigationBarPage { headerDataButton = element(by.css('a[data-automation-id="Header Data"]')); menuButton = element(by.css('button[data-automation-id="adf-menu-icon"]')); formButton = element(by.css('a[data-automation-id="Form"]')); + treeViewButton = element(by.css('a[data-automation-id="Tree View"]')); clickContentServicesButton() { Util.waitUntilElementIsVisible(this.contentServicesButton); @@ -157,8 +158,8 @@ export class NavigationBarPage { return this.formButton.click(); }; - checkLogoTooltip(logoTooltip) { - let logoTooltip = element(by.css('a[title="' + logoTooltip + '"]')); + checkLogoTooltip(logoTooltipTitle) { + let logoTooltip = element(by.css('a[title="' + logoTooltipTitle + '"]')); Util.waitUntilElementIsVisible(logoTooltip); } @@ -174,4 +175,9 @@ export class NavigationBarPage { checkContentServicesButtonIsDisplayed() { Util.waitUntilElementIsVisible(this.contentServicesButton); } + + clickTreeViewButton() { + Util.waitUntilElementIsVisible(this.treeViewButton); + this.treeViewButton.click(); + } }