2 * This document is a part of the source code and related artifacts
3 * for CollectionSpace, an open source collections management system
4 * for museums and related institutions:
6 * http://www.collectionspace.org
7 * http://wiki.collectionspace.org
9 * Copyright © 2009 Regents of the University of California
11 * Licensed under the Educational Community License (ECL), Version 2.0.
12 * You may not use this file except in compliance with this License.
14 * You may obtain a copy of the ECL 2.0 License at
15 * https://source.collectionspace.org/collection-space/LICENSE.txt
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
23 package org.collectionspace.services.client.test;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
30 import javax.ws.rs.core.Response;
32 import org.collectionspace.services.PersonJAXBSchema;
33 import org.collectionspace.services.client.CollectionSpaceClient;
34 import org.collectionspace.services.client.PayloadOutputPart;
35 import org.collectionspace.services.client.PersonAuthorityClient;
36 import org.collectionspace.services.client.PersonAuthorityClientUtils;
37 import org.collectionspace.services.client.PoxPayloadOut;
38 import org.collectionspace.services.client.RelationClient;
39 import org.collectionspace.services.relation.RelationsCommon;
40 import org.collectionspace.services.relation.RelationsCommonList;
41 import org.collectionspace.services.relation.RelationshipType;
43 import org.jboss.resteasy.client.ClientResponse;
45 import org.testng.Assert;
46 import org.testng.annotations.AfterSuite;
47 import org.testng.annotations.BeforeSuite;
48 import org.testng.annotations.Test;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
54 * RelationServiceTest, carries out tests against a
55 * deployed and running Relation Service.
57 * $LastChangedRevision$
60 public class RelationServiceTest extends AbstractPoxServiceTestImpl<RelationsCommonList, RelationsCommon> {
63 private final String CLASS_NAME = RelationServiceTest.class.getName();
64 private final String PERSON_AUTHORITY_NAME = "TestPersonAuth";
65 private final Logger logger = LoggerFactory.getLogger(CLASS_NAME);
66 private List<String> personIdsCreated = new ArrayList<String>();
68 private static final String UNINITIALIZED_CSID = "-1";
69 private static final String UNINITIALIZED_REFNAME = "null";
71 private static final String PERSONS_DOCUMENT_TYPE = "Person";
72 private String samSubjectPersonCSID = UNINITIALIZED_CSID;
73 private String oliveObjectPersonCSID = UNINITIALIZED_REFNAME;
74 private String samSubjectRefName = UNINITIALIZED_CSID;
75 private String oliveObjectRefName = UNINITIALIZED_REFNAME;
77 private String personAuthCSID = null;
78 private String personShortId = PERSON_AUTHORITY_NAME;
81 /** The SERVICE path component. */
82 final String SERVICE_PATH_COMPONENT = "relations";
85 * @see org.collectionspace.services.client.test.BaseServiceTest#getClientInstance()
88 protected CollectionSpaceClient getClientInstance() {
89 return new RelationClient();
92 protected Class<RelationsCommonList> getCommonListType() {
93 return (Class<RelationsCommonList>)RelationsCommonList.class;
97 * Creates the person refs as a precondition for running the tests in this class.
100 private void createPersonRefs() {
103 PersonAuthorityClient personAuthClient = new PersonAuthorityClient();
104 PoxPayloadOut multipart = PersonAuthorityClientUtils.createPersonAuthorityInstance(
105 PERSON_AUTHORITY_NAME, PERSON_AUTHORITY_NAME, personAuthClient.getCommonPartName());
106 ClientResponse<Response> res = personAuthClient.create(multipart);
107 int statusCode = res.getStatus();
109 Assert.assertTrue(testRequestType.isValidStatusCode(statusCode),
110 invalidStatusCodeMessage(testRequestType, statusCode));
111 Assert.assertEquals(statusCode, STATUS_CREATED);
112 personAuthCSID = extractId(res);
114 String authRefName = PersonAuthorityClientUtils.getAuthorityRefName(personAuthCSID, null);
116 String csid = createPerson("Sam", "Subject", "samSubject", authRefName);
117 Assert.assertNotNull(csid);
118 samSubjectPersonCSID = csid;
119 samSubjectRefName = PersonAuthorityClientUtils.getPersonRefName(personAuthCSID, csid, null);
120 Assert.assertNotNull(samSubjectRefName);
121 personIdsCreated.add(csid);
123 csid = createPerson("Olive", "Object", "oliveObject", authRefName);
124 Assert.assertNotNull(csid);
125 oliveObjectRefName = PersonAuthorityClientUtils.getPersonRefName(personAuthCSID, csid, null);
126 oliveObjectPersonCSID = csid;
127 Assert.assertNotNull(oliveObjectRefName);
128 personIdsCreated.add(csid);
132 private void deletePersonRefs() {
134 // Delete all the persons we created for the tests
138 private String createPerson(String firstName, String surName, String shortId, String authRefName) {
139 PersonAuthorityClient personAuthClient = new PersonAuthorityClient();
140 Map<String, String> personInfo = new HashMap<String, String>();
141 personInfo.put(PersonJAXBSchema.FORE_NAME, firstName);
142 personInfo.put(PersonJAXBSchema.SUR_NAME, surName);
143 personInfo.put(PersonJAXBSchema.SHORT_IDENTIFIER, shortId);
144 PoxPayloadOut multipart =
145 PersonAuthorityClientUtils.createPersonInstance(personAuthCSID,
146 authRefName, personInfo, null, personAuthClient.getItemCommonPartName());
147 ClientResponse<Response> res = personAuthClient.createItem(personAuthCSID, multipart);
148 int statusCode = res.getStatus();
150 Assert.assertTrue(testRequestType.isValidStatusCode(statusCode),
151 invalidStatusCodeMessage(testRequestType, statusCode));
152 Assert.assertEquals(statusCode, STATUS_CREATED);
153 return extractId(res);
156 @Test(dataProvider="testName",
157 dependsOnMethods = {"create"})
158 public void createWithSelfRelation(String testName) throws Exception {
159 // Test result codes setup
160 setupCreateWithInvalidBody();
162 // Submit the request to the service and store the response.
163 RelationClient client = new RelationClient();
164 String identifier = createIdentifier();
165 RelationsCommon relationsCommon = createRelationsCommon(identifier);
166 // Make the subject ID equal to the object ID
167 relationsCommon.setSubjectCsid(relationsCommon.getObjectCsid());
168 PoxPayloadOut multipart = createRelationInstance(relationsCommon);
169 ClientResponse<Response> res = client.create(multipart);
170 int statusCode = res.getStatus();
172 // Check the status code of the response: does it match
173 // the expected response(s)?
175 // Does it fall within the set of valid status codes?
176 // Does it exactly match the expected status code?
177 if(logger.isDebugEnabled()){
178 logger.debug(testName + ": status = " + statusCode);
180 Assert.assertTrue(testRequestType.isValidStatusCode(statusCode),
181 invalidStatusCodeMessage(testRequestType, statusCode));
182 Assert.assertEquals(statusCode, STATUS_BAD_REQUEST); //should be an error: same objectID and subjectID are not allowed by validator.
186 * This method is called by the base class method (test) readList().
191 protected void printList(String testName, RelationsCommonList list) {
192 List<RelationsCommonList.RelationListItem> items =
193 list.getRelationListItem();
195 for(RelationsCommonList.RelationListItem item : items){
196 logger.debug(testName + ": list-item[" + i + "] csid=" +
198 logger.debug(testName + ": list-item[" + i + "] URI=" +
204 // ---------------------------------------------------------------
205 // Utility methods used by tests above
206 // ---------------------------------------------------------------
208 * @see org.collectionspace.services.client.test.BaseServiceTest#getServicePathComponent()
211 public String getServicePathComponent() {
212 return SERVICE_PATH_COMPONENT;
215 private RelationsCommon createRelationsCommon(String identifier) {
216 RelationsCommon relationCommon = new RelationsCommon();
217 fillRelation(relationCommon, identifier);
218 return relationCommon;
221 private PoxPayloadOut createRelationInstance(RelationsCommon relation) {
222 PoxPayloadOut result = new PoxPayloadOut(this.getServicePathComponent());
223 PayloadOutputPart commonPart =
224 result.addPart(new RelationClient().getCommonPartName(), relation);
225 if(logger.isDebugEnabled()){
226 logger.debug("to be created, relation common");
227 logger.debug(objectAsXmlString(relation, RelationsCommon.class));
233 * Creates the relation instance.
235 * @param identifier the identifier
236 * @return the multipart output
238 private PoxPayloadOut createRelationInstance(String identifier) {
239 RelationsCommon relation = createRelationsCommon(identifier);
240 PoxPayloadOut result = createRelationInstance(relation);
245 * Fills the relation.
247 * @param relationCommon the relation
248 * @param identifier the identifier
250 private void fillRelation(RelationsCommon relationCommon, String identifier) {
251 fillRelation(relationCommon, samSubjectPersonCSID, null, oliveObjectPersonCSID, null,
252 RelationshipType.COLLECTIONOBJECT_INTAKE.toString(),
253 RelationshipType.COLLECTIONOBJECT_INTAKE + ".displayName-" + identifier);
257 * Fills the relation.
259 * @param relationCommon the relation
260 * @param subjectCsid the subject document id
261 * @param subjectDocumentType the subject document type
262 * @param objectCsid the object document id
263 * @param objectDocumentType the object document type
266 private void fillRelation(RelationsCommon relationCommon,
267 String subjectCsid, String subjectDocumentType,
268 String objectCsid, String objectDocumentType,
270 String rtDisplayName) {
271 relationCommon.setSubjectCsid(subjectCsid);
272 relationCommon.setSubjectDocumentType(subjectDocumentType);
273 relationCommon.setObjectCsid(objectCsid);
274 relationCommon.setObjectDocumentType(objectDocumentType);
276 relationCommon.setRelationshipType(rt);
277 relationCommon.setPredicateDisplayName(rtDisplayName);
281 protected String getServiceName() {
282 return RelationClient.SERVICE_NAME;
286 public void CRUDTests(String testName) {
287 // TODO Auto-generated method stub
292 protected PoxPayloadOut createInstance(String commonPartName,
294 return createRelationInstance(identifier);
298 protected RelationsCommon updateInstance(RelationsCommon relationCommon) {
299 RelationsCommon result = new RelationsCommon();
301 // Update the content of this resource, inverting subject and object
302 result.setSubjectCsid(relationCommon.getObjectCsid());
303 result.setSubjectDocumentType("Hooey"); // DocumentType changes should be ignored.
304 result.setObjectCsid(relationCommon.getSubjectCsid());
305 result.setObjectDocumentType("Fooey"); // DocumentType changes should be ignored.
306 result.setPredicateDisplayName("updated-" + relationCommon.getPredicateDisplayName());
312 protected void compareUpdatedInstances(RelationsCommon original,
313 RelationsCommon updated) throws Exception {
315 "Data in updated object did not match submitted data.";
317 "Data in updated object was not correctly computed.";
319 updated.getSubjectCsid(), original.getSubjectCsid(), msg);
321 updated.getSubjectDocumentType(), PERSONS_DOCUMENT_TYPE, msg2); // DocumentType changes should have been ignored.
323 updated.getObjectCsid(), original.getObjectCsid(), msg);
325 updated.getObjectDocumentType(), PERSONS_DOCUMENT_TYPE, msg2); // DocumentType changes should have been ignored.
327 updated.getPredicateDisplayName(), original.getPredicateDisplayName(), msg);