/** * $Id: EntityHandlerImplTest.java 125663 2013-06-12 13:43:37Z azeckoski@unicon.net $ * $URL: https://source.sakaiproject.org/svn/entitybroker/trunk/rest/src/test/org/sakaiproject/entitybroker/rest/EntityHandlerImplTest.java $ * EntityHandlerImplTest.java - entity-broker - Apr 6, 2008 12:08:39 PM - azeckoski ************************************************************************** * Copyright (c) 2008, 2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sakaiproject.entitybroker.rest; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.sakaiproject.entitybroker.EntityReference; import org.sakaiproject.entitybroker.entityprovider.extension.Formats; import org.sakaiproject.entitybroker.exception.EntityException; import org.sakaiproject.entitybroker.mocks.ActionsEntityProviderMock; import org.sakaiproject.entitybroker.mocks.data.MyEntity; import org.sakaiproject.entitybroker.mocks.data.TestData; import org.sakaiproject.entitybroker.providers.EntityRequestHandler; import org.sakaiproject.entitybroker.rest.EntityEncodingManager; import org.sakaiproject.entitybroker.rest.EntityHandlerImpl; import org.sakaiproject.entitybroker.util.http.EntityHttpServletRequest; import org.sakaiproject.entitybroker.util.http.EntityHttpServletResponse; /** * Testing the central logic of the entity handler * * @author Aaron Zeckoski (aaron@caret.cam.ac.uk) */ public class EntityHandlerImplTest extends TestCase { public static String DIRECT_PREFIX = "/direct"; protected EntityHandlerImpl entityHandler; private TestData td; @Override protected void setUp() throws Exception { super.setUp(); // setup things td = new TestData(); entityHandler = new ServiceTestManager(td).entityRequestHandler; } /** * Test method for {@link org.sakaiproject.entitybroker.rest.EntityHandlerImpl#handleEntityAccess(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String)}. */ public void testHandleEntityAccess() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test valid entity (with access provider) req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REF8); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); // test invalid prefix req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/fake/thing"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_IMPLEMENTED, e.responseCode); } // test invalid id req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REF1_INVALID); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(TestData.REF1_INVALID, e.entityReference); assertEquals(HttpServletResponse.SC_NOT_FOUND, e.responseCode); } // XML test valid resolveable entity req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REF4 + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String xml = res.getContentAsString(); assertNotNull(xml); assertTrue(xml.length() > 20); assertTrue(xml.contains(TestData.PREFIX4)); assertTrue(xml.contains("<id>4-one</id>")); assertTrue(xml.contains(EntityEncodingManager.ENTITY_REFERENCE)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // JSON test valid resolveable entity req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REF4 + "." + Formats.JSON); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String json = res.getContentAsString(); assertNotNull(json); assertTrue(json.length() > 20); assertTrue(json.contains(TestData.PREFIX4)); assertTrue(json.contains("\"id\":")); assertTrue(json.contains("\"4-one\",")); assertTrue(json.contains(EntityEncodingManager.ENTITY_REFERENCE)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // HTML test valid resolveable entity req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REF4 + "." + Formats.HTML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String html = res.getContentAsString(); assertNotNull(html); assertTrue(html.length() > 20); assertTrue(html.contains(TestData.PREFIX4)); assertTrue(html.contains(TestData.REF4)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // types that cannot handle the return requested req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REF4 + ".csv"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_ACCEPTABLE, e.responseCode); } } public void testAccessEntitySpace() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test the REST and CRUD methods // XML testing // test get an entity space req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACE6 + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String html = res.getContentAsString(); assertNotNull(html); assertTrue(html.length() > 20); assertTrue(html.contains(TestData.PREFIX6)); assertTrue(html.contains(TestData.PREFIX6 + "_collection")); assertTrue(html.contains(TestData.IDS6[0])); assertTrue(html.contains(TestData.IDS6[1])); assertTrue(html.contains(TestData.IDS6[2])); assertTrue(html.contains(TestData.IDS6[3])); } catch (RuntimeException e) { fail("failure trying to get string content"); } req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACE6 + "." + Formats.JSON); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String html = res.getContentAsString(); assertNotNull(html); assertTrue(html.length() > 20); assertTrue(html.contains(TestData.PREFIX6)); assertTrue(html.contains(TestData.PREFIX6 + "_collection")); assertTrue(html.contains(TestData.IDS6[0])); assertTrue(html.contains(TestData.IDS6[1])); assertTrue(html.contains(TestData.IDS6[2])); assertTrue(html.contains(TestData.IDS6[3])); } catch (RuntimeException e) { fail("failure trying to get string content"); } } public void testHandleEntityAccessInputHTML() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test the REST and CRUD methods // HTML testing // test creating an entity // invalid space is invalid req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + "/xxxxxxxxxxxxxx/new"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_IMPLEMENTED, e.responseCode); } // create without data is invalid req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.SPACE6 + "/new"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_BAD_REQUEST, e.responseCode); } req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.SPACE6 + "/new"); req.addParameter("stuff", "TEST"); // now fill in the fields to create the entity in the request (html) req.addParameter("number", "5"); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_CREATED, res.getStatus()); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); String entityId = (String) res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID); assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); MyEntity me = td.entityProvider6.myEntities.get(entityId); assertNotNull(me); assertEquals("TEST", me.getStuff()); assertEquals(5, me.getNumber()); // test that the entityId is being returned in the response as requested by Nico assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.contains(entityId)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // make sure the .html works req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.SPACE6 + "/new" + "." + Formats.HTML); req.addParameter("stuff", "TEST2"); // now fill in the fields to create the entity in the request (html) req.addParameter("number", "6"); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_CREATED, res.getStatus()); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); String entityId2 = (String) res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID); assertTrue( td.entityProvider6.myEntities.containsKey(entityId2) ); MyEntity me2 = td.entityProvider6.myEntities.get(entityId2); assertNotNull(me2); assertEquals("TEST2", me2.getStuff()); assertEquals(6, me2.getNumber()); // test modifying an entity // modify without data is invalid req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_BAD_REQUEST, e.responseCode); } // invalid id is invalid req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACE6 + "/xxxxxxx"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_FOUND, e.responseCode); } req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId); req.addParameter("stuff", "TEST-PUT"); // now fill in the fields to create the entity in the request (html) res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); me = td.entityProvider6.myEntities.get(entityId); assertNotNull(me); assertEquals("TEST-PUT", me.getStuff()); assertEquals(5, me.getNumber()); // make sure the .html works req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId2 + "." + Formats.HTML); req.addParameter("stuff", "TEST-PUT2"); // now fill in the fields to create the entity in the request (html) res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); assertTrue( td.entityProvider6.myEntities.containsKey(entityId2) ); me2 = td.entityProvider6.myEntities.get(entityId2); assertNotNull(me2); assertEquals("TEST-PUT2", me2.getStuff()); assertEquals(6, me2.getNumber()); // test deleting an entity // space delete is invalid req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.SPACE6); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_BAD_REQUEST, e.responseCode); } // invalid id is invalid req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.SPACE6 + "/xxxxxxx"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_FOUND, e.responseCode); } // entity delete is allowed assertTrue( td.entityProvider6.myEntities.containsKey(TestData.IDS6[3]) ); req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.REF6_4); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertFalse( td.entityProvider6.myEntities.containsKey(TestData.IDS6[3]) ); assertTrue( td.entityProvider6.myEntities.containsKey(entityId2) ); req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId2 + "." + Formats.HTML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertFalse( td.entityProvider6.myEntities.containsKey(entityId2) ); } public void testHandleEntityAccessRESTXML() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test the REST and CRUD methods // XML testing // test creating an entity req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.SPACE6 + "/new" + "." + Formats.XML); req.setContent( makeUTF8Bytes("<"+TestData.PREFIX6+"><stuff>TEST</stuff><number>5</number></"+TestData.PREFIX6+">") ); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_CREATED, res.getStatus()); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); String entityId = (String) res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID); assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); MyEntity me = td.entityProvider6.myEntities.get(entityId); assertNotNull(me); assertEquals("TEST", me.getStuff()); assertEquals(5, me.getNumber()); // test modifying an entity req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId + "." + Formats.XML); req.setContent( makeUTF8Bytes("<"+TestData.PREFIX6+"><stuff>TEST-PUT</stuff></"+TestData.PREFIX6+">") ); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); me = td.entityProvider6.myEntities.get(entityId); assertNotNull(me); assertEquals("TEST-PUT", me.getStuff()); assertEquals(5, me.getNumber()); // test deleting an entity (extension should have no effect) assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertFalse( td.entityProvider6.myEntities.containsKey(entityId) ); } public void testHandleEntityAccessRESTJSON() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test the REST and CRUD methods // JSON testing // test creating an entity req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.SPACE6 + "/new" + "." + Formats.JSON); req.setContent( makeUTF8Bytes("{\""+TestData.PREFIX6+"\" : { \"stuff\" : \"TEST\", \"number\" : 5 }}") ); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_CREATED, res.getStatus()); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); String entityId = (String) res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID); assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); MyEntity me = td.entityProvider6.myEntities.get(entityId); assertNotNull(me); assertEquals("TEST", me.getStuff()); assertEquals(5, me.getNumber()); // test modifying an entity req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId + "." + Formats.JSON); req.setContent( makeUTF8Bytes("{\""+TestData.PREFIX6+"\" : { \"stuff\" : \"TEST-PUT\" }}") ); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_ID)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_REFERENCE)); assertNotNull(res.getHeader(EntityRequestHandler.HEADER_ENTITY_URL)); assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); me = td.entityProvider6.myEntities.get(entityId); assertNotNull(me); assertEquals("TEST-PUT", me.getStuff()); assertEquals(5, me.getNumber()); // test deleting an entity (extension should have no effect) assertTrue( td.entityProvider6.myEntities.containsKey(entityId) ); req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.SPACE6 + "/" + entityId + "." + Formats.JSON); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_NO_CONTENT, res.getStatus()); assertFalse( td.entityProvider6.myEntities.containsKey(entityId) ); } public void testHandleEntityAccessDescribe() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test describe all entities req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX1)); assertTrue(content.contains(TestData.PREFIX2)); assertTrue(content.contains(TestData.PREFIX3)); assertTrue(content.contains(TestData.PREFIX4)); assertTrue(content.contains(TestData.PREFIX5)); assertTrue(content.contains(TestData.PREFIX6)); assertTrue(content.contains(TestData.PREFIX7)); assertTrue(content.contains(TestData.PREFIX8)); } catch (RuntimeException e) { fail("failure trying to get string content"); } req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + EntityRequestHandler.DESCRIBE + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX1)); assertTrue(content.contains(TestData.PREFIX2)); assertTrue(content.contains(TestData.PREFIX3)); assertTrue(content.contains(TestData.PREFIX4)); assertTrue(content.contains(TestData.PREFIX5)); assertTrue(content.contains(TestData.PREFIX6)); assertTrue(content.contains(TestData.PREFIX7)); assertTrue(content.contains(TestData.PREFIX8)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // test describe single entity space req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX1 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX1)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // XML req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX1 + "/" + EntityRequestHandler.DESCRIBE + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX1)); } catch (RuntimeException e) { fail("failure trying to get string content"); } req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX4 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX4)); } catch (RuntimeException e) { fail("failure trying to get string content"); } req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX6 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX6)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // XML req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX6 + "/" + EntityRequestHandler.DESCRIBE + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX6)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // test an entity which is describeable req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX7 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX7)); assertTrue(content.contains("describe-prefix test description of an entity")); assertTrue(content.contains("This is a test description of Createable")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // XML req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX7 + "/" + EntityRequestHandler.DESCRIBE + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX7)); assertTrue(content.contains("<description>")); assertTrue(content.contains("describe-prefix test description of an entity")); assertTrue(content.contains("This is a test description of Createable")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // test an entity which is DescribePropertiesable req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX8 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX8)); assertTrue(content.contains("CUSTOM description")); assertTrue(content.contains("CUSTOM Deleteable")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // XML req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX8 + "/" + EntityRequestHandler.DESCRIBE + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIX8)); assertTrue(content.contains("<description>")); assertTrue(content.contains("CUSTOM description")); assertTrue(content.contains("CUSTOM Deleteable")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // test an entity which is DescribePropertiesable req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIXA1 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIXA1)); assertTrue(content.contains("double action")); assertTrue(content.contains("xxx action")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // XML req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIXA1 + "/" + EntityRequestHandler.DESCRIBE + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); //assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIXA1)); assertTrue(content.contains("<description>")); assertTrue(content.contains("double action")); assertTrue(content.contains("xxx action")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // test invalid describe req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + "/" + TestData.PREFIX9 + "/" + EntityRequestHandler.DESCRIBE); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_IMPLEMENTED, e.responseCode); } } public void testRequestStorageAware() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; // test doing a request to see what comes back // currently this is just making sure the stuff gets set and does not die req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REFA + ".xml"); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIXA)); } catch (RuntimeException e) { fail("failure trying to get string content"); } // TODO we need a better way to test this stuff } public void testCustomActions() { ActionsEntityProviderMock actionProvider = td.entityProviderA1; EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; String action = null; // double MyEntity me = (MyEntity) actionProvider.getEntity( new EntityReference(TestData.REFA1_2) ); int num = me.getNumber(); action = "double"; req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REFA1_2 + "/" + action + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() > 80); assertTrue(content.contains(TestData.PREFIXA1)); assertTrue(content.contains((num*2)+"</number>")); } catch (RuntimeException e) { fail("failure trying to get string content"); } // xxx MyEntity me1 = (MyEntity) actionProvider.getEntity( new EntityReference(TestData.REFA1_2) ); assertFalse("xxx".equals(me1.extra)); assertFalse("xxx".equals(me1.getStuff())); action = "xxx"; req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.REFA1_2 + "/" + action + "." + Formats.XML); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() == 0); } catch (RuntimeException e) { fail("failure trying to get string content"); } MyEntity xxxMe = (MyEntity) actionProvider.getEntity( new EntityReference(TestData.REFA1_2) ); assertEquals(me1.getId(), xxxMe.getId()); assertTrue("xxx".equals(xxxMe.extra)); assertTrue("xxx".equals(xxxMe.getStuff())); // invalid method (GET), should be post req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REFA1_2 + "/" + "xxx" + "." + Formats.XML); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("should have thrown exeception"); } catch (EntityException e) { assertNotNull(e.getMessage()); } // clear assertEquals(2, actionProvider.myEntities.size()); action = "clear"; req = new EntityHttpServletRequest("POST", DIRECT_PREFIX + TestData.SPACEA1 + "/" + action); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() == 0); } catch (RuntimeException e) { fail("failure trying to get string content"); } assertEquals(0, actionProvider.myEntities.size()); // exceptions // invalid action req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.REFA1_2 + "/" + "INVALID"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("should have thrown exeception"); } catch (EntityException e) { assertNotNull(e.getMessage()); } // invalid method (GET), should be post req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACEA1 + "/" + "clear"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("should have thrown exeception"); } catch (EntityException e) { assertNotNull(e.getMessage()); } req = new EntityHttpServletRequest("PUT", DIRECT_PREFIX + TestData.SPACEA1 + "/" + "clear"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("should have thrown exeception"); } catch (EntityException e) { assertNotNull(e.getMessage()); } req = new EntityHttpServletRequest("DELETE", DIRECT_PREFIX + TestData.SPACEA1 + "/" + "clear"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("should have thrown exeception"); } catch (EntityException e) { assertNotNull(e.getMessage()); } } public void testURLRedirects() { EntityHttpServletRequest req = null; EntityHttpServletResponse res = null; String redirectURL = null; String forwardURL = null; // testing a few requests to make sure they work right req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACEU1 + "/123/AZ/go"); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_MOVED_TEMPORARILY, res.getStatus()); // redirect assertNotNull(res.getOutputStream()); redirectURL = res.getRedirectedUrl(); forwardURL = res.getForwardedUrl(); assertNotNull(redirectURL); assertNull(forwardURL); assertEquals("http://caret.cam.ac.uk/?prefix=" + TestData.PREFIXU1 + "&thing=AZ", redirectURL); req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACEU1 + "/xml/123"); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); // forward assertNotNull(res.getOutputStream()); redirectURL = res.getRedirectedUrl(); forwardURL = res.getForwardedUrl(); assertNotNull(redirectURL); assertNotNull(forwardURL); assertEquals(TestData.SPACEU1+"/123.xml", forwardURL); // test the special ones req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACEU1 + "/going/nowhere"); res = new EntityHttpServletResponse(); entityHandler.handleEntityAccess(req, res, null); assertEquals(HttpServletResponse.SC_OK, res.getStatus()); // forward assertNotNull(res.getOutputStream()); redirectURL = res.getRedirectedUrl(); forwardURL = res.getForwardedUrl(); assertNull(redirectURL); assertNull(forwardURL); assertNotNull(res.getOutputStream()); try { String content = res.getContentAsString(); assertNotNull(content); assertTrue(content.length() == 0); } catch (RuntimeException e) { fail("failure trying to get string content"); } req = new EntityHttpServletRequest("GET", DIRECT_PREFIX + TestData.SPACEU1 + "/keep/moving"); res = new EntityHttpServletResponse(); try { entityHandler.handleEntityAccess(req, res, null); fail("should have died"); } catch (EntityException e) { assertNotNull(e.getMessage()); } } /** * Convenience method for making byte content encoded into UTF-8 */ private byte[] makeUTF8Bytes(String string) { byte[] bytes; try { bytes = string.getBytes(Formats.UTF_8); } catch (UnsupportedEncodingException e) { bytes = string.getBytes(); } return bytes; } }