Unit tests for CMIS no-op policy implementation

- Factored out base class for Alfresco CMIS REST tests
- Corrected getAppliedPolicies implementation

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19437 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Dave Ward
2010-03-21 16:10:47 +00:00
parent cdb58a0d36
commit 634bddf529
6 changed files with 261 additions and 93 deletions

View File

@@ -1219,18 +1219,19 @@ public class CMISScript extends BaseScopableProcessorExtension
/** /**
* Gets the list of policy objects currently applied to a target object. * Gets the list of policy objects currently applied to a target object.
* *
* @param objectId * @param source
* the object id * source node
* @param filter * @param filter
* property filter * property filter
* @throws WebScriptException on error * @throws WebScriptException on error
*/ */
public PagedResults getAppliedPolicies(String objectId, String filter, Page page) public PagedResults getAppliedPolicies(ScriptNode source, String filter, Page page)
{ {
List<CMISTypeDefinition> policies; List<CMISTypeDefinition> policies;
try try
{ {
policies = cmisService.getAppliedPolicies(objectId, filter); policies = cmisService.getAppliedPolicies((String) cmisService.getProperty(source.getNodeRef(),
CMISDictionaryModel.PROP_OBJECT_ID), filter);
} }
catch (CMISServiceException e) catch (CMISServiceException e)
{ {

View File

@@ -18,9 +18,7 @@
*/ */
package org.alfresco.repo.cmis.rest.test; package org.alfresco.repo.cmis.rest.test;
import java.io.Reader;
import java.io.StringReader; import java.io.StringReader;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@@ -29,22 +27,13 @@ import java.util.Set;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import org.alfresco.repo.cmis.rest.AlfrescoCMISExtensionFactory;
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.i18n.iri.IRI; import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element; import org.apache.abdera.model.Element;
import org.apache.abdera.model.Entry; import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Link; import org.apache.abdera.model.Link;
import org.apache.abdera.model.Service;
import org.apache.abdera.parser.Parser;
import org.apache.chemistry.abdera.ext.CMISConstants; import org.apache.chemistry.abdera.ext.CMISConstants;
import org.apache.chemistry.abdera.ext.CMISObject; import org.apache.chemistry.abdera.ext.CMISObject;
import org.apache.chemistry.abdera.ext.CMISProperty; import org.apache.chemistry.abdera.ext.CMISProperty;
import org.apache.chemistry.tck.atompub.client.CMISClient;
import org.apache.chemistry.tck.atompub.utils.ResourceLoader;
import org.junit.Assert; import org.junit.Assert;
import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest; import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest;
import org.springframework.extensions.webscripts.TestWebScriptServer.PostRequest; import org.springframework.extensions.webscripts.TestWebScriptServer.PostRequest;
@@ -54,74 +43,11 @@ import org.springframework.extensions.webscripts.TestWebScriptServer.Response;
/** /**
* Tests Alfresco CMIS REST API extensions for Aspects. * Tests Alfresco CMIS REST API extensions for Aspects.
*
* @author dward
*/ */
public class AspectTest extends BaseWebScriptTest public class AspectTest extends BaseCMISTest
{ {
private static final QName ELEMENT_PROPERTIES = new QName("http://www.alfresco.org", "properties");
private static final QName ELEMENT_APPLIED_ASPECTS = new QName("http://www.alfresco.org", "appliedAspects");
private static final String URL_CMIS = "/cmis";
private Abdera abdera;
private Parser parser;
private Factory factory;
public AspectTest() {
// construct Abdera Service
abdera = new Abdera();
factory = abdera.getFactory();
factory.registerExtension(new AlfrescoCMISExtensionFactory());
parser = factory.newParser();
// construct test templates
localTemplates = new ResourceLoader('/' + AspectTest.class.getPackage().getName().replace('.', '/') + '/');
// Create a dummy client. We won't / can't use it to make requests.
cmisClient = new CMISClient(null, null, null, null);
}
private CMISClient cmisClient;
private ResourceLoader localTemplates;
private Service cmisService;
private Entry testCaseFolder;
@Override
public void setUp() throws Exception
{
super.setUp();
setDefaultRunAs("admin");
Request req = new GetRequest(URL_CMIS);
Response res = sendRequest(req, 200);
String xml = res.getContentAsString();
Assert.assertNotNull(xml);
Assert.assertTrue(xml.length() > 0);
cmisService = parse(new StringReader(xml));
Assert.assertNotNull(cmisService);
IRI rootFolderHREF = cmisClient.getRootCollection(cmisClient.getWorkspace(cmisService));
Assert.assertNotNull(rootFolderHREF);
String folderName = getClass().getSimpleName() + System.currentTimeMillis() + " - " + getName();
testCaseFolder = createObject(rootFolderHREF, folderName, "cmis:folder");
}
private <T extends Element> T parse(Reader doc) {
Document<T> entryDoc = parser.parse(doc);
return entryDoc.getRoot();
}
private Entry createObject(IRI parent, String name, String type) throws Exception {
String createFolder = localTemplates.load("AspectTest.createObject.atomentry.xml");
createFolder = createFolder.replace("${NAME}", name);
createFolder = createFolder.replace("${TYPE}", type);
Request req = new PostRequest(parent.toString(), createFolder, CMISConstants.MIMETYPE_ENTRY);
Response res = sendRequest(req, 201);
Assert.assertNotNull(res);
String xml = res.getContentAsString();
Entry entry = parse(new StringReader(xml));
Assert.assertNotNull(entry);
return entry;
}
public void testAspectSet() throws Exception public void testAspectSet() throws Exception
{ {
// create document for checkout // create document for checkout
@@ -213,16 +139,4 @@ public class AspectTest extends BaseWebScriptTest
} }
} }
} }
private void assertContains(Set<String> actual, String... expected)
{
Assert.assertTrue(actual.containsAll(Arrays.asList(expected)));
}
private void assertDoesNotContain(Set<String> actual, String... unexpected)
{
Set<String> copy = new HashSet<String>(actual);
copy.retainAll(Arrays.asList(unexpected));
Assert.assertTrue(copy.isEmpty());
}
} }

View File

@@ -0,0 +1,158 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* 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/>.
*/
package org.alfresco.repo.cmis.rest.test;
import java.io.Reader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.xml.namespace.QName;
import org.alfresco.repo.cmis.rest.AlfrescoCMISExtensionFactory;
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Service;
import org.apache.abdera.parser.ParseException;
import org.apache.abdera.parser.Parser;
import org.apache.chemistry.abdera.ext.CMISConstants;
import org.apache.chemistry.tck.atompub.client.CMISClient;
import org.apache.chemistry.tck.atompub.utils.ResourceLoader;
import org.junit.Assert;
import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest;
import org.springframework.extensions.webscripts.TestWebScriptServer.PostRequest;
import org.springframework.extensions.webscripts.TestWebScriptServer.Request;
import org.springframework.extensions.webscripts.TestWebScriptServer.Response;
/**
* Base class for Alfresco specific CMIS REST API tests.
*
* @author dward
*/
public abstract class BaseCMISTest extends BaseWebScriptTest
{
protected static final QName ELEMENT_PROPERTIES = new QName("http://www.alfresco.org", "properties");
protected static final QName ELEMENT_APPLIED_ASPECTS = new QName("http://www.alfresco.org", "appliedAspects");
protected static final String URL_CMIS = "/cmis";
protected Abdera abdera;
protected Parser parser;
protected Factory factory;
public BaseCMISTest()
{
// construct Abdera Service
abdera = new Abdera();
factory = abdera.getFactory();
factory.registerExtension(new AlfrescoCMISExtensionFactory());
parser = factory.newParser();
// construct test templates
localTemplates = new ResourceLoader('/' + getClass().getPackage().getName().replace('.', '/') + '/');
// Create a dummy client. We won't / can't use it to make requests.
cmisClient = new CMISClient(null, null, null, null);
}
protected CMISClient cmisClient;
protected ResourceLoader localTemplates;
protected Service cmisService;
protected Entry testCaseFolder;
@Override
public void setUp() throws Exception
{
super.setUp();
setDefaultRunAs("admin");
Request req = new GetRequest(URL_CMIS);
Response res = sendRequest(req, 200);
String xml = res.getContentAsString();
Assert.assertNotNull(xml);
Assert.assertTrue(xml.length() > 0);
cmisService = parse(new StringReader(xml));
Assert.assertNotNull(cmisService);
IRI rootFolderHREF = cmisClient.getRootCollection(cmisClient.getWorkspace(cmisService));
Assert.assertNotNull(rootFolderHREF);
String folderName = getClass().getSimpleName() + System.currentTimeMillis() + " - " + getName();
testCaseFolder = createObject(rootFolderHREF, folderName, "cmis:folder");
}
protected <T extends Element> T parse(Reader doc)
{
Document<T> entryDoc = parser.parse(doc);
return entryDoc.getRoot();
}
protected <T extends Element> T fetch(IRI href, Map<String, String> args) throws Exception
{
Request get = new GetRequest(href.toString()).setArgs(args);
Response res = sendRequest(get, 200);
Assert.assertNotNull(res);
String xml = res.getContentAsString();
T result = parse(new StringReader(xml));
Assert.assertNotNull(result);
return result;
}
protected Entry createObject(IRI parent, String name, String type) throws Exception
{
return createObject(parent, name, type, 201);
}
protected Entry createObject(IRI parent, String name, String type, int expectedStatus) throws Exception
{
String createObject = localTemplates.load("BaseCMISTest.createObject.atomentry.xml");
createObject = createObject.replace("${NAME}", name);
createObject = createObject.replace("${TYPE}", type);
Request req = new PostRequest(parent.toString(), createObject, CMISConstants.MIMETYPE_ENTRY);
Response res = sendRequest(req, expectedStatus);
Assert.assertNotNull(res);
try
{
String xml = res.getContentAsString();
return parse(new StringReader(xml));
}
catch (ParseException e)
{
return null;
}
}
protected void assertContains(Set<String> actual, String... expected)
{
Assert.assertTrue(actual.containsAll(Arrays.asList(expected)));
}
protected void assertDoesNotContain(Set<String> actual, String... unexpected)
{
Set<String> copy = new HashSet<String>(actual);
copy.retainAll(Arrays.asList(unexpected));
Assert.assertTrue(copy.isEmpty());
}
}

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/"
xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/">
<id>urn:uuid:00000000-0000-0000-0000-000000000000</id>
<title>${OBJECTID}</title>
<updated>2010-01-01T00:00:00Z</updated>
<author>admin</author>
<link rel="alternate" href="" />
<summary>${OBJECTID} (summary)</summary>
<cmisra:object>
<cmis:properties>
<cmis:propertyId propertyDefinitionId="cmis:objectId">
<cmis:value>${OBJECTID}</cmis:value>
</cmis:propertyId>
</cmis:properties>
</cmisra:object>
</entry>

View File

@@ -0,0 +1,78 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* 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/>.
*/
package org.alfresco.repo.cmis.rest.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.model.Link;
import org.apache.chemistry.abdera.ext.CMISConstants;
import org.apache.chemistry.abdera.ext.CMISTypeDefinition;
import org.junit.Assert;
import org.springframework.extensions.webscripts.TestWebScriptServer.PostRequest;
import org.springframework.extensions.webscripts.TestWebScriptServer.Request;
/**
* Tests Alfresco CMIS Policy implementation.
*
* @author dward
*/
public class PolicyTest extends BaseCMISTest
{
public void testPolicies() throws Exception
{
// Try creating an object with the cmis:policy base type (expect a constraint exception)
Link children = cmisClient.getChildrenLink(testCaseFolder);
createObject(children.getHref(), getName(), "cmis:policy", 409);
// Try creating an object of any of the cmis:policy subtypes
IRI typesHREF = cmisClient.getTypesChildrenCollection(cmisClient.getWorkspace(cmisService));
Map<String, String> args = new HashMap<String, String>();
args.put("typeId", "cmis:policy");
args.put("includePropertyDefinitions", "true");
Feed types = fetch(typesHREF, args);
List<Entry> entries = types.getEntries();
assertNotSame(0, entries.size());
for (Entry type : entries) {
CMISTypeDefinition entryType = type.getExtension(CMISConstants.TYPE_DEFINITION);
Assert.assertNotNull(entryType);
createObject(children.getHref(), getName(), entryType.getId(), 409);
}
// Create a document to attempt to apply policies to
Entry document = createObject(children.getHref(), getName(), "cmis:document");
// retrieve policies feed on document (this should be empty)
Link polsLink = document.getLink(CMISConstants.REL_POLICIES);
assertNotNull(polsLink);
Feed polsBefore = fetch(polsLink.getHref(), null);
assertNotNull(polsBefore);
assertEquals(0, polsBefore.getEntries().size());
// Try applying a policy (expect a constraint exception)
String policyFile = localTemplates.load("PolicyTest.applyPolicy.atomentry.xml");
policyFile = policyFile.replace("${OBJECTID}", "doesnotexist");
Request req = new PostRequest(polsLink.getHref().toString(), policyFile, CMISConstants.MIMETYPE_ENTRY);
sendRequest(req, 409);
}
}