matchingRecords = unfiledContainersAPI.getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS)
+ .getEntries()
+ .stream()
+ .filter(e -> e.getEntry().getId().equals(testFile.getNodeRefWithoutVersion()))
+ .collect(Collectors.toList());
+
+ //delete rm items
+ deleteRecordCategory(recordCategory.getId());
+ STEP("Delete the record.");
+ //delete created collaboration site
+ dataSite.deleteSite(publicSite);
+
+ }
+}
diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FileAsRecordTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FileAsRecordTests.java
new file mode 100644
index 0000000000..cdadcd5ceb
--- /dev/null
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FileAsRecordTests.java
@@ -0,0 +1,238 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2022 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.smoke;
+
+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.recordfolder.RecordFolderCollection;
+import org.alfresco.rest.rm.community.model.user.UserRoles;
+import org.alfresco.rest.v0.RecordCategoriesAPI;
+import org.alfresco.rest.v0.service.RoleService;
+import org.alfresco.test.AlfrescoTest;
+import org.alfresco.utility.Utility;
+import org.alfresco.utility.data.DataContent;
+import org.alfresco.utility.data.DataSite;
+import org.alfresco.utility.model.FileModel;
+import org.alfresco.utility.model.FileType;
+import org.alfresco.utility.model.SiteModel;
+import org.alfresco.utility.model.UserModel;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import java.util.concurrent.atomic.AtomicReference;
+import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
+import static org.alfresco.rest.rm.community.model.user.UserPermissions.PERMISSION_FILING;
+import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
+import static org.alfresco.rest.rm.community.utils.CoreUtil.toContentModel;
+import static org.alfresco.utility.report.log.Step.STEP;
+import static org.springframework.test.util.AssertionErrors.assertTrue;
+import static org.testng.Assert.*;
+
+public class FileAsRecordTests extends BaseRMRestTest {
+
+ private static final String CATEGORY_MANAGER = "catManager" + generateTestPrefix(FileAsRecordTests.class);
+ private static final String CATEGORY_ADMIN = "catAdmin" + generateTestPrefix(FileAsRecordTests.class);
+ private static final String FOLDER_MANAGER = "recordFolder" + generateTestPrefix(FileAsRecordTests.class);
+ private static final String FOLDER_ADMIN = "recordFolder" + generateTestPrefix(FileAsRecordTests.class);
+
+ private UserModel nonRMuser,rmManager;
+ private SiteModel testSite;
+ private FileModel document, documentDeclared;
+ private RecordCategory category_manager, category_admin;
+ private RecordCategoryChild folder_admin, folder_manager ;
+ @Autowired
+ private DataSite dataSite;
+ @Autowired
+ private DataContent dataContent;
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private RecordCategoriesAPI recordCategoriesAPI;
+ /**
+ * Create preconditions:
+ *
+ * 1. RM site is created
+ * 2. Two users: user without RM role and a user with RM manager role
+ * 3. Two Record categories with one folder each
+ * 4. User with RM MANAGER role has Filling permission over one category
+ *
+ */
+ @BeforeClass(alwaysRun = true)
+ public void preconditionForFileAsRecordRecordTests()
+ {
+ STEP("Create the RM site if doesn't exist");
+ createRMSiteIfNotExists();
+
+ STEP("Create a user");
+ nonRMuser = dataUser.createRandomTestUser("testUser");
+
+ STEP("Create a collaboration site");
+ testSite = dataSite.usingUser(nonRMuser).createPublicRandomSite();
+
+ STEP("Create a document with the user without RM role");
+ document = dataContent.usingSite(testSite)
+ .usingUser(nonRMuser)
+ .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
+
+ STEP("Create two categories with two folders");
+ category_manager = createRootCategory(CATEGORY_MANAGER);
+ category_admin = createRootCategory(CATEGORY_ADMIN);
+ folder_admin = createFolder(category_admin.getId(),FOLDER_ADMIN);
+ folder_manager = createFolder(category_manager.getId(),FOLDER_MANAGER);
+
+ STEP("Create an rm user and give filling permission over CATEGORY_MANAGER record category");
+ RecordCategory recordCategory = new RecordCategory().builder()
+ .id(category_manager.getId())
+ .build();
+ rmManager = roleService.createCollaboratorWithRMRoleAndPermission(testSite, recordCategory,
+ UserRoles.ROLE_RM_MANAGER, PERMISSION_FILING);
+ }
+
+ /**
+ * Given I have selected the record folder I want to file my declared record to
+ * When I confirm the action
+ * Then the dialog closes
+ * And the document is now shown as a record in the collaboration site
+ * And if I navigated to the record folder, as any user who had the right permissions, then I would see the
+ * record filed
+ */
+ @Test
+ @AlfrescoTest(jira = "RM-6780")
+ public void checkFileAsRecordToRecordFolder() throws Exception {
+
+ AtomicReference apiChildren = new AtomicReference<>();
+ STEP("Create a document with the user with RM role");
+ documentDeclared = dataContent.usingSite(testSite).usingUser(rmManager)
+ .createContent(new FileModel("checkDeclareAndFileToRecordFolder", FileType.TEXT_PLAIN));
+
+ STEP("Declare and file into a record folder the document uploaded");
+
+ getRestAPIFactory().getActionsAPI(rmManager).declareAndFile(documentDeclared,
+ Utility.buildPath(CATEGORY_MANAGER, FOLDER_MANAGER));
+
+ STEP("Check the file is a record within the collaboration site");
+
+ try
+ {
+ Utility.sleep(1000, 40000, () ->
+ {
+ JSONObject collaboratorSearchJson = getSearchApi().liveSearchForDocuments(rmManager.getUsername(),
+ rmManager.getPassword(),
+ documentDeclared.getName());
+ assertTrue("Rm Manager not able to find the document.", collaboratorSearchJson.getJSONArray("items").length() != 0);
+ });
+ }
+ catch (InterruptedException e)
+ {
+ fail("InterruptedException received while waiting for results.");
+ }
+
+ STEP("Check the record is filed into the record folder.");
+ // Get children from API
+ // List children from API
+ try
+ {
+ Utility.sleep(1000, 40000, () ->
+ {
+ apiChildren.set((RecordFolderCollection) getRestAPIFactory()
+ .getRecordFolderAPI(rmManager).getRecordFolderChildren(folder_manager.getId(), "include=properties")
+ .assertThat().entriesListIsNotEmpty().assertThat().entriesListIsNotEmpty());
+ });
+ }
+ catch (InterruptedException e)
+ {
+ fail("InterruptedException received while waiting for results.");
+ }
+
+ assertEquals(apiChildren.get()
+ .getEntries()
+ .get(0)
+ .getEntry()
+ .getProperties()
+ .getOriginalName(),documentDeclared.getName());
+ }
+
+ /**
+ * Given I have selected the "File As Record" action
+ * When I confirm the action without selecting a location to file to
+ * Then the record is declared in the unfiled folder
+ */
+ @Test
+ @AlfrescoTest (jira = "RM-6780")
+ public void fileAsRecordToUnfiledRecordFolder() throws Exception {
+ STEP("Create a document with the user without RM role");
+ FileModel inplaceRecord = dataContent.usingSite(testSite).usingUser(rmManager)
+ .createContent(new FileModel("declareAndFileToIntoUnfiledRecordFolder",
+ FileType.TEXT_PLAIN));
+
+ STEP("Click on Declare and file without selecting a record folder");
+ getRestAPIFactory().getActionsAPI(rmManager).declareAndFile(inplaceRecord,"");
+
+ STEP("Check the file is declared in unfiled record folder");
+ Assert.assertTrue(isMatchingRecordInUnfiledRecords(inplaceRecord), "Record should be filed to Unfiled Records folder");
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void cleanUpForFileAsRecordRecordTests() {
+ STEP("Delete the collaboration site");
+ dataSite.usingUser(nonRMuser).deleteSite(testSite);
+
+ STEP("Empty the trashcan.");
+ restClient.authenticateUser(nonRMuser).withCoreAPI().usingTrashcan().deleteNodeFromTrashcan(toContentModel(testSite.getId()));
+
+ getRestAPIFactory()
+ .getUnfiledContainersAPI(rmManager)
+ .getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS)
+ .getEntries()
+ .stream()
+ .forEach(x -> getRestAPIFactory()
+ .getRecordsAPI()
+ .deleteRecord(x.getEntry().getId()));
+
+ STEP("Cleanup Documents inside folders");
+
+ STEP("Delete folders");
+ getRestAPIFactory().getRecordFolderAPI().deleteRecordFolder(folder_admin.getId());
+ getRestAPIFactory().getRecordFolderAPI().deleteRecordFolder(folder_manager.getId());
+
+ STEP("Delete categories");
+ recordCategoriesAPI.deleteCategory(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), category_manager.getName());
+ recordCategoriesAPI.deleteCategory(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), category_admin.getName());
+
+ STEP("Delete Users");
+ dataUser.deleteUser(nonRMuser);
+ dataUser.deleteUser(rmManager);
+ }
+}
diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FoldersDispositionScheduleTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FoldersDispositionScheduleTests.java
new file mode 100644
index 0000000000..e2a9d7c6da
--- /dev/null
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FoldersDispositionScheduleTests.java
@@ -0,0 +1,108 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2022 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.smoke;
+
+import org.alfresco.rest.rm.community.base.BaseRMRestTest;
+import org.alfresco.rest.rm.community.model.record.Record;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
+import org.alfresco.rest.v0.RecordFoldersAPI;
+import org.alfresco.rest.v0.service.DispositionScheduleService;
+import org.alfresco.test.AlfrescoTest;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CREATED_DATE;
+import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
+import static org.alfresco.utility.data.RandomData.getRandomName;
+import static org.alfresco.utility.report.log.Step.STEP;
+
+public class FoldersDispositionScheduleTests extends BaseRMRestTest {
+
+ private RecordCategory Category1;
+ @Autowired
+ private DispositionScheduleService dispositionScheduleService;
+ @Autowired
+ private RecordFoldersAPI recordFoldersAPI;
+ private final String TEST_PREFIX = generateTestPrefix(FoldersDispositionScheduleTests.class);
+ private final String folderDisposition = TEST_PREFIX + "RM-2937 folder ghosting";
+ private final String electronicRecord = "RM-2937 electronic 2 record";
+ private final String nonElectronicRecord = "RM-2937 non-electronic record";
+
+ @BeforeClass(alwaysRun = true)
+ private void setUp(){
+
+ STEP("Create the RM site if doesn't exist");
+ createRMSiteIfNotExists();
+
+ STEP("Create record category");
+ Category1 = createRootCategory(getRandomName("Title"));
+ }
+
+ @Test
+ @AlfrescoTest (jira = "RM-2937")
+ public void foldersDispositionScheduleWithGhosting() {
+
+ //create retention schedule
+ dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), false);
+
+ // add cut off step
+ dispositionScheduleService.addCutOffAfterPeriodStep(Category1.getName(), "day|2", CREATED_DATE);
+
+ // add destroy step with ghosting
+ dispositionScheduleService.addDestroyWithGhostingImmediatelyAfterCutOff(Category1.getName());
+
+ //create folders
+ RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
+
+ Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(),electronicRecord);
+ Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(),nonElectronicRecord);
+
+ // complete records
+ completeRecord(elRecord.getId());
+ completeRecord(nonElRecord.getId());
+
+ // edit disposition date
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),FOLDER_DESTROY.getName());
+
+ // cut off the FOLDER_DESTROY
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),FOLDER_DESTROY.getName());
+
+ // Destroy the FOLDER_DESTROY
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","destroy"),FOLDER_DESTROY.getName());
+ }
+
+ @AfterMethod(alwaysRun = true)
+ private void deletePreconditions() {
+ deleteRecordCategory(Category1.getId());
+ }
+}
diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FoldersDispositionScheduleWithoutGhostRecordTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FoldersDispositionScheduleWithoutGhostRecordTests.java
new file mode 100644
index 0000000000..4bec2fd08c
--- /dev/null
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/FoldersDispositionScheduleWithoutGhostRecordTests.java
@@ -0,0 +1,116 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2022 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.smoke;
+
+import org.alfresco.rest.rm.community.base.BaseRMRestTest;
+import org.alfresco.rest.rm.community.model.record.Record;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
+import org.alfresco.rest.v0.RecordFoldersAPI;
+import org.alfresco.rest.v0.service.DispositionScheduleService;
+import org.alfresco.test.AlfrescoTest;
+import org.alfresco.utility.Utility;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CREATED_DATE;
+import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CUT_OFF_DATE;
+import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
+import static org.alfresco.utility.data.RandomData.getRandomName;
+import static org.alfresco.utility.report.log.Step.STEP;
+
+public class FoldersDispositionScheduleWithoutGhostRecordTests extends BaseRMRestTest {
+
+ private RecordCategory Category1;
+ @Autowired
+ private DispositionScheduleService dispositionScheduleService;
+ @Autowired
+ private RecordFoldersAPI recordFoldersAPI;
+ private final String TEST_PREFIX = generateTestPrefix(FoldersDispositionScheduleWithoutGhostRecordTests.class);
+ private final String folderDisposition = TEST_PREFIX + "RM-2937 folder ghosting";
+ private final String electronicRecord = "RM-2937 electronic 2 record";
+ private final String nonElectronicRecord = "RM-2937 non-electronic record";
+
+ @BeforeClass(alwaysRun = true)
+ private void setUp(){
+
+ STEP("Create the RM site if doesn't exist");
+ createRMSiteIfNotExists();
+
+ STEP("Create record category");
+ Category1 = createRootCategory(getRandomName("Title"));
+ }
+
+ @Test
+ @AlfrescoTest(jira="RM-2937")
+ public void foldersDispositionScheduleWithoutGhosting() {
+
+ //create retention schedule
+ dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), false);
+
+ // add cut off step
+ dispositionScheduleService.addCutOffAfterPeriodStep(Category1.getName(), "day|2", CREATED_DATE);
+
+ // add destroy step with ghosting
+ dispositionScheduleService.addDestroyWithoutGhostingAfterPeriodStep(Category1.getName(), "day|1", CUT_OFF_DATE);
+
+ //create folders
+ RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
+
+ Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(),electronicRecord);
+ Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(),nonElectronicRecord);
+
+ // complete records
+ completeRecord(elRecord.getId());
+ completeRecord(nonElRecord.getId());
+
+ // edit disposition date
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),FOLDER_DESTROY.getName());
+
+ // cut off the FOLDER_DESTROY
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),FOLDER_DESTROY.getName());
+
+ // edit disposition date
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),FOLDER_DESTROY.getName());
+
+ Utility.waitToLoopTime(5,"Waiting for Edit Disposition to be processed");
+
+ // Destroy the FOLDER_DESTROY
+ recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","destroy"),FOLDER_DESTROY.getName());
+ }
+
+ @AfterMethod(alwaysRun = true)
+ private void deletePreconditions() {
+ deleteRecordCategory(Category1.getId());
+ }
+}
diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/RecordsDispositionScheduleTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/RecordsDispositionScheduleTests.java
new file mode 100644
index 0000000000..90823b3514
--- /dev/null
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/RecordsDispositionScheduleTests.java
@@ -0,0 +1,202 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2022 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.smoke;
+
+import org.alfresco.rest.core.v0.RMEvents;
+import org.alfresco.rest.rm.community.base.BaseRMRestTest;
+import org.alfresco.rest.rm.community.model.record.Record;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
+import org.alfresco.rest.v0.RMRolesAndActionsAPI;
+import org.alfresco.rest.v0.RecordFoldersAPI;
+import org.alfresco.rest.v0.RecordsAPI;
+import org.alfresco.rest.v0.service.DispositionScheduleService;
+import org.alfresco.test.AlfrescoTest;
+import org.alfresco.utility.Utility;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.annotations.Test;
+import java.io.IOException;
+import java.time.Instant;
+import static org.alfresco.rest.rm.community.base.TestData.DEFAULT_PASSWORD;
+import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CUT_OFF_DATE;
+import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
+import static org.alfresco.utility.report.log.Step.STEP;
+
+/**
+ * Contains recordsDispositionScheduleWithoutGhosting test which checks disposition schedule cut off, transfer and destroy without maintaining metadata steps applied to records
+ *
+ * Precondition:
+ *
+ * RM site created, contains an empty category "RM-2801 disposition for records".
+ * RM user has RM admin role.
+ * A transfer location named "transferred files" is created to which RM user has access
+ *
+ *
+ *
+ * @author Kavit Shah
+ */
+
+public class RecordsDispositionScheduleTests extends BaseRMRestTest {
+
+ /** data prep 6services */
+ @Autowired
+ private RMRolesAndActionsAPI rmRolesAndActionsAPI;
+ @Autowired
+ private RecordsAPI recordsAPI;
+ @Autowired
+ private RecordFoldersAPI recordFoldersAPI;
+ @Autowired
+ private DispositionScheduleService dispositionScheduleService;
+ private RecordCategory Category1;
+ private final String TEST_PREFIX = generateTestPrefix(RecordsDispositionScheduleTests.class);
+ private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
+ private final String recordsCategory = TEST_PREFIX + "RM-2801 category";
+ private final String folderDisposition = TEST_PREFIX + "RM-2801 folder";
+
+ @Test
+ @AlfrescoTest(jira="RM-2801")
+ public void recordsDispositionScheduleWithoutGhosting() {
+
+ // create test precondition
+ createTestPrecondition(recordsCategory);
+
+ // create disposition schedule
+ dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), true);
+
+ // add cut off step
+ dispositionScheduleService.addCutOffImmediatelyStep(Category1.getName());
+
+ // add transfer step
+ dispositionScheduleService.addTransferAfterEventStep(Category1.getName(),"transferred records","all_allowances_granted_are_terminated");
+
+ // add destroy step without retaining metadata
+ dispositionScheduleService.addDestroyWithoutGhostingAfterPeriodStep(Category1.getName(), "day|1", CUT_OFF_DATE);
+
+ // create a folder and an electronic and a non-electronic record in it
+ RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
+
+ String electronicRecord = "RM-2801 electronic record";
+ Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(), electronicRecord);
+ String nonElectronicRecord = "RM-2801 non-electronic record";
+ Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(), nonElectronicRecord);
+
+ // complete records and cut them off
+ String nonElRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), folderDisposition, nonElectronicRecord);
+ String elRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), folderDisposition, electronicRecord);
+
+ // complete records and cut them off
+ completeRecord(elRecord.getId());
+ completeRecord(nonElRecord.getId());
+
+ String nonElRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),nonElRecordNameNodeRef);
+
+ String elRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),elRecordNameNodeRef);
+
+ // ensure the complete event action is displayed for both events
+ rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), nonElRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
+ rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), elRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
+
+ // Create and Complete transfer
+ HttpResponse nonElRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition));
+
+ String nonElRecordNameTransferId = getTransferId(nonElRecordNameHttpResponse,nonElRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),nonElRecordNameTransferId);
+
+ HttpResponse elRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition));
+
+ String elRecordNameTransferId = getTransferId(elRecordNameHttpResponse,elRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),elRecordNameTransferId);
+
+ // edit the disposition schedule date to current date
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),nonElRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),elRecordNameNodeRef);
+
+ Utility.waitToLoopTime(5,"Waiting for Edit Disposition to be processed");
+
+ // destroy records
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","destroy"),nonElRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","destroy"),elRecordNameNodeRef);
+
+ // delete category
+ deleteRecordCategory(Category1.getId());
+ }
+
+ private void createTestPrecondition(String categoryName) {
+ createRMSiteIfNotExists();
+
+ // create "rm admin" user if it does not exist and assign it to RM Administrator role
+ rmRolesAndActionsAPI.createUserAndAssignToRole(
+ getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(),
+ RM_ADMIN, DEFAULT_PASSWORD, "Administrator");
+
+ // create category
+ STEP("Create two category");
+ Category1 = createRootCategory(categoryName,"Title");
+ }
+
+ private String getTransferId(HttpResponse httpResponse,String nodeRef) {
+ HttpEntity entity = httpResponse.getEntity();
+ String responseString = null;
+ try {
+ responseString = EntityUtils.toString(entity, "UTF-8");
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ JSONObject result = new JSONObject(responseString);
+ return result
+ .getJSONObject("results")
+ .get(nodeRef)
+ .toString();
+
+ }
+}
diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/RecordsDispositionScheduleWithGhostingTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/RecordsDispositionScheduleWithGhostingTests.java
new file mode 100644
index 0000000000..07742a0767
--- /dev/null
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/RecordsDispositionScheduleWithGhostingTests.java
@@ -0,0 +1,200 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2022 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.smoke;
+
+import org.alfresco.rest.core.v0.RMEvents;
+import org.alfresco.rest.rm.community.base.BaseRMRestTest;
+import org.alfresco.rest.rm.community.model.record.Record;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
+import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
+import org.alfresco.rest.v0.RMRolesAndActionsAPI;
+import org.alfresco.rest.v0.RecordFoldersAPI;
+import org.alfresco.rest.v0.RecordsAPI;
+import org.alfresco.rest.v0.service.DispositionScheduleService;
+import org.alfresco.test.AlfrescoTest;
+import org.alfresco.utility.Utility;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.annotations.Test;
+import java.io.IOException;
+import java.time.Instant;
+import static org.alfresco.rest.rm.community.base.TestData.DEFAULT_PASSWORD;
+import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
+import static org.alfresco.utility.report.log.Step.STEP;
+
+/**
+ * Contains recordsDispositionScheduleWithGhosting test which checks disposition schedule cut off, transfer and destroy with maintaining record metadata steps applied to records
+ *
+ * Precondition:
+ *
+ * RM site created, contains an empty category "RM-2937 disposition for records with ghosting".
+ * RM user has RM admin role.
+ * A transfer location named "transferred files with ghosting" is created to which RM user has access
+ *
+ *
+ *
+ * @author Kavit Shah
+ */
+public class RecordsDispositionScheduleWithGhostingTests extends BaseRMRestTest {
+
+ /** data prep 6services */
+ @Autowired
+ private RMRolesAndActionsAPI rmRolesAndActionsAPI;
+ @Autowired
+ private RecordsAPI recordsAPI;
+ @Autowired
+ private RecordFoldersAPI recordFoldersAPI;
+ @Autowired
+ private DispositionScheduleService dispositionScheduleService;
+ private RecordCategory Category1;
+ private final String TEST_PREFIX = generateTestPrefix(RecordsDispositionScheduleTests.class);
+ private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
+ private final String recordsCategory = TEST_PREFIX + "RM-2801 category";
+ private final String folderDisposition = TEST_PREFIX + "RM-2801 folder";
+
+ @Test
+ @AlfrescoTest(jira="RM-2801")
+ public void recordsDispositionScheduleWithGhosting() {
+
+ // create test precondition
+ createTestPrecondition(recordsCategory);
+
+ // create disposition schedule
+ dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), true);
+
+ // add cut off step
+ dispositionScheduleService.addCutOffImmediatelyStep(Category1.getName());
+
+ // add transfer step
+ dispositionScheduleService.addTransferAfterEventStep(Category1.getName(),"transferred records","all_allowances_granted_are_terminated");
+
+ // add destroy step without retaining metadata
+ dispositionScheduleService.addDestroyWithGhostingImmediatelyAfterCutOff(Category1.getName());
+
+ // create a folder and an electronic and a non-electronic record in it
+ RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
+
+ String electronicRecord = "RM-2801 electronic record";
+ Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(), electronicRecord);
+ String nonElectronicRecord = "RM-2801 non-electronic record";
+ Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(), nonElectronicRecord);
+
+ // complete records and cut them off
+ String nonElRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), folderDisposition, nonElectronicRecord);
+ String elRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), folderDisposition, electronicRecord);
+
+ // complete records and cut them off
+ completeRecord(elRecord.getId());
+ completeRecord(nonElRecord.getId());
+
+ String nonElRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),nonElRecordNameNodeRef);
+
+ String elRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),elRecordNameNodeRef);
+
+ // ensure the complete event action is displayed for both events
+ rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), nonElRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
+ rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
+ getAdminUser().getPassword(), elRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
+
+ // Create and Complete transfer
+ HttpResponse nonElRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition));
+
+ String nonElRecordNameTransferId = getTransferId(nonElRecordNameHttpResponse,nonElRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),nonElRecordNameTransferId);
+
+ HttpResponse elRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition));
+
+ String elRecordNameTransferId = getTransferId(elRecordNameHttpResponse,elRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),elRecordNameTransferId);
+
+ // edit the disposition schedule date to current date
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),nonElRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),editDispositionDateJson(),elRecordNameNodeRef);
+
+ Utility.waitToLoopTime(5,"Waiting for Edit Disposition to be processed");
+
+ // destroy records
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","destroy"),nonElRecordNameNodeRef);
+ recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
+ getAdminUser().getPassword(),new JSONObject().put("name","destroy"),elRecordNameNodeRef);
+
+ // delete category
+ deleteRecordCategory(Category1.getId());
+ }
+
+ private void createTestPrecondition(String categoryName) {
+ createRMSiteIfNotExists();
+
+ // create "rm admin" user if it does not exist and assign it to RM Administrator role
+ rmRolesAndActionsAPI.createUserAndAssignToRole(
+ getDataUser().usingAdmin().getAdminUser().getUsername(),
+ getDataUser().usingAdmin().getAdminUser().getPassword(),
+ RM_ADMIN, DEFAULT_PASSWORD, "Administrator");
+
+ // create category
+ STEP("Create two category");
+ Category1 = createRootCategory(categoryName,"Title");
+ }
+
+ private String getTransferId(HttpResponse httpResponse,String nodeRef) {
+ HttpEntity entity = httpResponse.getEntity();
+ String responseString = null;
+ try {
+ responseString = EntityUtils.toString(entity, "UTF-8");
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ JSONObject result = new JSONObject(responseString);
+ return result
+ .getJSONObject("results")
+ .get(nodeRef)
+ .toString();
+
+ }
+}
diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/UnfiledRecordsRuleTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/UnfiledRecordsRuleTests.java
new file mode 100644
index 0000000000..a7023a1723
--- /dev/null
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/smoke/UnfiledRecordsRuleTests.java
@@ -0,0 +1,124 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2022 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.smoke;
+
+
+import org.alfresco.rest.rm.community.base.BaseRMRestTest;
+import org.alfresco.rest.rm.community.model.record.RecordContent;
+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.rules.ActionsOnRule;
+import org.alfresco.rest.rm.community.model.rules.RuleDefinition;
+import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainer;
+import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChild;
+import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChildProperties;
+import org.alfresco.rest.v0.RMRolesAndActionsAPI;
+import org.alfresco.rest.v0.RulesAPI;
+import org.alfresco.test.AlfrescoTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import static org.alfresco.rest.core.v0.BaseAPI.NODE_PREFIX;
+import static org.alfresco.rest.rm.community.base.TestData.ELECTRONIC_RECORD_NAME;
+import static org.alfresco.rest.rm.community.base.TestData.NONELECTRONIC_RECORD_NAME;
+import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
+import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.*;
+import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
+import static org.alfresco.utility.data.RandomData.getRandomName;
+import static org.alfresco.utility.report.log.Step.STEP;
+import static org.springframework.http.HttpStatus.*;
+public class UnfiledRecordsRuleTests extends BaseRMRestTest {
+
+ @Autowired
+ private RMRolesAndActionsAPI rmRolesAndActionsAPI;
+ private final String TEST_PREFIX = generateTestPrefix(CreateCategoriesTests.class);
+ private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
+ private RecordCategory Category2;
+ private RecordCategoryChild Folder2;
+ @Autowired
+ private RulesAPI rulesAPI;
+
+ @Test
+ @AlfrescoTest(jira = "RM-2794")
+ public void unfiledRecordsRule() {
+
+
+ STEP("Create the RM site if doesn't exist");
+ createRMSiteIfNotExists();
+
+ STEP("Create RM Admin user");
+ rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
+ getAdminUser().getPassword(),
+ "Administrator");
+
+ STEP("Create record categories and record folders");
+ Category2 = createRootCategory(getRandomName("recordCategory"));
+ Folder2 = createFolder(Category2.getId(), getRandomName("recordFolder"));
+
+ STEP("Get the unfiled records container");
+ UnfiledContainer container = getRestAPIFactory().getUnfiledContainersAPI().getUnfiledContainer(UNFILED_RECORDS_CONTAINER_ALIAS);
+
+ // Check the response code
+ assertStatusCode(OK);
+
+ //create a rule
+ RuleDefinition ruleDefinition = RuleDefinition.createNewRule().title("name").description("description")
+ .applyToChildren(true)
+ .actions(Collections.singletonList(ActionsOnRule.FILE_TO.getActionValue()));
+ rulesAPI.createRule(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + container.getId(), ruleDefinition);
+
+ //upload an electronic record
+ UnfiledContainerChild electronicRecord = UnfiledContainerChild.builder()
+ .name(ELECTRONIC_RECORD_NAME)
+ .nodeType(CONTENT_TYPE)
+ .content(RecordContent.builder().mimeType("text/plain").build())
+ .build();
+ assertStatusCode(OK);
+
+
+ // create a non-electronic record
+ UnfiledContainerChild nonelectronicRecord = UnfiledContainerChild.builder()
+ .properties(UnfiledContainerChildProperties.builder()
+ .description(NONELECTRONIC_RECORD_NAME)
+ .title("Title")
+ .build())
+ .name(NONELECTRONIC_RECORD_NAME)
+ .nodeType(NON_ELECTRONIC_RECORD_TYPE)
+ .build();
+ assertStatusCode(OK);
+
+ //delete the record created, delete the rule from UnfilledRecord page, delete the category created
+ rulesAPI.deleteAllRulesOnContainer(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + container.getId());
+ deleteRecordCategory(Category2.getId());
+ assertStatusCode(NO_CONTENT);
+
+ }
+
+ }