mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
add support for writing tests via API for Audit
simple test for checking the create user event is audited
This commit is contained in:
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* #%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 <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.rest.rm.community.model.audit;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.alfresco.utility.model.TestModel;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode (callSuper = true)
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@JsonIgnoreProperties (ignoreUnknown = true)
|
||||||
|
public class AuditEntry extends TestModel
|
||||||
|
{
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String nodeName;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private List<Object> changedValues;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String identifier;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String nodeRef;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String fullName;
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
private String createPerson;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String userRole;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String nodeType;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String event;
|
||||||
|
|
||||||
|
@JsonProperty (required = true)
|
||||||
|
private String timestamp;
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* #%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 <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.rest.rm.community.model.audit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerates the list of events audited
|
||||||
|
* @author Rodica Sutu
|
||||||
|
* @since 2.7
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public enum AuditEvents
|
||||||
|
{
|
||||||
|
CREATE_PERSON("Create Person","Create User"),
|
||||||
|
DELETE_PERSON("Delete Person","Delete User");
|
||||||
|
/** event audited */
|
||||||
|
public final String event;
|
||||||
|
|
||||||
|
/** display name for the event audited */
|
||||||
|
public final String eventDisplayName;
|
||||||
|
|
||||||
|
AuditEvents(String event, String displayName)
|
||||||
|
{
|
||||||
|
this.event = event;
|
||||||
|
this.eventDisplayName = displayName;
|
||||||
|
}
|
||||||
|
}
|
@@ -28,9 +28,18 @@ package org.alfresco.rest.rm.community.util;
|
|||||||
|
|
||||||
import static org.alfresco.rest.rm.community.util.ParameterCheck.mandatoryObject;
|
import static org.alfresco.rest.rm.community.util.ParameterCheck.mandatoryObject;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.type.CollectionType;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class for creating the json object
|
* Utility class for creating the json object
|
||||||
@@ -40,6 +49,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
*/
|
*/
|
||||||
public class PojoUtility
|
public class PojoUtility
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Logger for the class.
|
||||||
|
*/
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(PojoUtility.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* see {@link #toJson(Object, Class, Class)}
|
* see {@link #toJson(Object, Class, Class)}
|
||||||
*/
|
*/
|
||||||
@@ -85,4 +99,54 @@ public class PojoUtility
|
|||||||
return error.toString();
|
return error.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converting json to object
|
||||||
|
*
|
||||||
|
* @param json The json object to convert
|
||||||
|
* @param classz Class (or interface) whose annotations to effectively override
|
||||||
|
* @return The converted java object
|
||||||
|
* @throws JsonProcessingException Throws exceptions if the given object doesn't match to the POJO class model
|
||||||
|
*/
|
||||||
|
public static <T> T jsonToObject(JSONObject json, Class<T> classz)
|
||||||
|
{
|
||||||
|
mandatoryObject("model", classz);
|
||||||
|
mandatoryObject("jsonObject", json);
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
T obj = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
obj = mapper.readValue(json.toString(), classz);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
LOGGER.error("Unable to convert the json into a java object.", e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T) obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> List<T> jsonToObject(JSONArray json, Class<T> classz)
|
||||||
|
{
|
||||||
|
|
||||||
|
mandatoryObject("model", classz);
|
||||||
|
mandatoryObject("jsonObject", json);
|
||||||
|
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
||||||
|
CollectionType collectionType = mapper.getTypeFactory().constructCollectionType(List.class, classz);
|
||||||
|
List<T> asList = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
asList = mapper.readValue(json.toString(), collectionType);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
LOGGER.error("Unable to convert the json array into a java collection.", e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return asList;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* #%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 <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.rest.v0;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.alfresco.rest.core.v0.BaseAPI;
|
||||||
|
import org.alfresco.rest.rm.community.model.audit.AuditEntry;
|
||||||
|
import org.alfresco.rest.rm.community.util.PojoUtility;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The v0 REST API for copy-to (which supports multi-item copy).
|
||||||
|
*
|
||||||
|
* @author Tom Page
|
||||||
|
* @since 2.6
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RMAuditAPI extends BaseAPI
|
||||||
|
{
|
||||||
|
/** Logger for the class. */
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(RMAuditAPI.class);
|
||||||
|
/** The URI for the audit API. */
|
||||||
|
/**
|
||||||
|
* The URI for the copy-to API.
|
||||||
|
*/
|
||||||
|
private static final String RM_AUDIT_API = "{0}rma/admin/rmauditlog";
|
||||||
|
private static final String RM_AUDIT_LOG_API = RM_AUDIT_API + "?{1}";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of audit entries audit of Records Management events. .
|
||||||
|
*
|
||||||
|
* @param user The username of the user to use.
|
||||||
|
* @param password The password of the user.
|
||||||
|
* @param size Maximum number of log entries to return
|
||||||
|
* @param event Only return log entries matching this event
|
||||||
|
* @return return the A
|
||||||
|
*/
|
||||||
|
public List<AuditEntry> getRMAuditLog(String user, String password, final int size, final String event)
|
||||||
|
{
|
||||||
|
String parameters = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
parameters = "size=" + size + (event != null ? "&event=" + URLEncoder.encode(event, "UTF-8"): null );
|
||||||
|
}
|
||||||
|
catch (UnsupportedEncodingException e)
|
||||||
|
{
|
||||||
|
LOGGER.error("Unable to encode the event name" + e.getMessage());
|
||||||
|
}
|
||||||
|
JSONArray auditEntries = doGetRequest(user, password,
|
||||||
|
MessageFormat.format(RM_AUDIT_LOG_API,"{0}", parameters)).getJSONObject("data").getJSONArray("entries");
|
||||||
|
|
||||||
|
return PojoUtility.jsonToObject(auditEntries, AuditEntry.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the list of audit entries audit of Records Management events. .
|
||||||
|
*
|
||||||
|
* @param username The username of the user to use.
|
||||||
|
* @param password The password of the user.
|
||||||
|
* @throws AssertionError If the API call didn't return a 200 response.
|
||||||
|
*/
|
||||||
|
public void clearAuditLog(String username, String password)
|
||||||
|
{
|
||||||
|
JSONObject deleteStatus = doDeleteRequest(username, password, RM_AUDIT_API);
|
||||||
|
|
||||||
|
assertTrue(deleteStatus != null
|
||||||
|
//audit clear and audit login returned
|
||||||
|
&& getRMAuditLog(username, password, 100, null).size() == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* #%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 <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.rest.rm.community.audit;
|
||||||
|
|
||||||
|
import static org.alfresco.rest.rm.community.model.audit.AuditEvents.CREATE_PERSON;
|
||||||
|
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
|
||||||
|
import static org.testng.AssertJUnit.assertTrue;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
|
||||||
|
import org.alfresco.rest.rm.community.model.audit.AuditEntry;
|
||||||
|
import org.alfresco.rest.v0.RMAuditAPI;
|
||||||
|
import org.alfresco.test.AlfrescoTest;
|
||||||
|
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.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains the tests that check the user events are audited
|
||||||
|
*
|
||||||
|
* @author Rodica Sutu
|
||||||
|
* @since 2.7
|
||||||
|
*/
|
||||||
|
public class AuditUserEventsTests extends BaseRMRestTest
|
||||||
|
{
|
||||||
|
private final String PREFIX = generateTestPrefix(AuditUserEventsTests.class);
|
||||||
|
|
||||||
|
private UserModel createUser;
|
||||||
|
@Autowired
|
||||||
|
private RMAuditAPI rmAuditAPI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given I have created a new user
|
||||||
|
* When I view the RM audit
|
||||||
|
* Then there is an entry showing that I created a user
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@AlfrescoTest(jira = "RM-6223")
|
||||||
|
public void createUserEventIsAudited() throws Exception
|
||||||
|
{
|
||||||
|
String userName = "auditCreateUser" + PREFIX;
|
||||||
|
|
||||||
|
createUser = getDataUser().createUser(userName);
|
||||||
|
List<AuditEntry> auditEntries = rmAuditAPI.getRMAuditLog(getAdminUser().getPassword(),
|
||||||
|
getAdminUser().getPassword(), 100, CREATE_PERSON.event);
|
||||||
|
|
||||||
|
assertTrue("The list of events is not filtered by " + CREATE_PERSON.event,
|
||||||
|
auditEntries.stream().allMatch(auditEntry -> auditEntry.getEvent().equals(CREATE_PERSON.eventDisplayName)));
|
||||||
|
|
||||||
|
assertTrue("The username value for the user created is not audited.",
|
||||||
|
auditEntries.stream().filter(auditEntry -> auditEntry.getEvent().equals(CREATE_PERSON.eventDisplayName))
|
||||||
|
.allMatch(auditEntry -> auditEntry.getNodeName().equals(userName)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass (alwaysRun = true)
|
||||||
|
public void cleanAuditLogs()
|
||||||
|
{
|
||||||
|
//clean audit logs
|
||||||
|
rmAuditAPI.clearAuditLog(getAdminUser().getPassword(), getAdminUser().getPassword());
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass (alwaysRun = true)
|
||||||
|
public void cleanUp()
|
||||||
|
{
|
||||||
|
//delete the created user
|
||||||
|
getDataUser().deleteUser(createUser);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user