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.
24 package org.collectionspace.services.client.test;
26 import java.util.List;
27 import javax.ws.rs.core.Response;
28 import javax.ws.rs.core.Response.Status;
30 import org.collectionspace.services.client.IntakeClient;
31 import org.collectionspace.services.client.test.ServiceRequestType;
32 import org.collectionspace.services.intake.Intake;
33 import org.collectionspace.services.intake.IntakeList;
35 import org.jboss.resteasy.client.ClientResponse;
37 import org.testng.Assert;
38 import org.testng.annotations.Test;
41 * IntakeServiceTest, carries out tests against a
42 * deployed and running Intake Service.
44 * $LastChangedRevision: 511 $
45 * $LastChangedDate: 2009-08-06 20:16:16 +0000 (Thu, 06 Aug 2009) $
47 public class IntakeServiceTest extends AbstractServiceTest {
49 // Instance variables specific to this test.
50 private IntakeClient client = new IntakeClient();
51 final String SERVICE_PATH_COMPONENT = "intakes";
52 private String knownObjectId = null;
55 // ---------------------------------------------------------------
56 // CRUD tests : CREATE tests
57 // ---------------------------------------------------------------
63 public void create() {
65 // Perform setup, such as initializing the type of service request
66 // (e.g. CREATE, DELETE), its valid and expected status codes, and
67 // its associated HTTP method name (e.g. POST, DELETE).
70 // Submit the request to the service and store the response.
71 String identifier = createIdentifier();
72 Intake intake = createIntake(identifier);
73 ClientResponse<Response> res = client.create(intake);
74 int statusCode = res.getStatus();
76 // Check the status code of the response: does it match the expected response(s)?
78 // Does it fall within the set of valid status codes?
79 // Does it exactly match the expected status code?
80 verbose("create: status = " + statusCode);
81 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
82 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
83 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
85 // Store the ID returned from this create operation for additional tests below.
86 knownObjectId = extractId(res);
90 @Test(dependsOnMethods = {"create"})
91 public void createList() {
92 for(int i = 0; i < 3; i++){
100 @Test(dependsOnMethods = {"create"}, expectedExceptions = IllegalArgumentException.class)
101 public void createNull() {
102 ClientResponse<Response> res = client.create(null);
105 // Placeholders until the two tests below can be uncommented. See Issue CSPACE-401.
106 public void createWithMalformedXml() {}
107 public void createWithWrongXmlSchema() {}
111 @Test(dependsOnMethods = {"create", "testSubmitRequest"})
112 public void createWithMalformedXml() {
115 setupCreateWithMalformedXml();
117 // Submit the request to the service and store the response.
118 String method = REQUEST_TYPE.httpMethodName();
119 String url = getServiceRootURL();
120 final String entity = MALFORMED_XML_DATA; // Constant from abstract base class.
121 int statusCode = submitRequest(method, url, entity);
123 // Check the status code of the response: does it match the expected response(s)?
124 verbose("createWithMalformedXml url=" + url + " status=" + statusCode);
125 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
126 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
127 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
131 @Test(dependsOnMethods = {"create", "testSubmitRequest"})
132 public void createWithWrongXmlSchema() {
135 setupCreateWithWrongXmlSchema();
137 // Submit the request to the service and store the response.
138 String method = REQUEST_TYPE.httpMethodName();
139 String url = getServiceRootURL();
140 final String entity = WRONG_XML_SCHEMA_DATA;
141 int statusCode = submitRequest(method, url, entity);
143 // Check the status code of the response: does it match the expected response(s)?
144 verbose("createWithWrongSchema url=" + url + " status=" + statusCode);
145 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
146 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
147 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
151 // ---------------------------------------------------------------
152 // CRUD tests : READ tests
153 // ---------------------------------------------------------------
158 @Test(dependsOnMethods = {"create"})
164 // Submit the request to the service and store the response.
165 ClientResponse<Intake> res = client.read(knownObjectId);
166 int statusCode = res.getStatus();
168 // Check the status code of the response: does it match the expected response(s)?
169 verbose("read: status = " + statusCode);
170 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
171 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
172 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
176 @Test(dependsOnMethods = {"read"})
177 public void readNonExistent() {
180 setupReadNonExistent();
182 // Submit the request to the service and store the response.
183 ClientResponse<Intake> res = client.read(NON_EXISTENT_ID);
184 int statusCode = res.getStatus();
186 // Check the status code of the response: does it match the expected response(s)?
187 verbose("readNonExistent: status = " + res.getStatus());
188 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
189 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
190 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
194 // ---------------------------------------------------------------
195 // CRUD tests : READ_LIST tests
196 // ---------------------------------------------------------------
201 @Test(dependsOnMethods = {"createList"})
202 public void readList() {
207 // Submit the request to the service and store the response.
208 ClientResponse<IntakeList> res = client.readList();
209 IntakeList list = res.getEntity();
210 int statusCode = res.getStatus();
212 // Check the status code of the response: does it match the expected response(s)?
213 verbose("readList: status = " + res.getStatus());
214 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
215 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
216 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
218 // Optionally output additional data about list members for debugging.
219 boolean iterateThroughList = false;
220 if (iterateThroughList && logger.isDebugEnabled()) {
221 List<IntakeList.IntakeListItem> items =
222 list.getIntakeListItem();
224 for(IntakeList.IntakeListItem item : items){
225 verbose("readList: list-item[" + i + "] csid=" + item.getCsid());
226 verbose("readList: list-item[" + i + "] objectNumber=" + item.getEntryNumber());
227 verbose("readList: list-item[" + i + "] URI=" + item.getUri());
239 // ---------------------------------------------------------------
240 // CRUD tests : UPDATE tests
241 // ---------------------------------------------------------------
246 @Test(dependsOnMethods = {"create"})
247 public void update() {
252 // Retrieve an existing resource that we can update.
253 ClientResponse<Intake> res = client.read(knownObjectId);
254 verbose("read: status = " + res.getStatus());
255 Assert.assertEquals(res.getStatus(), EXPECTED_STATUS_CODE);
256 Intake intake = res.getEntity();
257 verbose("Got object to update with ID: " + knownObjectId,
258 intake, Intake.class);
260 // Update the content of this resource.
261 intake.setEntryNumber("updated-" + intake.getEntryNumber());
262 intake.setEntryDate("updated-" + intake.getEntryDate());
264 // Submit the request to the service and store the response.
265 res = client.update(knownObjectId, intake);
266 int statusCode = res.getStatus();
267 Intake updatedObject = res.getEntity();
269 // Check the status code of the response: does it match the expected response(s)?
270 verbose("update: status = " + res.getStatus());
271 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
272 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
273 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
275 // Check the contents of the response: does it match what was submitted?
276 verbose("update: ", updatedObject, Intake.class);
277 Assert.assertEquals(updatedObject.getEntryDate(),
278 intake.getEntryDate(),
279 "Data in updated object did not match submitted data.");
282 // Placeholders until the two tests below can be uncommented. See Issue CSPACE-401.
283 public void updateWithMalformedXml() {}
284 public void updateWithWrongXmlSchema() {}
288 @Test(dependsOnMethods = {"create", "update", "testSubmitRequest"})
289 public void updateWithMalformedXml() {
292 setupUpdateWithMalformedXml();
294 // Submit the request to the service and store the response.
295 String method = REQUEST_TYPE.httpMethodName();
296 String url = getResourceURL(knownObjectId);
297 final String entity = MALFORMED_XML_DATA; // Constant from abstract base class.
298 int statusCode = submitRequest(method, url, entity);
300 // Check the status code of the response: does it match the expected response(s)?
301 verbose("updateWithMalformedXml: url=" + url + " status=" + statusCode);
302 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
303 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
304 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
308 @Test(dependsOnMethods = {"create", "update", "testSubmitRequest"})
309 public void updateWithWrongXmlSchema() {
312 setupUpdateWithWrongXmlSchema();
314 // Submit the request to the service and store the response.
315 String method = REQUEST_TYPE.httpMethodName();
316 String url = getResourceURL(knownObjectId);
317 final String entity = WRONG_XML_SCHEMA_DATA; // Constant from abstract base class.
318 int statusCode = submitRequest(method, url, entity);
320 // Check the status code of the response: does it match the expected response(s)?
321 verbose("updateWithWrongSchema: url=" + url + " status=" + statusCode);
322 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
323 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
324 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
329 @Test(dependsOnMethods = {"update", "testSubmitRequest"})
330 public void updateNonExistent() {
333 setupUpdateNonExistent();
335 // Submit the request to the service and store the response.
336 // Note: The ID used in this 'create' call may be arbitrary.
337 // The only relevant ID may be the one used in update(), below.
338 Intake intake = createIntake(NON_EXISTENT_ID);
339 ClientResponse<Intake> res =
340 client.update(NON_EXISTENT_ID, intake);
341 int statusCode = res.getStatus();
343 // Check the status code of the response: does it match the expected response(s)?
344 verbose("updateNonExistent: status = " + res.getStatus());
345 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
346 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
347 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
350 // ---------------------------------------------------------------
351 // CRUD tests : DELETE tests
352 // ---------------------------------------------------------------
357 @Test(dependsOnMethods =
358 {"create", "read", "update"})
359 public void delete() {
364 // Submit the request to the service and store the response.
365 ClientResponse<Response> res = client.delete(knownObjectId);
366 int statusCode = res.getStatus();
368 // Check the status code of the response: does it match the expected response(s)?
369 verbose("delete: status = " + res.getStatus());
370 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
371 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
372 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
378 @Test(dependsOnMethods = {"delete"})
379 public void deleteNonExistent() {
382 setupDeleteNonExistent();
384 // Submit the request to the service and store the response.
385 ClientResponse<Response> res = client.delete(NON_EXISTENT_ID);
386 int statusCode = res.getStatus();
388 // Check the status code of the response: does it match the expected response(s)?
389 verbose("deleteNonExistent: status = " + res.getStatus());
390 Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode),
391 invalidStatusCodeMessage(REQUEST_TYPE, statusCode));
392 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
396 // ---------------------------------------------------------------
397 // Utility tests : tests of code used in tests above
398 // ---------------------------------------------------------------
401 * Tests the code for manually submitting data that is used by several
402 * of the methods above.
404 @Test(dependsOnMethods = {"create", "read"})
405 public void testSubmitRequest() {
407 // Expected status code: 200 OK
408 final int EXPECTED_STATUS_CODE = Response.Status.OK.getStatusCode();
410 // Submit the request to the service and store the response.
411 String method = ServiceRequestType.READ.httpMethodName();
412 String url = getResourceURL(knownObjectId);
413 int statusCode = submitRequest(method, url);
415 // Check the status code of the response: does it match the expected response(s)?
416 verbose("testSubmitRequest: url=" + url + " status=" + statusCode);
417 Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE);
421 // ---------------------------------------------------------------
422 // Utility methods used by tests above
423 // ---------------------------------------------------------------
426 public String getServicePathComponent() {
427 // @TODO Determine if it is possible to obtain this
428 // value programmatically.
430 // We set this in an annotation in the CollectionObjectProxy
431 // interface, for instance. We also set service-specific
432 // constants in each service module, which might also
433 // return this value.
434 return SERVICE_PATH_COMPONENT;
437 private Intake createIntake(String identifier) {
440 "entryNumber-" + identifier,
441 "entryDate-" + identifier);
445 private Intake createIntake(String entryNumber, String entryDate) {
446 Intake intake = new Intake();
447 intake.setEntryNumber(entryNumber);
448 intake.setEntryDate(entryDate);