diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java index 2601bd3db6..941759cda1 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/core/v0/BaseAPI.java @@ -310,6 +310,78 @@ public abstract class BaseAPI } } + /** + * Helper method for PUT requests + * + * @param adminUser user with administrative privileges + * @param adminPassword password for adminUser + * @param expectedStatusCode The expected return status code. + * @param requestParams zero or more endpoint specific request parameters + * @param urlTemplate request URL template + * @param urlTemplateParams zero or more parameters used with urlTemplate + */ + protected HttpResponse doPutJsonRequest(String adminUser, + String adminPassword, + int expectedStatusCode, + JSONObject requestParams, + String urlTemplate, + String... urlTemplateParams) + { + AlfrescoHttpClient client = alfrescoHttpClientFactory.getObject(); + return doPutJsonRequest(adminUser, adminPassword, expectedStatusCode, client.getApiUrl(), requestParams, urlTemplate, urlTemplateParams); + } + + /** + * Helper method for PUT requests + * + * @param adminUser user with administrative privileges + * @param adminPassword password for adminUser + * @param expectedStatusCode The expected return status code. + * @param urlStart the start of the URL (for example "alfresco/s/slingshot"). + * @param requestParams zero or more endpoint specific request parameters + * @param urlTemplate request URL template + * @param urlTemplateParams zero or more parameters used with urlTemplate + * @throws AssertionError if the returned status code is not as expected. + */ + private HttpResponse doPutJsonRequest(String adminUser, + String adminPassword, + int expectedStatusCode, + String urlStart, + JSONObject requestParams, + String urlTemplate, + String... urlTemplateParams) + { + String requestUrl = formatRequestUrl(urlStart, urlTemplate, urlTemplateParams); + try + { + HttpResponse httpResponse = doRequestJson(HttpPut.class, requestUrl, adminUser, adminPassword, requestParams); + assertEquals("PUT request to " + requestUrl + " was not successful.", httpResponse.getStatusLine().getStatusCode(), expectedStatusCode); + return httpResponse; + } + catch (InstantiationException | IllegalAccessException error) + { + throw new IllegalArgumentException("doPutRequest failed", error); + } + } + + /** + * Fill in the parameters for a URL template. + * + * @param urlStart The start of the URL. + * @param urlTemplate The template. + * @param urlTemplateParams Any parameters that need to be filled into the URL template. + * @return The resultant URL. + */ + private String formatRequestUrl(String urlStart, String urlTemplate, String[] urlTemplateParams) + { + if (urlTemplateParams.length == 1) + { + // The format method needs some help to know not to use the whole array object. + return MessageFormat.format(urlTemplate, urlStart, urlTemplateParams[0]); + } + return MessageFormat.format(urlTemplate, urlStart, urlTemplateParams); + } + /** * Helper method for POST requests * @param adminUser user with administrative privileges @@ -403,11 +475,8 @@ public abstract class BaseAPI String urlTemplate, String... urlTemplateParams) { - // Ensure the host is part of the request URL. - String requestUrl = MessageFormat.format( - urlTemplate, - urlStart, - urlTemplateParams); + String requestUrl; + requestUrl = formatRequestUrl(urlStart, urlTemplate, urlTemplateParams); try { HttpResponse httpResponse = doRequestJson(HttpPost.class, requestUrl, adminUser, adminPassword, requestParams); diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserRoles.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserRoles.java index 3fc30071cd..a20eb8fc79 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserRoles.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/user/UserRoles.java @@ -24,11 +24,16 @@ * along with Alfresco. If not, see . * #L% */ + package org.alfresco.rest.rm.community.model.user; +import static com.google.common.collect.Sets.newHashSet; + +import java.util.Set; + /** * Constants for RM user roles - * + * * @author Kristijan Conkas * @since 2.6 */ @@ -39,4 +44,8 @@ public class UserRoles public static final String ROLE_RM_POWER_USER = "PowerUser"; public static final String ROLE_RM_SECURITY_OFFICER = "SecurityOfficer"; public static final String ROLE_RM_USER = "User"; + + /** The ids of the default RM roles. */ + public static final Set RM_ROLES = newHashSet(ROLE_RM_ADMIN, ROLE_RM_MANAGER, ROLE_RM_POWER_USER, + ROLE_RM_SECURITY_OFFICER, ROLE_RM_USER); } diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java index d0580c90b3..382426a893 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/v0/RMRolesAndActionsAPI.java @@ -39,6 +39,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Map; +import java.util.Set; import org.alfresco.dataprep.AlfrescoHttpClient; import org.alfresco.dataprep.AlfrescoHttpClientFactory; @@ -70,6 +71,10 @@ import org.springframework.stereotype.Component; @Component public class RMRolesAndActionsAPI extends BaseAPI { + /** The URI to view the configured roles and capabilities. */ + private static final String RM_ROLES = "{0}rma/admin/rmroles"; + /** The URI for REST requests about a particular configured role. */ + private static final String RM_ROLES_ROLE = RM_ROLES + "/{1}"; private static final String RM_ROLES_AUTHORITIES = "{0}rm/roles/{1}/authorities/{2}?alf_ticket={3}"; // logger @@ -88,6 +93,75 @@ public class RMRolesAndActionsAPI extends BaseAPI @Autowired private ContentService contentService; + /** + * Get all the configured RM roles. + * + * @param adminUser The RM admin user. + * @param adminPassword The password of the user. + * @return The RM roles in the system (Note that this will be the internal names, not the display labels). + */ + public Set getConfiguredRoles(String adminUser, String adminPassword) + { + // Using "is=true" includes the in-place readers and writers. + JSONObject jsonObject = doGetRequest(adminUser, adminPassword, RM_ROLES + "?is=true").getJSONObject("data"); + return jsonObject.toMap().keySet(); + } + + /** + * Get the capabilities for a given role. + * + * @param adminUser The RM admin user. + * @param adminPassword The password of the user. + * @param role The role to get capabilities for. + * @return The set of system names for the capabilities. + */ + public Set getCapabilitiesForRole(String adminUser, String adminPassword, String role) + { + JSONObject jsonObject = doGetRequest(adminUser, adminPassword, RM_ROLES).getJSONObject("data"); + assertTrue("Could not find role '" + role + "' in " + jsonObject.keySet(), jsonObject.has(role)); + return jsonObject.getJSONObject(role).getJSONObject("capabilities").keySet(); + } + + /** + * Create a new RM role. + * + * @param adminUser The username of the admin user. + * @param adminPassword The password for the admin user. + * @param roleName The name of the new role. + * @param roleDisplayLabel A human-readable label for the role. + * @param capabilities A list of capabilities for the role. + */ + public void createRole(String adminUser, String adminPassword, String roleName, String roleDisplayLabel, Set capabilities) + { + JSONObject requestBody = new JSONObject(); + requestBody.put("name", roleName); + requestBody.put("displayLabel", roleDisplayLabel); + JSONArray capabilitiesArray = new JSONArray(); + capabilities.forEach(capabilitiesArray::put); + requestBody.put("capabilities", capabilitiesArray); + doPostJsonRequest(adminUser, adminPassword, HttpStatus.SC_OK, requestBody, RM_ROLES); + } + + /** + * Update an existing RM role. + * + * @param adminUser The username of the admin user. + * @param adminPassword The password for the admin user. + * @param roleName The name of the new role. + * @param roleDisplayLabel A human-readable label for the role. + * @param capabilities A list of capabilities for the role. + */ + public void updateRole(String adminUser, String adminPassword, String roleName, String roleDisplayLabel, Set capabilities) + { + JSONObject requestBody = new JSONObject(); + requestBody.put("name", roleName); + requestBody.put("displayLabel", roleDisplayLabel); + JSONArray capabilitiesArray = new JSONArray(); + capabilities.forEach(capabilitiesArray::put); + requestBody.put("capabilities", capabilitiesArray); + doPutJsonRequest(adminUser, adminPassword, HttpStatus.SC_OK, requestBody, RM_ROLES_ROLE, roleName); + } + /** * create user and assign to records management role */ diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/rmroles/RMRolesTests.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/rmroles/RMRolesTests.java new file mode 100644 index 0000000000..daef946a79 --- /dev/null +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/rmroles/RMRolesTests.java @@ -0,0 +1,114 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2018 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.rmroles; + +import static java.util.Collections.singleton; + +import static com.google.common.collect.Sets.newHashSet; + +import static org.alfresco.rest.rm.community.model.user.UserRoles.RM_ROLES; +import static org.alfresco.rest.rm.community.model.user.UserRoles.ROLE_RM_USER; +import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Set; + +import org.alfresco.rest.rm.community.base.BaseRMRestTest; +import org.alfresco.rest.v0.RMRolesAndActionsAPI; +import org.springframework.beans.factory.annotation.Autowired; +import org.testng.annotations.Test; + +/** + * API tests of RM roles. + * + * @author Tom Page + * @since 2.7 + */ +public class RMRolesTests extends BaseRMRestTest +{ + /** The id of the view records capability. */ + public static final String VIEW_RECORDS_CAP = "ViewRecords"; + /** The id of the declare records capability. */ + public static final String DECLARE_RECORDS_CAP = "DeclareRecords"; + /** A list of capabilities. */ + private static final java.util.HashSet CAPABILITIES = newHashSet(VIEW_RECORDS_CAP, DECLARE_RECORDS_CAP); + /** The API for managing RM roles and capabilities. */ + @Autowired + private RMRolesAndActionsAPI rmRolesAndActionsAPI; + + /** Check that the roles API returns the default RM roles. */ + @Test(description = "Check the default RM roles exist.") + public void checkRMRolesExist() + { + Set configuredRoles = rmRolesAndActionsAPI + .getConfiguredRoles(getAdminUser().getUsername(), getAdminUser().getPassword()); + RM_ROLES.forEach(role -> assertTrue("Could not found role " + role, configuredRoles.contains(role))); + } + + /** Check that the RM user has the capability to view and declare records. */ + @Test(description = "Check the capabilities for the RM user.") + public void checkCapabilitiesForUser() + { + Set capabilities = rmRolesAndActionsAPI + .getCapabilitiesForRole(getAdminUser().getUsername(), getAdminUser().getPassword(), ROLE_RM_USER); + assertEquals("Unexpected capabilities found for RM User.", capabilities, CAPABILITIES); + } + + /** Check that a new role can be created and retrieved. */ + @Test(description = "Create a new role.") + public void createNewRole() + { + String roleName = generateTestPrefix(RMRolesTests.class) + "newName"; + + // Call the endpoint under test. + rmRolesAndActionsAPI.createRole(getAdminUser().getUsername(), getAdminUser().getPassword(), roleName, + "New Role Label", CAPABILITIES); + + Set actualCapabilities = rmRolesAndActionsAPI + .getCapabilitiesForRole(getAdminUser().getUsername(), getAdminUser().getPassword(), roleName); + assertEquals("Unexpected capabilities found for RM User.", actualCapabilities, CAPABILITIES); + } + + /** Check that a role can be edited. */ + @Test(description = "Update a role.") + public void updateRole() + { + String roleName = generateTestPrefix(RMRolesTests.class) + "Name"; + rmRolesAndActionsAPI.createRole(getAdminUser().getUsername(), getAdminUser().getPassword(), roleName, "Label", + singleton(VIEW_RECORDS_CAP)); + + // Call the endpoint under test. + rmRolesAndActionsAPI.updateRole(getAdminUser().getUsername(), getAdminUser().getPassword(), roleName, + "Updated Label", singleton(DECLARE_RECORDS_CAP)); + + Set actualCapabilities = rmRolesAndActionsAPI + .getCapabilitiesForRole(getAdminUser().getUsername(), getAdminUser().getPassword(), roleName); + assertEquals("Unexpected capabilities for edited RM User.", actualCapabilities, singleton(DECLARE_RECORDS_CAP)); + } +}