]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
55dea04c66b3bbf09199d7316876f8a1d1e9839b
[tmp/jakarta-migration.git] /
1 /**
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:
5  *
6  * http://www.collectionspace.org
7  * http://wiki.collectionspace.org
8  *
9  * Copyright © 2009 Regents of the University of California
10  *
11  * Licensed under the Educational Community License (ECL), Version 2.0.
12  * You may not use this file except in compliance with this License.
13  *
14  * You may obtain a copy of the ECL 2.0 License at
15  * https://source.collectionspace.org/collection-space/LICENSE.txt
16  *
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.
22  */
23 package org.collectionspace.services.client.test;
24
25 import java.util.List;
26 import javax.ws.rs.core.MediaType;
27 import javax.ws.rs.core.Response;
28
29 import org.collectionspace.services.client.CollectionSpaceClient;
30 import org.collectionspace.services.client.RelationClient;
31 import org.collectionspace.services.jaxb.AbstractCommonList;
32 import org.collectionspace.services.relation.RelationsCommon;
33 import org.collectionspace.services.relation.RelationsCommonList;
34 import org.collectionspace.services.relation.RelationshipType;
35
36 import org.jboss.resteasy.client.ClientResponse;
37
38 import org.jboss.resteasy.plugins.providers.multipart.MultipartInput;
39 import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput;
40 import org.jboss.resteasy.plugins.providers.multipart.OutputPart;
41 import org.testng.Assert;
42 import org.testng.annotations.Test;
43
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 /**
48  * RelationServiceTest, carries out tests against a
49  * deployed and running Relation Service.
50  * 
51  * $LastChangedRevision$
52  * $LastChangedDate$
53  */
54 public class RelationServiceTest extends AbstractServiceTestImpl {
55
56    /** The logger. */
57     private final String CLASS_NAME = RelationServiceTest.class.getName();
58     private final Logger logger = LoggerFactory.getLogger(CLASS_NAME);
59
60     /** The SERVICE path component. */
61     final String SERVICE_PATH_COMPONENT = "relations";
62     
63     /** The known resource id. */
64     private String knownResourceId = null;
65     
66     /* (non-Javadoc)
67      * @see org.collectionspace.services.client.test.BaseServiceTest#getClientInstance()
68      */
69     @Override
70     protected CollectionSpaceClient getClientInstance() {
71         return new RelationClient();
72     }
73     
74     /* (non-Javadoc)
75      * @see org.collectionspace.services.client.test.BaseServiceTest#getAbstractCommonList(org.jboss.resteasy.client.ClientResponse)
76      */
77     @Override
78         protected AbstractCommonList getAbstractCommonList(
79                         ClientResponse<AbstractCommonList> response) {
80         return response.getEntity(RelationsCommonList.class);
81     }
82  
83     // ---------------------------------------------------------------
84     // CRUD tests : CREATE tests
85     // ---------------------------------------------------------------
86     // Success outcomes
87     /* (non-Javadoc)
88      * @see org.collectionspace.services.client.test.ServiceTest#create(java.lang.String)
89      */
90     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class)
91     @Override
92     public void create(String testName) throws Exception {
93
94         if (logger.isDebugEnabled()) {
95             logger.debug(testBanner(testName, CLASS_NAME));
96         }
97         // Perform setup, such as initializing the type of service request
98         // (e.g. CREATE, DELETE), its valid and expected status codes, and
99         // its associated HTTP method name (e.g. POST, DELETE).
100         setupCreate();
101
102         // Submit the request to the service and store the response.
103         RelationClient client = new RelationClient();
104         String identifier = createIdentifier();
105         MultipartOutput multipart = createRelationInstance(identifier);
106         ClientResponse<Response> res = client.create(multipart);
107         int statusCode = res.getStatus();
108
109         // Check the status code of the response: does it match
110         // the expected response(s)?
111         //
112         // Does it fall within the set of valid status codes?
113         // Does it exactly match the expected status code?
114         if(logger.isDebugEnabled()){
115             logger.debug(testName + ": status = " + statusCode);
116         }
117         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
118                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
119         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
120
121         // Store the ID returned from the first resource created
122         // for additional tests below.
123         if (knownResourceId == null){
124             knownResourceId = extractId(res);
125             if (logger.isDebugEnabled()) {
126                 logger.debug(testName + ": knownResourceId=" + knownResourceId);
127             }
128         }
129
130         // Store the IDs from every resource created by tests,
131         // so they can be deleted after tests have been run.
132         allResourceIdsCreated.add(extractId(res));
133     }
134
135     /* (non-Javadoc)
136      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createList(java.lang.String)
137      */
138     @Override
139     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
140         dependsOnMethods = {"create"})
141     public void createList(String testName) throws Exception {
142         for(int i = 0; i < 3; i++){
143             create(testName);
144         }
145     }
146
147     // Failure outcomes
148     // Placeholders until the three tests below can be uncommented.
149     // See Issue CSPACE-401.
150     /* (non-Javadoc)
151      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createWithEmptyEntityBody(java.lang.String)
152      */
153     @Override
154     public void createWithEmptyEntityBody(String testName) throws Exception {
155         //Should this test really be empty?
156     }
157
158     /* (non-Javadoc)
159      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createWithMalformedXml(java.lang.String)
160      */
161     @Override
162     public void createWithMalformedXml(String testName) throws Exception {
163         //Should this test really be empty?
164     }
165
166     /* (non-Javadoc)
167      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createWithWrongXmlSchema(java.lang.String)
168      */
169     @Override
170     public void createWithWrongXmlSchema(String testName) throws Exception {
171         //Should this test really be empty?
172     }
173
174     /*
175     @Override
176     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTest.class,
177         dependsOnMethods = {"create", "testSubmitRequest"})
178     public void createWithEmptyEntityBody(String testName) throws Exception {
179     
180             if (logger.isDebugEnabled()) {
181             logger.debug(testBanner(testName, CLASS_NAME));
182         }
183         // Perform setup.
184         setupCreateWithEmptyEntityBody();
185
186         // Submit the request to the service and store the response.
187         String method = REQUEST_TYPE.httpMethodName();
188         String url = getServiceRootURL();
189         String mediaType = MediaType.APPLICATION_XML;
190         final String entity = "";
191         int statusCode = submitRequest(method, url, mediaType, entity);
192
193         // Check the status code of the response: does it match
194         // the expected response(s)?
195         if(logger.isDebugEnabled()){
196             logger.debug(testName + ": url=" + url +
197                 " status=" + statusCode);
198          }
199         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
200         invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
201         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
202     }
203
204     @Override
205     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTest.class,
206         dependsOnMethods = {"create", "testSubmitRequest"})
207     public void createWithMalformedXml(String testName) throws Exception {
208     
209             if (logger.isDebugEnabled()) {
210             logger.debug(testBanner(testName, CLASS_NAME));
211         }
212         // Perform setup.
213         setupCreateWithMalformedXml();
214
215         // Submit the request to the service and store the response.
216         String method = REQUEST_TYPE.httpMethodName();
217         String url = getServiceRootURL();
218         String mediaType = MediaType.APPLICATION_XML;
219         final String entity = MALFORMED_XML_DATA; // Constant from base class.
220         int statusCode = submitRequest(method, url, mediaType, entity);
221
222         // Check the status code of the response: does it match
223         // the expected response(s)?
224         if(logger.isDebugEnabled()){
225             logger.debug(testName + ": url=" + url +
226                 " status=" + statusCode);
227          }
228         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
229         invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
230         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
231     }
232
233     @Override
234     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTest.class,
235         dependsOnMethods = {"create", "testSubmitRequest"})
236     public void createWithWrongXmlSchema(String testName) throws Exception {
237     
238             if (logger.isDebugEnabled()) {
239             logger.debug(testBanner(testName, CLASS_NAME));
240         }
241         // Perform setup.
242         setupCreateWithWrongXmlSchema();
243
244         // Submit the request to the service and store the response.
245         String method = REQUEST_TYPE.httpMethodName();
246         String url = getServiceRootURL();
247         String mediaType = MediaType.APPLICATION_XML;
248         final String entity = WRONG_XML_SCHEMA_DATA;
249         int statusCode = submitRequest(method, url, mediaType, entity);
250
251         // Check the status code of the response: does it match
252         // the expected response(s)?
253         if(logger.isDebugEnabled()){
254           logger.debug(testName + ": url=" + url +
255               " status=" + statusCode);
256          }
257         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
258         invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
259         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
260     }
261      */
262
263     // ---------------------------------------------------------------
264     // CRUD tests : READ tests
265     // ---------------------------------------------------------------
266     // Success outcomes
267     /* (non-Javadoc)
268      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#read(java.lang.String)
269      */
270     @Override
271     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
272         dependsOnMethods = {"create"})
273     public void read(String testName) throws Exception {
274
275         if (logger.isDebugEnabled()) {
276             logger.debug(testBanner(testName, CLASS_NAME));
277         }
278         // Perform setup.
279         setupRead();
280
281         // Submit the request to the service and store the response.
282         RelationClient client = new RelationClient();
283         ClientResponse<MultipartInput> res = client.read(knownResourceId);
284         int statusCode = res.getStatus();
285
286         // Check the status code of the response: does it match
287         // the expected response(s)?
288         if(logger.isDebugEnabled()){
289             logger.debug(testName + ": status = " + statusCode);
290         }
291         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
292                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
293         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
294
295         // Verify that the resource identifier ...
296         MultipartInput input = (MultipartInput) res.getEntity();
297         RelationsCommon relation = (RelationsCommon) extractPart(input,
298                 client.getCommonPartName(), RelationsCommon.class);
299         Assert.assertNotNull(relation);
300
301     }
302
303     // Failure outcomes
304     /* (non-Javadoc)
305      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#readNonExistent(java.lang.String)
306      */
307     @Override
308     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
309         dependsOnMethods = {"read"})
310     public void readNonExistent(String testName) throws Exception {
311
312         if (logger.isDebugEnabled()) {
313             logger.debug(testBanner(testName, CLASS_NAME));
314         }
315         // Perform setup.
316         setupReadNonExistent();
317
318         // Submit the request to the service and store the response.
319         RelationClient client = new RelationClient();
320         ClientResponse<MultipartInput> res = client.read(NON_EXISTENT_ID);
321         int statusCode = res.getStatus();
322
323         // Check the status code of the response: does it match
324         // the expected response(s)?
325         if(logger.isDebugEnabled()){
326             logger.debug(testName + ": status = " + statusCode);
327         }
328         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
329                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
330         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
331     }
332    
333     // ---------------------------------------------------------------
334     // CRUD tests : READ_LIST tests
335     // ---------------------------------------------------------------
336     // Success outcomes
337     /* (non-Javadoc)
338      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#readList(java.lang.String)
339      */
340     @Override
341     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
342         dependsOnMethods = {"createList", "read"})
343     public void readList(String testName) throws Exception {
344
345         if (logger.isDebugEnabled()) {
346             logger.debug(testBanner(testName, CLASS_NAME));
347         }
348         // Perform setup.
349         setupReadList();
350
351         // Submit the request to the service and store the response.
352         RelationClient client = new RelationClient();
353         ClientResponse<RelationsCommonList> res = client.readList();
354         RelationsCommonList list = res.getEntity();
355         int statusCode = res.getStatus();
356
357         // Check the status code of the response: does it match
358         // the expected response(s)?
359         if(logger.isDebugEnabled()){
360             logger.debug(testName + ": status = " + statusCode);
361         }
362         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
363                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
364         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
365
366         // Optionally output additional data about list members for debugging.
367         boolean iterateThroughList = false;
368         if(iterateThroughList && logger.isDebugEnabled()){
369             List<RelationsCommonList.RelationListItem> items =
370                     list.getRelationListItem();
371             int i = 0;
372             for(RelationsCommonList.RelationListItem item : items){
373                 logger.debug(testName + ": list-item[" + i + "] csid=" +
374                         item.getCsid());
375                 logger.debug(testName + ": list-item[" + i + "] URI=" +
376                         item.getUri());
377                 i++;
378             }
379         }
380
381     }
382
383     // Failure outcomes
384     // None at present.
385
386     // ---------------------------------------------------------------
387     // CRUD tests : UPDATE tests
388     // ---------------------------------------------------------------
389
390     // Success outcomes
391     /* (non-Javadoc)
392      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#update(java.lang.String)
393      */
394     @Override
395     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
396         dependsOnMethods = {"read"})
397     public void update(String testName) throws Exception {
398
399         if (logger.isDebugEnabled()) {
400             logger.debug(testBanner(testName, CLASS_NAME));
401         }
402         // Perform setup.
403         setupUpdate();
404
405         // Retrieve an existing resource that we can update.
406         RelationClient client = new RelationClient();
407         ClientResponse<MultipartInput> res =
408                 client.read(knownResourceId);
409         if(logger.isDebugEnabled()){
410             logger.debug(testName + ": read status = " + res.getStatus());
411         }
412         Assert.assertEquals(res.getStatus(), EXPECTED_STATUS_CODE);
413         if(logger.isDebugEnabled()){
414             logger.debug("Got object to update with ID: " + knownResourceId);
415         }
416         MultipartInput input = (MultipartInput) res.getEntity();
417         RelationsCommon relation = (RelationsCommon) extractPart(input,
418                 client.getCommonPartName(), RelationsCommon.class);
419         Assert.assertNotNull(relation);
420
421         // Update the content of this resource.
422         relation.setDocumentId1("updated-" + relation.getDocumentId1());
423         relation.setDocumentType1("updated-" + relation.getDocumentType1());
424         relation.setDocumentId2("updated-" + relation.getDocumentId2());
425         relation.setDocumentType2("updated-" + relation.getDocumentType2());
426         relation.setPredicateDisplayName("updated-" + relation.getPredicateDisplayName());
427         if(logger.isDebugEnabled()){
428             logger.debug("updated object");
429             logger.debug(objectAsXmlString(relation, RelationsCommon.class));
430         }
431
432         // Submit the request to the service and store the response.
433         MultipartOutput output = new MultipartOutput();
434         OutputPart commonPart = output.addPart(relation, MediaType.APPLICATION_XML_TYPE);
435         commonPart.getHeaders().add("label", client.getCommonPartName());
436         res = client.update(knownResourceId, output);
437         int statusCode = res.getStatus();
438
439         // Check the status code of the response: does it match the expected response(s)?
440         if(logger.isDebugEnabled()){
441             logger.debug(testName + ": status = " + statusCode);
442         }
443         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
444                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
445         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
446
447         input = (MultipartInput) res.getEntity();
448         RelationsCommon updatedObject = (RelationsCommon) extractPart(
449                 input, client.getCommonPartName(),
450                 RelationsCommon.class);
451         Assert.assertNotNull(updatedObject);
452
453         final String msg =
454                 "Data in updated object did not match submitted data.";
455         Assert.assertEquals(
456                 updatedObject.getDocumentId1(), relation.getDocumentId1(), msg);
457         Assert.assertEquals(
458                 updatedObject.getDocumentType1(), relation.getDocumentType1(), msg);
459         Assert.assertEquals(
460                 updatedObject.getDocumentId2(), relation.getDocumentId2(), msg);
461         Assert.assertEquals(
462                 updatedObject.getDocumentType2(), relation.getDocumentType2(), msg);
463         Assert.assertEquals(
464                 updatedObject.getPredicateDisplayName(), relation.getPredicateDisplayName(), msg);
465
466     }
467
468     // Failure outcomes
469     // Placeholders until the three tests below can be uncommented.
470     // See Issue CSPACE-401.
471     /* (non-Javadoc)
472      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateWithEmptyEntityBody(java.lang.String)
473      */
474     @Override
475     public void updateWithEmptyEntityBody(String testName) throws Exception {
476         //Should this test really be empty?
477     }
478
479     /* (non-Javadoc)
480      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateWithMalformedXml(java.lang.String)
481      */
482     @Override
483     public void updateWithMalformedXml(String testName) throws Exception {
484         //Should this test really be empty?
485     }
486
487     /* (non-Javadoc)
488      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateWithWrongXmlSchema(java.lang.String)
489      */
490     @Override
491     public void updateWithWrongXmlSchema(String testName) throws Exception {
492         //Should this test really be empty?
493     }
494
495     /*
496     @Override
497     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTest.class,
498         dependsOnMethods = {"create", "update", "testSubmitRequest"})
499     public void updateWithEmptyEntityBody(String testName) throws Exception {
500     
501         if (logger.isDebugEnabled()) {
502             logger.debug(testBanner(testName, CLASS_NAME));
503         }
504         // Perform setup.
505         setupUpdateWithEmptyEntityBody();
506
507         // Submit the request to the service and store the response.
508         String method = REQUEST_TYPE.httpMethodName();
509         String url = getResourceURL(knownResourceId);
510         String mediaType = MediaType.APPLICATION_XML;
511         final String entity = "";
512         int statusCode = submitRequest(method, url, mediaType, entity);
513
514         // Check the status code of the response: does it match
515         // the expected response(s)?
516         if(logger.isDebugEnabled()){
517            logger.debug(testName + ": url=" + url +
518                " status=" + statusCode);
519          }
520         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
521         invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
522         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
523     }
524
525     @Override
526     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTest.class,
527         dependsOnMethods = {"create", "update", "testSubmitRequest"})
528     public void updateWithMalformedXml(String testName) throws Exception {
529
530         if (logger.isDebugEnabled()) {
531             logger.debug(testBanner(testName, CLASS_NAME));
532         }
533         // Perform setup.
534         setupUpdateWithMalformedXml();
535
536         // Submit the request to the service and store the response.
537         String method = REQUEST_TYPE.httpMethodName();
538         String url = getResourceURL(knownResourceId);
539         String mediaType = MediaType.APPLICATION_XML;
540         final String entity = MALFORMED_XML_DATA; // Constant from abstract base class.
541         int statusCode = submitRequest(method, url, mediaType, entity);
542
543         // Check the status code of the response: does it match
544         // the expected response(s)?
545         if(logger.isDebugEnabled()){
546             logger.debug(testName + ": url=" + url +
547             " status=" + statusCode);
548          }
549         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
550         invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
551         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
552     }
553
554     @Override
555     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTest.class,
556         dependsOnMethods = {"create", "update", "testSubmitRequest"})
557     public void updateWithWrongXmlSchema(String testName) throws Exception {
558     
559         if (logger.isDebugEnabled()) {
560             logger.debug(testBanner(testName, CLASS_NAME));
561         }
562         // Perform setup.
563         setupUpdateWithWrongXmlSchema();
564
565         // Submit the request to the service and store the response.
566         String method = REQUEST_TYPE.httpMethodName();
567         String url = getResourceURL(knownResourceId);
568         String mediaType = MediaType.APPLICATION_XML;
569         final String entity = WRONG_XML_SCHEMA_DATA; // Constant from abstract base class.
570         int statusCode = submitRequest(method, url, mediaType, entity);
571
572         // Check the status code of the response: does it match
573         // the expected response(s)?
574         if(logger.isDebugEnabled()){
575             logger.debug(testName + ": url=" + url +
576             " status=" + statusCode);
577          }
578         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
579         invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
580         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
581     }
582      */
583
584     /* (non-Javadoc)
585      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateNonExistent(java.lang.String)
586      */
587     @Override
588     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
589         dependsOnMethods = {"update", "testSubmitRequest"})
590     public void updateNonExistent(String testName) throws Exception {
591
592         if (logger.isDebugEnabled()) {
593             logger.debug(testBanner(testName, CLASS_NAME));
594         }
595         // Perform setup.
596         setupUpdateNonExistent();
597
598         // Submit the request to the service and store the response.
599         // Note: The ID used in this 'create' call may be arbitrary.
600         // The only relevant ID may be the one used in update(), below.
601         RelationClient client = new RelationClient();
602         MultipartOutput multipart = createRelationInstance(NON_EXISTENT_ID);
603         ClientResponse<MultipartInput> res =
604                 client.update(NON_EXISTENT_ID, multipart);
605         int statusCode = res.getStatus();
606
607         // Check the status code of the response: does it match
608         // the expected response(s)?
609         if(logger.isDebugEnabled()){
610             logger.debug(testName + ": status = " + statusCode);
611         }
612         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
613                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
614         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
615     }
616
617     // ---------------------------------------------------------------
618     // CRUD tests : DELETE tests
619     // ---------------------------------------------------------------
620     // Success outcomes
621     /* (non-Javadoc)
622      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#delete(java.lang.String)
623      */
624     @Override
625     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
626         dependsOnMethods = {"create", "readList", "testSubmitRequest", "update"})
627     public void delete(String testName) throws Exception {
628
629         if (logger.isDebugEnabled()) {
630             logger.debug(testBanner(testName, CLASS_NAME));
631         }
632         // Perform setup.
633         setupDelete();
634
635         // Submit the request to the service and store the response.
636         RelationClient client = new RelationClient();
637         ClientResponse<Response> res = client.delete(knownResourceId);
638         int statusCode = res.getStatus();
639
640         // Check the status code of the response: does it match
641         // the expected response(s)?
642         if(logger.isDebugEnabled()){
643             logger.debug(testName + ": status = " + statusCode);
644         }
645         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
646                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
647         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
648     }
649
650     // Failure outcomes
651     /* (non-Javadoc)
652      * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#deleteNonExistent(java.lang.String)
653      */
654     @Override
655     @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class,
656         dependsOnMethods = {"delete"})
657     public void deleteNonExistent(String testName) throws Exception {
658
659         if (logger.isDebugEnabled()) {
660             logger.debug(testBanner(testName, CLASS_NAME));
661         }
662         // Perform setup.
663         setupDeleteNonExistent();
664
665         // Submit the request to the service and store the response.
666         RelationClient client = new RelationClient();
667         ClientResponse<Response> res = client.delete(NON_EXISTENT_ID);
668         int statusCode = res.getStatus();
669
670         // Check the status code of the response: does it match
671         // the expected response(s)?
672         if(logger.isDebugEnabled()){
673             logger.debug(testName + ": status = " + statusCode);
674         }
675         Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
676                 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
677         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
678     }
679
680     // ---------------------------------------------------------------
681     // RELATE_OBJECT tests
682     // ---------------------------------------------------------------
683     /**
684      * Relate objects.
685      */
686     @Test(dependsOnMethods = {"create"})
687     public void relateObjects() {
688         //Should this test really be empty?
689     }
690
691     // ---------------------------------------------------------------
692     // Utility tests : tests of code used in tests above
693     // ---------------------------------------------------------------
694     /**
695      * Tests the code for manually submitting data that is used by several
696      * of the methods above.
697      */
698     @Test(dependsOnMethods = {"create", "read"})
699     public void testSubmitRequest() {
700
701         setupRead();
702
703         // Submit the request to the service and store the response.
704         String method = ServiceRequestType.READ.httpMethodName();
705         String url = getResourceURL(knownResourceId);
706         int statusCode = submitRequest(method, url);
707
708         // Check the status code of the response: does it match
709         // the expected response(s)?
710         if(logger.isDebugEnabled()){
711             logger.debug("testSubmitRequest: url=" + url +
712                 " status=" + statusCode);
713         }
714         Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
715     }
716
717     // ---------------------------------------------------------------
718     // Utility methods used by tests above
719     // ---------------------------------------------------------------
720     /* (non-Javadoc)
721      * @see org.collectionspace.services.client.test.BaseServiceTest#getServicePathComponent()
722      */
723     @Override
724     public String getServicePathComponent() {
725         return SERVICE_PATH_COMPONENT;
726     }
727
728     /**
729      * Creates the relation instance.
730      *
731      * @param identifier the identifier
732      * @return the multipart output
733      */
734     private MultipartOutput createRelationInstance(String identifier) {
735         RelationsCommon relation = new RelationsCommon();
736         fillRelation(relation, identifier);
737
738         MultipartOutput multipart = new MultipartOutput();
739         OutputPart commonPart =
740                 multipart.addPart(relation, MediaType.APPLICATION_XML_TYPE);
741         commonPart.getHeaders().add("label", new RelationClient().getCommonPartName());
742         if(logger.isDebugEnabled()){
743           logger.debug("to be created, relation common");
744           logger.debug(objectAsXmlString(relation, RelationsCommon.class));
745         }
746         return multipart;
747     }
748
749     /**
750      * Fills the relation.
751      *
752      * @param relation the relation
753      * @param identifier the identifier
754      */
755     private void fillRelation(RelationsCommon relation, String identifier) {
756         fillRelation(relation, "Subject-" + identifier,
757                 "SubjectType-" + identifier + "-type",
758                 "Object-" + identifier,
759                 "ObjectType-" + identifier + "-type",
760                 RelationshipType.COLLECTIONOBJECT_INTAKE,
761                 RelationshipType.COLLECTIONOBJECT_INTAKE + ".displayName");
762     }
763
764     /**
765      * Fills the relation.
766      *
767      * @param relation the relation
768      * @param documentId1 the document id1
769      * @param documentType1 the document type1
770      * @param documentId2 the document id2
771      * @param documentType2 the document type2
772      * @param rt the rt
773      */
774     private void fillRelation(RelationsCommon relation,
775             String documentId1, String documentType1,
776             String documentId2, String documentType2,
777             RelationshipType rt,
778             String rtDisplayName) {
779         relation.setDocumentId1(documentId1);
780         relation.setDocumentType1(documentType1);
781         relation.setDocumentId2(documentId2);
782         relation.setDocumentType2(documentType2);
783
784         relation.setRelationshipType(rt);
785         relation.setPredicateDisplayName(rtDisplayName);
786     }
787 }