diff --git a/e2e/content-services/document_list_actions.e2e.ts b/e2e/content-services/document_list_actions.e2e.ts new file mode 100644 index 0000000000..6577a39a9f --- /dev/null +++ b/e2e/content-services/document_list_actions.e2e.ts @@ -0,0 +1,207 @@ +/*! + * @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 { browser } from 'protractor'; +import LoginPage = require('../pages/adf/loginPage'); +import ContentServicesPage = require('../pages/adf/contentServicesPage'); +import ContentListPage = require('../pages/adf/dialog/contentList'); +import AcsUserModel = require('../models/ACS/acsUserModel'); +import TestConfig = require('../test.config'); +import resources = require('../util/resources'); +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from '../actions/ACS/upload.actions'; +import FileModel = require('../models/ACS/fileModel'); +import Util = require('../util/util'); + +describe('Document List Component - Actions', () => { + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + let contentListPage = new ContentListPage(); + let uploadedFolder, secondUploadedFolder; + let uploadActions = new UploadActions(); + let acsUser = null; + let testFileNode; + + let pdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF.file_location + }); + let testFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.TEST.file_name, + 'location': resources.Files.ADF_DOCUMENTS.TEST.file_location + }); + + beforeAll(() => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + }); + + afterEach(async (done) => { + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + if (uploadedFolder) { + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, uploadedFolder.entry.id); + uploadedFolder = null; + } + if (testFileNode) { + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, testFileNode.entry.id); + testFileNode = null; + } + done(); + }); + + describe('File Actions', () => { + + let pdfUploadedNode; + let folderName; + + beforeEach(async (done) => { + acsUser = new AcsUserModel(); + folderName = `TATSUMAKY_${Util.generateRandomString(5)}_SENPOUKYAKU`; + 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); + pdfUploadedNode = await uploadActions.uploadFile(this.alfrescoJsApi, pdfFileModel.location, pdfFileModel.name, '-my-'); + testFileNode = await uploadActions.uploadFile(this.alfrescoJsApi, testFileModel.location, testFileModel.name, '-my-'); + uploadedFolder = await uploadActions.uploadFolder(this.alfrescoJsApi, folderName, '-my-'); + done(); + }); + + it('[C213257] - Copy File', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.rightClickOnRowNamed(pdfUploadedNode.entry.name); + contentListPage.pressContextMenuActionNamed('Copy'); + contentServicesPage.typeIntoNodeSelectorSearchField(folderName); + contentServicesPage.clickContentNodeSelectorResult(folderName); + contentServicesPage.clickCopyButton(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.checkContentIsDisplayed(pdfFileModel.name); + browser.get(TestConfig.adf.url + '/files/' + uploadedFolder.entry.id); + contentServicesPage.checkAcsContainer(); + contentServicesPage.checkContentIsDisplayed(pdfFileModel.name); + }); + + it('[C280561] - Delete File', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.deleteContent(pdfFileModel.name); + contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); + pdfUploadedNode = null; + }); + + it('[C280562] - Multiple Files Delete - Dropdown Menu', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.clickRowToSelect(pdfFileModel.name); + contentListPage.clickRowToSelect(testFileModel.name); + contentListPage.deleteContent(pdfFileModel.name); + contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); + contentListPage.checkContentIsDisplayed(testFileModel.name); + }); + + it('[C280565] - Delete - Right Click', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.rightClickOnRowNamed(pdfFileModel.name); + contentListPage.pressContextMenuActionNamed('Delete'); + contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); + pdfUploadedNode = null; + }); + + it('[C280566] - Context Menu - Actions for file', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.rightClickOnRowNamed(pdfFileModel.name); + contentListPage.checkContextActionIsVisible('Download'); + contentListPage.checkContextActionIsVisible('Copy'); + contentListPage.checkContextActionIsVisible('Move'); + contentListPage.checkContextActionIsVisible('Delete'); + contentListPage.checkContextActionIsVisible('Info'); + contentListPage.checkContextActionIsVisible('Manage versions'); + contentListPage.checkContextActionIsVisible('Permission'); + contentListPage.checkContextActionIsVisible('Lock'); + }); + + it('[C280567] - Delete - Right click after multiselection of files', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.clickRowToSelect(pdfFileModel.name); + contentListPage.clickRowToSelect(testFileModel.name); + contentListPage.rightClickOnRowNamed(pdfFileModel.name); + contentListPage.pressContextMenuActionNamed('Delete'); + contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); + contentListPage.checkContentIsDisplayed(testFileModel.name); + }); + + }); + + describe('Folder Actions', () => { + + let folderName,secondfolderName; + + beforeEach(async (done) => { + acsUser = new AcsUserModel(); + folderName = `TATSUMAKY_${Util.generateRandomString(5)}_SENPOUKYAKU`; + secondfolderName = `TATSUMAKY_${Util.generateRandomString(5)}_SENPOUKYAKU`; + 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); + uploadedFolder = await uploadActions.uploadFolder(this.alfrescoJsApi, folderName, '-my-'); + secondUploadedFolder = await uploadActions.uploadFolder(this.alfrescoJsApi, secondfolderName, '-my-'); + done(); + }); + + it('[C260123] - Delete - Dropdown Menu', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.deleteContent(folderName); + contentListPage.checkContentIsNotDisplayed(folderName); + uploadedFolder = null; + }); + + it('[C280566] - Context Menu - Actions for folder', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.rightClickOnRowNamed(folderName); + contentListPage.checkContextActionIsVisible('Download'); + contentListPage.checkContextActionIsVisible('Copy'); + contentListPage.checkContextActionIsVisible('Move'); + contentListPage.checkContextActionIsVisible('Delete'); + contentListPage.checkContextActionIsVisible('Info'); + contentListPage.checkContextActionIsVisible('Permission'); + }); + + it('[C260138] - Copy - folder', () => { + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentListPage.copyContent(folderName); + contentServicesPage.typeIntoNodeSelectorSearchField(secondfolderName); + contentServicesPage.clickContentNodeSelectorResult(secondfolderName); + contentServicesPage.clickCopyButton(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.checkContentIsDisplayed(folderName); + browser.get(TestConfig.adf.url + '/files/' + secondUploadedFolder.entry.id); + contentServicesPage.checkAcsContainer(); + contentServicesPage.checkContentIsDisplayed(folderName); + }); + + }); + +}); diff --git a/e2e/content-services/document_list_component.e2e.ts b/e2e/content-services/document_list_component.e2e.ts index 725ff04c74..7a604fdce4 100644 --- a/e2e/content-services/document_list_component.e2e.ts +++ b/e2e/content-services/document_list_component.e2e.ts @@ -16,7 +16,6 @@ */ import { browser } from 'protractor'; - import LoginPage = require('../pages/adf/loginPage'); import ContentServicesPage = require('../pages/adf/contentServicesPage'); import NavigationBarPage = require('../pages/adf/navigationBarPage'); @@ -29,7 +28,6 @@ import { UploadActions } from '../actions/ACS/upload.actions'; import ErrorPage = require('../pages/adf/errorPage'); import FileModel = require('../models/ACS/fileModel'); import moment from 'moment-es6'; -import { browser } from '../../node_modules/protractor'; describe('Document List Component', () => { @@ -124,7 +122,10 @@ describe('Document List Component', () => { describe('Custom Column', () => { let folderName; - let pdfFileModel = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + let pdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF.file_location + }); let docxFileModel = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.DOCX.file_name, 'location': resources.Files.ADF_DOCUMENTS.DOCX.file_location diff --git a/e2e/pages/adf/contentServicesPage.js b/e2e/pages/adf/contentServicesPage.js index f2db686558..1ffbdec307 100644 --- a/e2e/pages/adf/contentServicesPage.js +++ b/e2e/pages/adf/contentServicesPage.js @@ -56,6 +56,8 @@ var ContentServicesPage = function () { var emptyRecent = element(by.css(".adf-container-recent .empty-list__title")); var gridViewButton = element(by.css("button[data-automation-id='document-list-grid-view']")); var cardViewContainer = element(by.css("div.document-list-container div.adf-data-table-card")); + var copyButton = element(by.css('button[data-automation-id="content-node-selector-actions-choose"]')); + var searchInputElement = element(by.css('input[data-automation-id="content-node-selector-search-input"')); this.checkRecentFileToBeShowed = function () { Util.waitUntilElementIsVisible(recentFiles); @@ -580,6 +582,21 @@ var ContentServicesPage = function () { Util.waitUntilElementIsVisible(row); } + this.typeIntoNodeSelectorSearchField = function(text) { + Util.waitUntilElementIsVisible(searchInputElement); + searchInputElement.sendKeys(text); + } + + this.clickContentNodeSelectorResult = function(name){ + let resultElement = element(by.css(`div[data-automation-id="content-node-selector-content-list"] div[filename="${name}"`)); + Util.waitUntilElementIsVisible(resultElement); + resultElement.click(); + } + + this.clickCopyButton = function(){ + Util.waitUntilElementIsClickable(copyButton); + copyButton.click(); + } }; module.exports = ContentServicesPage; diff --git a/e2e/pages/adf/dialog/contentList.js b/e2e/pages/adf/dialog/contentList.js index b69ea8d2c6..0393252a73 100644 --- a/e2e/pages/adf/dialog/contentList.js +++ b/e2e/pages/adf/dialog/contentList.js @@ -316,5 +316,29 @@ var ContentList = function () { Util.waitUntilElementIsVisible(row.element(by.css("div[class*='--image'] img[alt*='" + extension + "']"))); }; + this.rightClickOnRowNamed = function(rowName) { + let row = this.getRowByRowName(rowName); + browser.actions().click(row, protractor.Button.RIGHT).perform(); + Util.waitUntilElementIsVisible(element(by.css('div.context-menu'))); + } + + this.checkContextActionIsVisible = function(actionName) { + let actionButton = element(by.css(`div.context-menu button[data-automation-id="context-${actionName}"`)); + Util.waitUntilElementIsVisible(actionButton); + Util.waitUntilElementIsClickable(actionButton); + return actionButton; + } + + this.pressContextMenuActionNamed = function(actionName) { + let actionButton = this.checkContextActionIsVisible(actionName); + actionButton.click(); + } + + this.clickRowToSelect = function(rowName) { + let row = this.getRowByRowName(rowName); + browser.actions().keyDown(protractor.Key.COMMAND).click(row).perform(); + this.checkRowIsSelected(rowName); + } + }; module.exports = ContentList; diff --git a/lib/core/context-menu/context-menu-holder.component.ts b/lib/core/context-menu/context-menu-holder.component.ts index 2af2a02418..ea0a175da6 100644 --- a/lib/core/context-menu/context-menu-holder.component.ts +++ b/lib/core/context-menu/context-menu-holder.component.ts @@ -32,6 +32,7 @@ import { ContextMenuService } from './context-menu.service';