From 90954f32ca16c912bbd4efc82c31ba3b8c1cac9d Mon Sep 17 00:00:00 2001 From: rodicasutu Date: Mon, 18 May 2020 18:33:39 +0300 Subject: [PATCH 1/4] updates according to https://github.com/Alfresco/rest-api-explorer/pull/78/files --- .../src/main/webapp/index.html | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html b/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html index 0a66c86a80..0162e8338f 100644 --- a/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html +++ b/rm-community/rm-community-rest-api-explorer/src/main/webapp/index.html @@ -37,11 +37,16 @@ - - + + + + + + - + + From 11aefccd4fc67fc0ecbbad273b79b09847f89bc2 Mon Sep 17 00:00:00 2001 From: rodicasutu Date: Tue, 19 May 2020 08:52:15 +0300 Subject: [PATCH 2/4] fix enterprise rest api test failure --- .../model/fileplancomponents/FilePlanComponentFields.java | 1 + .../model/recordcategory/RecordCategoryChildProperties.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java index 074604353f..fec6c5695f 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java @@ -58,6 +58,7 @@ public class FilePlanComponentFields public static final String PROPERTIES_RECORD_SEARCH_DISPOSITION_ACTION_NAME = "rma:recordSearchDispositionActionName"; public static final String PROPERTIES_RECORD_SEARCH_DISPOSITION_EVENTS_ELIGIBLE = "rma:recordSearchDispositionEventsEligible"; public static final String PROPERTIES_RECORD_SEARCH_DISPOSITION_INSTRUCTIONS = "rma:recordSearchDispositionInstructions"; + public static final String PROPERTIES_RECORD_SEARCH_DISPOSITION_EVENTS = "rma:recordSearchDispositionEvents"; public static final String PROPERTIES_DECLASSIFICATION_REVIEW_COMPLETED_BY = "rma:declassificationReviewCompletedBy"; public static final String PROPERTIES_DECLASSIFICATION_REVIEW_COMPLETED_AT = "rma:declassificationReviewCompletedAt"; diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/recordcategory/RecordCategoryChildProperties.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/recordcategory/RecordCategoryChildProperties.java index 1e83caecf9..64432087b0 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/recordcategory/RecordCategoryChildProperties.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/recordcategory/RecordCategoryChildProperties.java @@ -32,6 +32,7 @@ import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanCo import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_IS_CLOSED; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_LOCATION; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_OWNER; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RECORD_SEARCH_DISPOSITION_EVENTS; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RECORD_SEARCH_HAS_DISPOSITION_SCHEDULE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RECORD_SEARCH_DISPOSITION_PERIOD_EXPRESSION; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RECORD_SEARCH_DISPOSITION_AUTHORITY; @@ -132,6 +133,10 @@ public class RecordCategoryChildProperties extends TestModel @JsonProperty (PROPERTIES_RECORD_SEARCH_DISPOSITION_INSTRUCTIONS) private String recordSearchDispositionInstructions; + @JsonProperty (PROPERTIES_RECORD_SEARCH_DISPOSITION_EVENTS) + private Boolean recordSearchDispositionEvents; + @JsonProperty (PROPERTIES_OWNER) private Owner owner; + } From 5b8b2f36405a9074e300d124a7e4b00a58225d4a Mon Sep 17 00:00:00 2001 From: rodicasutu Date: Wed, 27 May 2020 16:44:22 +0300 Subject: [PATCH 3/4] tests for APPS-85 --- .../rm-automation-community-rest-api/pom.xml | 16 +- .../FilePlanComponentAspects.java | 3 + .../FilePlanComponentFields.java | 2 + .../model/record/RecordProperties.java | 8 + .../UnfiledContainerChildProperties.java | 8 + .../gscore/api/ActionsExecutionAPI.java | 27 ++ .../rm/community/base/BaseRMRestTest.java | 68 ++++ .../DeclareAndFileVersionAsRecordTests.java | 290 ++++++++++++++++++ 8 files changed, 408 insertions(+), 14 deletions(-) create mode 100644 rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java diff --git a/rm-automation/rm-automation-community-rest-api/pom.xml b/rm-automation/rm-automation-community-rest-api/pom.xml index 0a5b1d93e4..91271d9dfe 100644 --- a/rm-automation/rm-automation-community-rest-api/pom.xml +++ b/rm-automation/rm-automation-community-rest-api/pom.xml @@ -15,7 +15,7 @@ false alfresco-governance-services-community-share alfresco-governance-services-community-repo - 6.0.1.2 + 1.38 2.0.0 2.7.7 @@ -54,7 +54,7 @@ org.alfresco.tas - restapi-test + restapi ${tas.restapi.version} @@ -63,18 +63,6 @@ - - org.alfresco.tas - restapi-test - ${tas.restapi.version} - test-jar - - - com.fasterxml.jackson.core - jackson-databind - - - org.projectlombok lombok diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentAspects.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentAspects.java index 78fa8ebe49..32faaa8667 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentAspects.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentAspects.java @@ -56,4 +56,7 @@ public class FilePlanComponentAspects // retention schedule cut off aspect public static final String CUT_OFF_ASPECT = "rma:cutOff"; + + //declare version as record aspect + public static final String VERSION_AS_RECORD="rmv:versionRecord"; } diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java index fec6c5695f..d1978542fe 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/fileplancomponents/FilePlanComponentFields.java @@ -88,6 +88,8 @@ public class FilePlanComponentFields /** Electronic record properties */ public static final String PROPERTIES_VERSION_TYPE = "cm:versionType"; public static final String PROPERTIES_VERSION_LABEL = "cm:versionLabel"; + public static final String PROPERTIES_VERSIONED_NODEREF = "rmv:versionedNodeRef"; + public static final String PROPERTIES_RMV_VERSIONED = "rmv:versionLabel"; public static final String PROPERTIES_DATE_TIME_ORIGINAL = "exif:dateTimeOriginal"; public static final String PROPERTIES_EXPOSURE_TIME = "exif:exposureTime"; public static final String PROPERTIES_FLASH = "exif:flash"; diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/record/RecordProperties.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/record/RecordProperties.java index bb9bab1eca..d3480b9544 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/record/RecordProperties.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/record/RecordProperties.java @@ -65,11 +65,13 @@ import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanCo import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RESOLUTION_UNIT; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_REVIEW_AS_OF; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RMV_VERSIONED; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_ROOT_NODE_REF; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_SHELF; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_SOFTWARE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_STORAGE_LOCATION; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_TITLE; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_VERSIONED_NODEREF; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_VERSION_LABEL; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_VERSION_TYPE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_X_RESOLUTION; @@ -133,6 +135,12 @@ public class RecordProperties extends TestModel @JsonProperty (PROPERTIES_VERSION_LABEL) private String versionLabel; + @JsonProperty(PROPERTIES_VERSIONED_NODEREF) + private String versionedNodeRef; + + @JsonProperty (PROPERTIES_RMV_VERSIONED) + private String recordVersionLabel; + @JsonProperty (PROPERTIES_DATE_TIME_ORIGINAL) private String dateTimeOriginal; diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/unfiledcontainer/UnfiledContainerChildProperties.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/unfiledcontainer/UnfiledContainerChildProperties.java index 0c00fcd5fd..46178a07e4 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/unfiledcontainer/UnfiledContainerChildProperties.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/unfiledcontainer/UnfiledContainerChildProperties.java @@ -47,11 +47,13 @@ import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanCo import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_PIXEL_Y_DIMENSION; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RECORD_SEARCH_HAS_DISPOSITION_SCHEDULE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RESOLUTION_UNIT; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_RMV_VERSIONED; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_ROOT_NODE_REF; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_SHELF; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_SOFTWARE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_STORAGE_LOCATION; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_TITLE; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_VERSIONED_NODEREF; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_VERSION_LABEL; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_VERSION_TYPE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentFields.PROPERTIES_X_RESOLUTION; @@ -111,6 +113,12 @@ public class UnfiledContainerChildProperties extends TestModel @JsonProperty (PROPERTIES_VERSION_LABEL) private String versionLabel; + @JsonProperty(PROPERTIES_VERSIONED_NODEREF) + private String versionedNodeRef; + + @JsonProperty (PROPERTIES_RMV_VERSIONED) + private String recordVersionLabel; + @JsonProperty (PROPERTIES_DATE_TIME_ORIGINAL) private String dateTimeOriginal; diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/ActionsExecutionAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/ActionsExecutionAPI.java index 7a52305bf2..fdf5b74f90 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/ActionsExecutionAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/requests/gscore/api/ActionsExecutionAPI.java @@ -75,4 +75,31 @@ public class ActionsExecutionAPI extends RMModelRequest return getRmRestWrapper().withCoreAPI().usingActions() .executeAction(ActionsOnRule.DECLARE_AS_RECORD.getActionValue(), targetNode); } + + + /** + * Declares and file a document version as record to a record folder using v1 actions api + * + * @param targetNode the node on which the action is executed + * @param destinationPath the path to the record folder + * @throws Exception + */ + public JSONObject declareAndFileVersionAsRecord(RepoTestModel targetNode, String destinationPath) throws Exception + { + return getRmRestWrapper().withCoreAPI().usingActions() + .executeAction(ActionsOnRule.DECLARE_VERSION_AS_RECORD.getActionValue(), targetNode, + ImmutableMap.of("path", destinationPath)); + } + + /** + * Declares a document version as record using v1 actions api + * + * @param targetNode the node on which the action is executed + * @throws Exception + */ + public JSONObject declareVersionAsRecord(RepoTestModel targetNode) throws Exception + { + return getRmRestWrapper().withCoreAPI().usingActions() + .executeAction(ActionsOnRule.DECLARE_VERSION_AS_RECORD.getActionValue(), targetNode); + } } diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java index 59dacf4212..afd58ae54a 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/base/BaseRMRestTest.java @@ -32,6 +32,7 @@ import static org.alfresco.rest.rm.community.base.TestData.RECORD_CATEGORY_TITLE import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.FILE_PLAN_ALIAS; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAspects.ASPECTS_COMPLETED_RECORD; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAspects.VERSION_AS_RECORD; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.CONTENT_TYPE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.NON_ELECTRONIC_RECORD_TYPE; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.RECORD_CATEGORY_TYPE; @@ -879,4 +880,71 @@ public class BaseRMRestTest extends RestTest return false; } } + /** + * Helper method to verify if the document version is declared as record version in unfiled container + * + * @param testFile the file declared as record version + * @param version the document version + * @return true if matching record version is found in unfiled record container, false otherwise + */ + protected boolean isRecordVersionInUnfiledRecords(FileModel testFile, String version) + { + try + { + Utility.sleep(5000, 15000, + () -> { + UnfiledContainerChildEntry matchingRecord = getRestAPIFactory().getUnfiledContainersAPI() + .getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS, "include=properties,aspectNames") + .getEntries() + .stream() + .filter(e -> e.getEntry().getName().contains(testFile.getName().replace(".txt", "")) + && e.getEntry().getProperties().getVersionedNodeRef().equals(testFile.getNodeRefWithoutVersion()) + && e.getEntry().getProperties().getRecordVersionLabel().equalsIgnoreCase(version) + ) + .findFirst().get(); + + assertTrue(hasAspect(matchingRecord.getEntry().getId(), VERSION_AS_RECORD)); + }); + return true; + } + catch (AssertionError | Exception e) + { + return false; + } + } + /** + * Helper method to verify if the document version is declared as record version in a specific record folder + * + * @param testFile the file declared as record version + * @param recordFolder the record folder where the versioned record is filled + * @param version the document version + * @return true if matching record version is found in record folder, false otherwise + */ + protected boolean isRecordVersionInRecordFolder(FileModel testFile, RecordCategoryChild recordFolder, + String version) + { + try + { + Utility.sleep(5000, 15000, + () -> { + RecordFolderEntry matchingRecord = getRestAPIFactory().getRecordFolderAPI() + .getRecordFolderChildren(recordFolder.getId(),"include=properties,aspectNames") + .getEntries() + .stream() + .filter(e -> e.getEntry().getName().contains(testFile.getName().replace(".txt", "")) + && e.getEntry().getProperties().getVersionedNodeRef().equals(testFile.getNodeRefWithoutVersion()) + && e.getEntry().getProperties().getRecordVersionLabel().equalsIgnoreCase(version) + ) + .findFirst().get(); + + assertTrue(hasAspect(matchingRecord.getEntry().getId(), VERSION_AS_RECORD)); + }); + return true; + } + catch (AssertionError | Exception e) + { + return false; + } + } + } diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java new file mode 100644 index 0000000000..220ba6d42e --- /dev/null +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java @@ -0,0 +1,290 @@ +/*- + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2020 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.rest.rm.community.files; + +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS; +import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.UNFILED_RECORD_FOLDER_TYPE; +import static org.alfresco.rest.rm.community.model.user.UserPermissions.PERMISSION_FILING; +import static org.alfresco.rest.rm.community.model.user.UserPermissions.PERMISSION_READ_RECORDS; +import static org.alfresco.rest.rm.community.model.user.UserRoles.ROLE_RM_POWER_USER; +import static org.alfresco.utility.data.RandomData.getRandomAlphanumeric; +import static org.alfresco.utility.data.RandomData.getRandomName; +import static org.alfresco.utility.report.log.Step.STEP; +import static org.springframework.http.HttpStatus.ACCEPTED; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.util.List; + +import org.alfresco.dataprep.CMISUtil; +import org.alfresco.rest.rm.community.base.BaseRMRestTest; +import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory; +import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild; +import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChild; +import org.alfresco.rest.rm.community.util.DockerHelper; +import org.alfresco.rest.v0.service.RoleService; +import org.alfresco.test.AlfrescoTest; +import org.alfresco.utility.Utility; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.SiteModel; +import org.alfresco.utility.model.UserModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +/** + * API tests for declaring a document version as record and filing to a record folder location within the file plan + * + * @author Rodica Sutu + * @since 3.4 + */ +@AlfrescoTest (jira = "APPS-35") +public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest +{ + private final static String DESTINATION_PATH_NOT_FOUND_EXC = "Unable to execute declare-version-record action, " + + "because the destination path could not be found."; + private final static String INVALID_DESTINATION_PATH_EXC = "Unable to execute declare-version-record action, " + + "because the destination path is invalid."; + private final static String DESTINATION_PATH_NOT_RECORD_FOLDER_EXC = "Unable to execute declare-version-record " + + "action, because the destination path is not a record folder."; + private final static String CLOSED_RECORD_FOLDER_EXC = "You can't add new items to a closed record folder."; + + private UserModel userFillingPermission, userReadOnlyPermission; + private SiteModel publicSite; + private FileModel testFile; + private FolderModel testFolder; + private RecordCategory recordCategory; + private RecordCategoryChild recordFolder, closedRecordFolder; + private UnfiledContainerChild unfiledContainerFolder; + + @Autowired + private RoleService roleService; + @Autowired + private DockerHelper dockerHelper; + + @BeforeClass (alwaysRun = true) + public void declareAndFileVersionAsRecordSetup() throws Exception + { + STEP("Create test collaboration site to store documents in."); + publicSite = dataSite.usingAdmin().createPublicRandomSite(); + + STEP("Create a test folder within the collaboration site"); + testFolder = dataContent.usingAdmin().usingSite(publicSite).createFolder(); + + STEP("Create record categories and record folders"); + recordCategory = createRootCategory(getRandomName("recordCategory")); + recordFolder = createFolder(recordCategory.getId(), getRandomName("recordFolder")); + closedRecordFolder = createFolder(recordCategory.getId(), getRandomName("closedRecordFolder")); + closeFolder(closedRecordFolder.getId()); + unfiledContainerFolder = createUnfiledContainerChild(UNFILED_RECORDS_CONTAINER_ALIAS, + "Unfiled Folder " + getRandomAlphanumeric(), UNFILED_RECORD_FOLDER_TYPE); + + STEP("Create rm users with different permissions on the record category"); + userFillingPermission = roleService.createCollaboratorWithRMRoleAndPermission(publicSite, recordCategory, + ROLE_RM_POWER_USER, PERMISSION_FILING); + userReadOnlyPermission = roleService.createCollaboratorWithRMRoleAndPermission(publicSite, recordCategory, + ROLE_RM_POWER_USER, PERMISSION_READ_RECORDS); + } + + @BeforeMethod (alwaysRun = true) + public void createDocument() + { + STEP("Create a document in the collaboration site"); + testFile = dataContent.usingSite(publicSite) + .usingAdmin() + .createContent(CMISUtil.DocumentType.TEXT_PLAIN); + } + + /** + * Given I am calling the "declare version as record" action + * And I am not providing a location parameter value + * When I execute the action + * Then the document is declared as a version record + * And is placed in the Unfiled Records location + */ + @Test + public void declareVersionAndFileNoLocationUsingActionsAPI() throws Exception + { + STEP("Declare document version as record without providing a location parameter value using v1 actions api"); + getRestAPIFactory().getActionsAPI(userReadOnlyPermission).declareVersionAsRecord(testFile); + + STEP("Verify the declared version record is placed in the Unfiled Records folder and is a record version"); + assertTrue(isRecordVersionInUnfiledRecords(testFile, "1.0"), "Version record should be filed to Unfiled " + + "Records folder"); + } + + /** + * Given I am calling the "declare version as record" action + * And I provide a valid record folder in the location parameter + * When I execute the action + * Then the document is declared as a version record + * And is filed to the record folder specified + */ + @Test + public void fileVersionAsRecordToValidLocationUsingActionsAPI() throws Exception + { + STEP("Declare document version as record with a location parameter value"); + getRestAPIFactory().getActionsAPI(userFillingPermission).declareAndFileVersionAsRecord(testFile, + Utility.buildPath(recordCategory.getName(), recordFolder.getName())); + + STEP("Verify the declared version record is placed in the record folder"); + assertTrue(isRecordVersionInRecordFolder(testFile, recordFolder, "1.0"), "Record version should be filed to " + + "record folder"); + } + + /** + * Invalid destination paths where version records can't be filed + */ + @DataProvider (name = "invalidDestinationPaths") + public Object[][] getInvalidDestinationPaths() + { + return new String[][] + { + { "/", DESTINATION_PATH_NOT_FOUND_EXC }, + { "Unfiled Records", INVALID_DESTINATION_PATH_EXC }, + { "Transfers", INVALID_DESTINATION_PATH_EXC }, + { "Holds", INVALID_DESTINATION_PATH_EXC }, + { "rm/documentlibrary", DESTINATION_PATH_NOT_FOUND_EXC }, + { recordCategory.getName(), DESTINATION_PATH_NOT_RECORD_FOLDER_EXC }, + // a closed record folder + { Utility.buildPath(recordCategory.getName(), closedRecordFolder.getName()), + CLOSED_RECORD_FOLDER_EXC }, + // an arbitrary unfiled records folder + { "Unfiled Records/" + unfiledContainerFolder.getName(), INVALID_DESTINATION_PATH_EXC }, + // a collaboration site folder + { testFolder.getCmisLocation(), DESTINATION_PATH_NOT_FOUND_EXC } + }; + } + + /** + * Given I am calling the "declare version as record" action + * And I provide an invalid record folder in the location parameter + * When I execute the action + * Then I receive an error indicating that I have attempted to file version as record a document into an invalid + * record folder + * And the document is not declared as a version record + */ + @Test (dataProvider = "invalidDestinationPaths") + public void declareVersionAndFileToInvalidLocationUsingActionsAPI(String containerPath, String expectedException) throws Exception + { + STEP("Declare document as record version with an invalid location parameter value"); + getRestAPIFactory().getActionsAPI().declareAndFileVersionAsRecord(testFile, containerPath); + assertStatusCode(ACCEPTED); + + STEP("Check the exception thrown in alfresco logs"); + //Retry the operation because sometimes it takes few seconds to throw the exception + Utility.sleep(6000, 30000, () -> + { + List alfrescoLogs = dockerHelper.getAlfrescoLogs(); + assertTrue(alfrescoLogs.stream().anyMatch(logLine -> logLine.contains(expectedException))); + }); + + } + + /** + * Given I am an user with read only permissions on a record folder + * When I declare and file a version record to the record folder + * Then I receive an error indicating that the access is denied + * And the document is not declared as a record + */ + @Test + public void declareAndFileByUserWithReadOnlyPermission() throws Exception + { + STEP("Declare document as record with a record folder as location parameter"); + getRestAPIFactory().getActionsAPI(userReadOnlyPermission).declareAndFileVersionAsRecord(testFile, + Utility.buildPath(recordCategory.getName(), recordFolder.getName())); + + STEP("Check that the record version is not added to the record folder"); + assertFalse(isRecordVersionInRecordFolder(testFile, recordFolder, "1.0"), "Record version is filed to " + + "record folder where the user doesn't have filling permission"); + } + + /** + * Given I am calling the "declare version as record" action for a minor document version + * And I am not providing a location parameter value + * When I execute the action + * Then the document version is declared as a version record + * And is placed in the Unfiled Records location + */ + @Test + public void declareVersionAsRecordMinorVersionUsingActionsAPI() throws Exception + { + STEP("Update document in the collaboration site"); + dataContent.usingSite(publicSite).usingAdmin().usingResource(testFile).updateContent("This is the new content" + + " " + + "for " + testFile.getName()); + + STEP("Declare document version as record without providing a location parameter value using v1 actions api"); + getRestAPIFactory().getActionsAPI(userFillingPermission).declareAndFileVersionAsRecord(testFile, + Utility.buildPath(recordCategory.getName(), recordFolder.getName())); + + STEP("Verify the declared version record is placed in the Unfiled Records folder and is a record version"); + assertTrue(isRecordVersionInRecordFolder(testFile, recordFolder, "1.1"), "Record should be filed to fileplan " + + "location"); + } + + /** + * Given I am calling the "declare version as record" action for a major document version + * And I am not providing a location parameter value + * When I execute the action + * Then the document version is declared as a version record version + * And is placed in the Unfiled Records location + */ + @Test + public void declareVersionAsRecordMajorVersionUsingActionsAPI() throws Exception + { + STEP("Update document in the collaboration site"); + File sampleFile = Utility.getResourceTestDataFile("SampleTextFile_10kb.txt"); + restClient.authenticateUser(getAdminUser()).withCoreAPI().usingParams("majorVersion=true").usingNode(testFile).updateNodeContent(sampleFile); + + STEP("Declare document version as record without providing a location parameter value using v1 actions api"); + getRestAPIFactory().getActionsAPI(userFillingPermission).declareAndFileVersionAsRecord(testFile, + Utility.buildPath(recordCategory.getName(), recordFolder.getName())); + + STEP("Verify the declared version record is placed in the Unfiled Records folder and is a record version"); + assertTrue(isRecordVersionInRecordFolder(testFile, recordFolder, "2.0"), "Version record should be filed to " + + "the record folder"); + } + + @AfterClass (alwaysRun = true) + public void declareAndFileVersionAsRecordCleanUp() + { + deleteRecordCategory(recordCategory.getId()); + + //delete created collaboration site + dataSite.deleteSite(publicSite); + + //delete users + getDataUser().deleteUser(userFillingPermission); + getDataUser().deleteUser(userReadOnlyPermission); + } +} From fe542b89f79e3869c089a438c829375f2ca7aedf Mon Sep 17 00:00:00 2001 From: rodicasutu Date: Thu, 28 May 2020 14:14:14 +0300 Subject: [PATCH 4/4] address review comments --- .../DeclareAndFileVersionAsRecordTests.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java index 220ba6d42e..9756949711 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/files/DeclareAndFileVersionAsRecordTests.java @@ -26,6 +26,8 @@ */ package org.alfresco.rest.rm.community.files; +import static org.alfresco.rest.rm.community.base.TestData.HOLD_DESCRIPTION; +import static org.alfresco.rest.rm.community.base.TestData.HOLD_REASON; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS; import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.UNFILED_RECORD_FOLDER_TYPE; import static org.alfresco.rest.rm.community.model.user.UserPermissions.PERMISSION_FILING; @@ -47,6 +49,7 @@ import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory; import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild; import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChild; import org.alfresco.rest.rm.community.util.DockerHelper; +import org.alfresco.rest.v0.HoldsAPI; import org.alfresco.rest.v0.service.RoleService; import org.alfresco.test.AlfrescoTest; import org.alfresco.utility.Utility; @@ -77,19 +80,23 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest private final static String DESTINATION_PATH_NOT_RECORD_FOLDER_EXC = "Unable to execute declare-version-record " + "action, because the destination path is not a record folder."; private final static String CLOSED_RECORD_FOLDER_EXC = "You can't add new items to a closed record folder."; + private final static String FROZEN_RECORD_FOLDER_EXC = "You can't add new items to a frozen record folder."; + private final static String HOLD_NAME = getRandomName("holdName"); private UserModel userFillingPermission, userReadOnlyPermission; private SiteModel publicSite; private FileModel testFile; private FolderModel testFolder; private RecordCategory recordCategory; - private RecordCategoryChild recordFolder, closedRecordFolder; + private RecordCategoryChild recordFolder, closedRecordFolder, heldRecordFolder; private UnfiledContainerChild unfiledContainerFolder; @Autowired private RoleService roleService; @Autowired private DockerHelper dockerHelper; + @Autowired + private HoldsAPI holdsAPI; @BeforeClass (alwaysRun = true) public void declareAndFileVersionAsRecordSetup() throws Exception @@ -107,6 +114,10 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest closeFolder(closedRecordFolder.getId()); unfiledContainerFolder = createUnfiledContainerChild(UNFILED_RECORDS_CONTAINER_ALIAS, "Unfiled Folder " + getRandomAlphanumeric(), UNFILED_RECORD_FOLDER_TYPE); + heldRecordFolder = createFolder(recordCategory.getId(), getRandomName("heldRecordFolder")); + holdsAPI.createHold(getAdminUser().getUsername(), getAdminUser().getPassword(), HOLD_NAME, HOLD_REASON, HOLD_DESCRIPTION); + holdsAPI.addItemToHold(getAdminUser().getUsername(), getAdminUser().getPassword(), heldRecordFolder.getId(), + HOLD_NAME); STEP("Create rm users with different permissions on the record category"); userFillingPermission = roleService.createCollaboratorWithRMRoleAndPermission(publicSite, recordCategory, @@ -178,6 +189,9 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest // a closed record folder { Utility.buildPath(recordCategory.getName(), closedRecordFolder.getName()), CLOSED_RECORD_FOLDER_EXC }, + // a frozen record folder + { Utility.buildPath(recordCategory.getName(), heldRecordFolder.getName()), + FROZEN_RECORD_FOLDER_EXC }, // an arbitrary unfiled records folder { "Unfiled Records/" + unfiledContainerFolder.getName(), INVALID_DESTINATION_PATH_EXC }, // a collaboration site folder @@ -187,7 +201,7 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest /** * Given I am calling the "declare version as record" action - * And I provide an invalid record folder in the location parameter + * And I provide an invalid record folder in the path parameter * When I execute the action * Then I receive an error indicating that I have attempted to file version as record a document into an invalid * record folder @@ -230,7 +244,7 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest /** * Given I am calling the "declare version as record" action for a minor document version - * And I am not providing a location parameter value + * And I am not providing a path parameter value * When I execute the action * Then the document version is declared as a version record * And is placed in the Unfiled Records location @@ -240,21 +254,20 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest { STEP("Update document in the collaboration site"); dataContent.usingSite(publicSite).usingAdmin().usingResource(testFile).updateContent("This is the new content" + - " " + - "for " + testFile.getName()); + "for " + testFile.getName()); STEP("Declare document version as record without providing a location parameter value using v1 actions api"); getRestAPIFactory().getActionsAPI(userFillingPermission).declareAndFileVersionAsRecord(testFile, Utility.buildPath(recordCategory.getName(), recordFolder.getName())); - STEP("Verify the declared version record is placed in the Unfiled Records folder and is a record version"); + STEP("Verify the declared version record is placed in the record folder and is a record version"); assertTrue(isRecordVersionInRecordFolder(testFile, recordFolder, "1.1"), "Record should be filed to fileplan " + "location"); } /** * Given I am calling the "declare version as record" action for a major document version - * And I am not providing a location parameter value + * And I am not providing a path parameter value * When I execute the action * Then the document version is declared as a version record version * And is placed in the Unfiled Records location @@ -270,7 +283,7 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest getRestAPIFactory().getActionsAPI(userFillingPermission).declareAndFileVersionAsRecord(testFile, Utility.buildPath(recordCategory.getName(), recordFolder.getName())); - STEP("Verify the declared version record is placed in the Unfiled Records folder and is a record version"); + STEP("Verify the declared version record is placed in the record folder and is a record version"); assertTrue(isRecordVersionInRecordFolder(testFile, recordFolder, "2.0"), "Version record should be filed to " + "the record folder"); } @@ -278,6 +291,7 @@ public class DeclareAndFileVersionAsRecordTests extends BaseRMRestTest @AfterClass (alwaysRun = true) public void declareAndFileVersionAsRecordCleanUp() { + holdsAPI.deleteHold(getAdminUser().getUsername(), getAdminUser().getPassword(), HOLD_NAME); deleteRecordCategory(recordCategory.getId()); //delete created collaboration site