mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-12 17:04:57 +00:00
AAE-1841 - added delete directive test (#5547)
* AAE-1841 - start adding e2e for delete directive * AAE-1841 - added delete directive test * AAE-1841 - fixed PR review
This commit is contained in:
parent
d720d36670
commit
ec689cad3f
@ -113,7 +113,9 @@
|
||||
<mat-icon>get_app</mat-icon>
|
||||
</button>
|
||||
<button mat-icon-button
|
||||
data-automation-id="delete-toolbar-button"
|
||||
adf-check-allowable-operation="delete"
|
||||
permanent=true
|
||||
[adf-nodes]="documentList.selection"
|
||||
title="{{ 'DOCUMENT_LIST.TOOLBAR.DELETE' | translate }}"
|
||||
(delete)="onDeleteActionSuccess($event)"
|
||||
|
270
e2e/content-services/directives/delete-directive.e2e.ts
Normal file
270
e2e/content-services/directives/delete-directive.e2e.ts
Normal file
@ -0,0 +1,270 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 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 { ContentServicesPage } from '../../pages/adf/content-services.page';
|
||||
import { AcsUserModel } from '../../models/ACS/acs-user.model';
|
||||
import { FileModel } from '../../models/ACS/file.model';
|
||||
import { LoginPage, UploadActions, PaginationPage, StringUtil, PermissionActions } from '@alfresco/adf-testing';
|
||||
import { browser } from 'protractor';
|
||||
import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
|
||||
import { FolderModel } from '../../models/ACS/folder.model';
|
||||
|
||||
describe('Delete Directive', () => {
|
||||
|
||||
this.alfrescoJsApi = new AlfrescoApi({
|
||||
provider: 'ECM',
|
||||
hostEcm: browser.params.testConfig.adf_acs.host
|
||||
});
|
||||
|
||||
const loginPage = new LoginPage();
|
||||
const contentServicesPage = new ContentServicesPage();
|
||||
const paginationPage = new PaginationPage();
|
||||
const contentListPage = contentServicesPage.getDocumentList();
|
||||
const acsUser = new AcsUserModel();
|
||||
const secondAcsUser = new AcsUserModel();
|
||||
const uploadActions = new UploadActions(this.alfrescoJsApi);
|
||||
const permissionActions = new PermissionActions(this.alfrescoJsApi);
|
||||
let baseFolderUploaded;
|
||||
|
||||
const txtFileModel = new FileModel({
|
||||
name: browser.params.resources.Files.ADF_DOCUMENTS.TXT.file_name,
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.TXT.file_location
|
||||
});
|
||||
|
||||
const file0BytesModel = new FileModel({
|
||||
name: browser.params.resources.Files.ADF_DOCUMENTS.TXT_0B.file_name,
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.TXT_0B.file_location
|
||||
});
|
||||
|
||||
const pdfFileModel = new FileModel({
|
||||
name: browser.params.resources.Files.ADF_DOCUMENTS.PDF.file_name,
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.PDF.file_location
|
||||
});
|
||||
|
||||
const secondPdfFileModel = new FileModel({
|
||||
name: browser.params.resources.Files.ADF_DOCUMENTS.PDF_B.file_name,
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.PDF_B.file_location
|
||||
});
|
||||
|
||||
const pngFileModel = new FileModel({
|
||||
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name,
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_location
|
||||
});
|
||||
|
||||
const secondPngFileModel = new FileModel({
|
||||
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG_B.file_name,
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG_B.file_location
|
||||
});
|
||||
|
||||
const folderInfo = new FolderModel({
|
||||
name: 'myFolder',
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.TEXT_FOLDER.folder_location
|
||||
});
|
||||
|
||||
const folderSecond = new FolderModel({
|
||||
name: 'myrSecondFolder',
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.TEXT_FOLDER.folder_location
|
||||
});
|
||||
|
||||
const baseFolder = new FolderModel({
|
||||
name: 'BASE_FOLDER',
|
||||
location: browser.params.resources.Files.ADF_DOCUMENTS.TEXT_FOLDER.folder_location
|
||||
});
|
||||
|
||||
beforeAll(async () => {
|
||||
await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
|
||||
await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser);
|
||||
await this.alfrescoJsApi.core.peopleApi.addPerson(secondAcsUser);
|
||||
await this.alfrescoJsApi.login(acsUser.id, acsUser.password);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
baseFolderUploaded = await uploadActions.createFolder(
|
||||
baseFolder.name,
|
||||
'-my-'
|
||||
);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await uploadActions.deleteFileOrFolder(baseFolderUploaded.entry.id);
|
||||
});
|
||||
|
||||
describe('Handling multiselection', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
await uploadActions.uploadFile(txtFileModel.location, txtFileModel.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(file0BytesModel.location, file0BytesModel.name, baseFolderUploaded.entry.id);
|
||||
const textFolderUploaded = await uploadActions.createFolder(folderInfo.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFolder(folderInfo.location, textFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, textFolderUploaded.entry.id);
|
||||
await uploadActions.createFolder(folderSecond.name, baseFolderUploaded.entry.id);
|
||||
|
||||
await loginPage.loginToContentServicesUsingUserModel(acsUser);
|
||||
await browser.get(`${browser.baseUrl}/files/${baseFolderUploaded.entry.id}`);
|
||||
await contentServicesPage.waitForTableBody();
|
||||
});
|
||||
|
||||
it('[C260188] - Delete multiple content', async () => {
|
||||
await contentListPage.selectRowWithKeyboard(txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.selectRowWithKeyboard(file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', file0BytesModel.name);
|
||||
await contentListPage.selectRowWithKeyboard(folderSecond.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderSecond.name);
|
||||
await contentListPage.selectRowWithKeyboard(folderInfo.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderInfo.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderSecond.name);
|
||||
await contentServicesPage.clickDeleteOnToolbar();
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', folderInfo.name);
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', txtFileModel.name);
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', folderSecond.name);
|
||||
});
|
||||
|
||||
it('[C260192] - Delete file and folder with hierarchy', async () => {
|
||||
await contentListPage.selectRowWithKeyboard(txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.selectRowWithKeyboard(folderInfo.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderInfo.name);
|
||||
await contentServicesPage.clickDeleteOnToolbar();
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', txtFileModel.name);
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', folderInfo.name);
|
||||
});
|
||||
|
||||
it('[C260193] - Delete file when different selections are set', async () => {
|
||||
await contentServicesPage.chooseSelectionMode('None');
|
||||
await contentListPage.selectRow(txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsNotSelected('Display name', txtFileModel.name);
|
||||
await contentServicesPage.checkToolbarDeleteIsDisabled();
|
||||
|
||||
await contentServicesPage.chooseSelectionMode('Single');
|
||||
await contentListPage.selectRow(txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.selectRowWithKeyboard(folderInfo.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderInfo.name);
|
||||
await contentListPage.dataTable.checkRowIsNotSelected('Display name', txtFileModel.name);
|
||||
await contentServicesPage.clickDeleteOnToolbar();
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', folderInfo.name);
|
||||
await contentListPage.dataTable.checkContentIsDisplayed('Display name', txtFileModel.name);
|
||||
|
||||
await contentServicesPage.chooseSelectionMode('Multiple');
|
||||
await contentListPage.selectRow(txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await contentListPage.selectRowWithKeyboard(file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', file0BytesModel.name);
|
||||
await contentServicesPage.clickDeleteOnToolbar();
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', txtFileModel.name);
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', file0BytesModel.name);
|
||||
});
|
||||
});
|
||||
|
||||
describe('When selection on multiple pages', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
await uploadActions.uploadFile( txtFileModel.location, txtFileModel.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(file0BytesModel.location, file0BytesModel.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(secondPdfFileModel.location, secondPdfFileModel.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, baseFolderUploaded.entry.id);
|
||||
await uploadActions.uploadFile(secondPngFileModel.location, secondPngFileModel.name, baseFolderUploaded.entry.id);
|
||||
|
||||
await loginPage.loginToContentServicesUsingUserModel(acsUser);
|
||||
await browser.get(`${browser.baseUrl}/files/${baseFolderUploaded.entry.id}`);
|
||||
await contentServicesPage.waitForTableBody();
|
||||
});
|
||||
|
||||
it('[C260191] - Delete content selected from different pages', async () => {
|
||||
await contentServicesPage.sortByName('ASC');
|
||||
await paginationPage.selectItemsPerPage('5');
|
||||
|
||||
await contentListPage.selectRowWithKeyboard(txtFileModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', txtFileModel.name);
|
||||
await paginationPage.clickOnNextPage();
|
||||
await contentListPage.selectRowWithKeyboard(file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', file0BytesModel.name);
|
||||
await contentServicesPage.clickDeleteOnToolbar();
|
||||
await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', file0BytesModel.name);
|
||||
await contentListPage.dataTable.checkContentIsDisplayed('Display name', txtFileModel.name);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('when user does not have `delete` permission', () => {
|
||||
|
||||
let createdSite = null;
|
||||
let fileTxt, filePdf, folderA, folderB;
|
||||
|
||||
beforeAll(async () => {
|
||||
createdSite = await this.alfrescoJsApi.core.sitesApi.createSite({
|
||||
title: StringUtil.generateRandomString(20).toLowerCase(),
|
||||
visibility: 'PRIVATE'
|
||||
});
|
||||
|
||||
await this.alfrescoJsApi.core.sitesApi.addSiteMember(createdSite.entry.id, {
|
||||
id: secondAcsUser.id,
|
||||
role: 'SiteCollaborator'
|
||||
});
|
||||
|
||||
fileTxt = await uploadActions.uploadFile(txtFileModel.location, txtFileModel.name, createdSite.entry.guid);
|
||||
filePdf = await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, createdSite.entry.guid);
|
||||
folderA = await uploadActions.createFolder(StringUtil.generateRandomString(5), createdSite.entry.guid);
|
||||
folderB = await uploadActions.createFolder(StringUtil.generateRandomString(5), createdSite.entry.guid);
|
||||
|
||||
await permissionActions.addRoleForUser(secondAcsUser.getId(), 'SiteManager', folderA);
|
||||
await permissionActions.addRoleForUser(secondAcsUser.getId(), 'SiteManager', fileTxt);
|
||||
await permissionActions.addRoleForUser(secondAcsUser.getId(), 'SiteConsumer', folderB);
|
||||
await permissionActions.addRoleForUser(secondAcsUser.getId(), 'SiteConsumer', filePdf);
|
||||
|
||||
await permissionActions.disableInheritedPermissionsForNode(folderA.entry.id);
|
||||
await permissionActions.disableInheritedPermissionsForNode(folderB.entry.id);
|
||||
await permissionActions.disableInheritedPermissionsForNode(fileTxt.entry.id);
|
||||
await permissionActions.disableInheritedPermissionsForNode(filePdf.entry.id);
|
||||
|
||||
await loginPage.loginToContentServicesUsingUserModel(secondAcsUser);
|
||||
await browser.get(`${browser.baseUrl}/files/${createdSite.entry.guid}`);
|
||||
await contentServicesPage.waitForTableBody();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
try {
|
||||
await this.alfrescoJsApi.core.sitesApi.deleteSite(
|
||||
createdSite.entry.id
|
||||
);
|
||||
} catch (error) {}
|
||||
});
|
||||
|
||||
it('[C216426] - Delete file without delete permissions', async () => {
|
||||
await contentListPage.selectRowWithKeyboard(filePdf.entry.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', filePdf.entry.name);
|
||||
await contentServicesPage.checkToolbarDeleteIsDisabled();
|
||||
await contentListPage.selectRowWithKeyboard(folderB.entry.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderB.entry.name);
|
||||
await contentServicesPage.checkToolbarDeleteIsDisabled();
|
||||
await contentListPage.selectRowWithKeyboard(folderA.entry.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', folderA.entry.name);
|
||||
await contentServicesPage.checkToolbarDeleteIsDisabled();
|
||||
await contentListPage.selectRowWithKeyboard(fileTxt.entry.name);
|
||||
await contentListPage.dataTable.checkRowIsSelected('Display name', fileTxt.entry.name);
|
||||
await contentServicesPage.checkToolbarDeleteIsDisabled();
|
||||
});
|
||||
});
|
||||
});
|
@ -47,6 +47,7 @@ export class ContentServicesPage {
|
||||
currentFolder: ElementFinder = element(by.css('div[class*="adf-breadcrumb-item adf-active"] div'));
|
||||
createFolderButton: ElementFinder = element(by.css('button[data-automation-id="create-new-folder"]'));
|
||||
editFolderButton: ElementFinder = element(by.css('button[data-automation-id="edit-folder"]'));
|
||||
deleteNodesButton: ElementFinder = element(by.css('button[data-automation-id="delete-toolbar-button"]'));
|
||||
createLibraryButton: ElementFinder = element(by.css('button[data-automation-id="create-new-library"]'));
|
||||
activeBreadcrumb: ElementFinder = element(by.css('div[class*="active"]'));
|
||||
tooltip = by.css('div[class*="--text adf-full-width"] span');
|
||||
@ -137,6 +138,14 @@ export class ContentServicesPage {
|
||||
await BrowserActions.click(this.deleteContentElement);
|
||||
}
|
||||
|
||||
async clickDeleteOnToolbar(): Promise<void> {
|
||||
await BrowserActions.click(this.deleteNodesButton);
|
||||
}
|
||||
|
||||
async checkToolbarDeleteIsDisabled(): Promise<void> {
|
||||
await BrowserActions.checkIsDisabled(this.deleteNodesButton);
|
||||
}
|
||||
|
||||
async metadataContent(content): Promise<void> {
|
||||
await this.contentList.clickOnActionMenu(content);
|
||||
await this.waitForContentOptions();
|
||||
|
@ -22,7 +22,7 @@ import { NodeEntry, Node, DeletedNodeEntity, DeletedNode } from '@alfresco/js-ap
|
||||
import { Observable, forkJoin, from, of } from 'rxjs';
|
||||
import { AlfrescoApiService } from '../services/alfresco-api.service';
|
||||
import { TranslationService } from '../services/translation.service';
|
||||
import { map, catchError } from 'rxjs/operators';
|
||||
import { map, catchError, retry } from 'rxjs/operators';
|
||||
|
||||
interface ProcessedNodeData {
|
||||
entry: Node | DeletedNode;
|
||||
@ -119,6 +119,7 @@ export class NodeDeleteDirective implements OnChanges {
|
||||
}
|
||||
|
||||
return from(promise).pipe(
|
||||
retry(3),
|
||||
map(() => ({
|
||||
entry: node.entry,
|
||||
status: 1
|
||||
|
@ -0,0 +1,52 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 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 { AlfrescoApiCompatibility as AlfrescoApi, NodeEntry, NodeBodyUpdate } from '@alfresco/js-api';
|
||||
|
||||
export class PermissionActions {
|
||||
alfrescoJsApi: AlfrescoApi = null;
|
||||
|
||||
constructor(alfrescoJsApi: AlfrescoApi) {
|
||||
this.alfrescoJsApi = alfrescoJsApi;
|
||||
}
|
||||
|
||||
addRoleForUser(userName: string, role: string, nodeToUpdate: NodeEntry): Promise<NodeEntry> {
|
||||
const payload: NodeBodyUpdate = {
|
||||
permissions: {
|
||||
locallySet: [
|
||||
{
|
||||
accessStatus: 'ALLOWED',
|
||||
name: role,
|
||||
authorityId: userName
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
return this.alfrescoJsApi.nodes.updateNode(nodeToUpdate.entry.id, payload);
|
||||
}
|
||||
|
||||
disableInheritedPermissionsForNode(nodeId: string): Promise<NodeEntry> {
|
||||
const nodeBody = { permissions: { isInheritanceEnabled: false } };
|
||||
return this.alfrescoJsApi.nodes.updateNode(nodeId, nodeBody, { include: ['permissions'] });
|
||||
}
|
||||
|
||||
enableInheritedPermissionsForNode(nodeId: string): Promise<NodeEntry> {
|
||||
const nodeBody = { permissions: { isInheritanceEnabled: true } };
|
||||
return this.alfrescoJsApi.nodes.updateNode(nodeId, nodeBody, { include: ['permissions'] });
|
||||
}
|
||||
|
||||
}
|
@ -16,3 +16,4 @@
|
||||
*/
|
||||
|
||||
export * from './upload.actions';
|
||||
export * from './permission.actions';
|
||||
|
@ -57,6 +57,10 @@ export class DocumentListPage {
|
||||
await this.dataTable.selectRow('Display name', nodeName);
|
||||
}
|
||||
|
||||
async selectRowWithKeyboard(nodeName: string): Promise<void> {
|
||||
await this.dataTable.selectRowWithKeyboard('Display name', nodeName);
|
||||
}
|
||||
|
||||
async rightClickOnRow(nodeName: string): Promise<void> {
|
||||
await this.dataTable.rightClickOnRow('Display name', nodeName);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user