/** * $Id: EntityEncodingManagerTest.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $ * $URL: https://source.sakaiproject.org/svn/entitybroker/trunk/rest/src/test/org/sakaiproject/entitybroker/rest/EntityEncodingManagerTest.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.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.sakaiproject.entitybroker.EntityBrokerManager; import org.sakaiproject.entitybroker.EntityReference; import org.sakaiproject.entitybroker.EntityView; import org.sakaiproject.entitybroker.entityprovider.extension.EntityData; import org.sakaiproject.entitybroker.entityprovider.extension.Formats; import org.sakaiproject.entitybroker.exception.EntityException; import org.sakaiproject.entitybroker.exception.FormatUnsupportedException; import org.sakaiproject.entitybroker.mocks.data.MyEntity; import org.sakaiproject.entitybroker.mocks.data.TestData; import org.sakaiproject.entitybroker.rest.EntityEncodingManager; import org.sakaiproject.entitybroker.rest.EntityHandlerImpl; import org.azeckoski.reflectutils.map.ArrayOrderedMap; /** * Testing the central logic of the entity handler * * @author Aaron Zeckoski (aaron@caret.cam.ac.uk) */ public class EntityEncodingManagerTest extends TestCase { protected EntityEncodingManager entityEncodingManager; protected EntityBrokerManager entityBrokerManager; private TestData td; @Override protected void setUp() throws Exception { super.setUp(); // setup things td = new TestData(); ServiceTestManager tm = new ServiceTestManager(td); entityEncodingManager = tm.entityEncodingManager; entityBrokerManager = tm.entityBrokerManager; } public void testInternalInputTranslator() { String xml = "<"+TestData.PREFIX6+"><stuff>TEST</stuff><number>5</number></"+TestData.PREFIX6+">"; ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes()); MyEntity me = (MyEntity) entityEncodingManager.translateInputToEntity( new EntityReference(TestData.PREFIX6,""), Formats.XML, inputStream, null); assertNotNull(me); assertEquals("TEST", me.getStuff()); assertEquals(5, me.getNumber()); // old sucky way String json = "{\""+TestData.PREFIX6+"\" : { \"stuff\" : \"TEST\", \"number\" : 5 }}"; String json = "{ \"stuff\" : \"TEST\", \"number\" : 5 }"; inputStream = new ByteArrayInputStream(json.getBytes()); MyEntity me2 = (MyEntity) entityEncodingManager.translateInputToEntity( new EntityReference(TestData.PREFIX6,""), Formats.JSON, inputStream, null); assertNotNull(me2); assertEquals("TEST", me2.getStuff()); assertEquals(5, me2.getNumber()); } public void testEncodeEntity() { String encoded = null; EntityData ed = null; ed = new EntityData(new EntityReference(TestData.REF4), "Aaron Title", TestData.entity4); encoded = entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); assertNotNull(encoded); assertTrue(encoded.contains(TestData.PREFIX4)); assertTrue(encoded.contains("Aaron Title")); assertTrue(encoded.contains("something0")); ed = new EntityData(new EntityReference(TestData.REF4), "Aaron Title2", TestData.entity4_two); encoded = entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); assertNotNull(encoded); assertTrue(encoded.contains(TestData.PREFIX4)); assertTrue(encoded.contains("Aaron Title2")); assertTrue(encoded.contains("something1")); // test encoding random stuff Map<String, Object> map = new ArrayOrderedMap<String, Object>(); map.put("A", "aaron"); map.put("B", "becky"); map.put("C", "minerva"); ed = new EntityData(map); encoded = entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); assertNotNull(encoded); assertTrue(encoded.contains(TestData.PREFIX4)); assertTrue(encoded.contains("aaron")); assertTrue(encoded.contains("becky")); List<String> l = new ArrayList<String>(); l.add("AZ"); l.add("BZ"); l.add("CZ"); ed = new EntityData(l); encoded = entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); assertNotNull(encoded); assertTrue(encoded.contains(TestData.PREFIX4)); assertTrue(encoded.contains("AZ")); assertTrue(encoded.contains("BZ")); String[] array = new String[] {"A","B","C"}; ed = new EntityData(array); encoded = entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); assertNotNull(encoded); assertTrue(encoded.contains(TestData.PREFIX4)); assertTrue(encoded.contains("A")); assertTrue(encoded.contains("B")); } /** * Testing for http://jira.sakaiproject.org/browse/SAK-19197 (xml encoding) * Items with spaces will not encode correctly and will cause an exception, they * have to be fixed at the provider level */ public void testSpaceEncoding() { EntityData ed = null; // test encoding weird stuff Map<String, Object> map = new ArrayOrderedMap<String, Object>(); map.put("A1", "aaron one"); map.put("C&3", "minerva three"); map.put("B 2", "becky two"); ed = new EntityData(map); /* fixed in 0.9.15 reflectutils try { entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); fail("Could not encode spaces"); } catch (UnsupportedOperationException e) { assertNotNull(e.getMessage()); }*/ String encoded = entityEncodingManager.encodeEntity(TestData.PREFIX4, Formats.XML, ed, null); assertNotNull(encoded); assertTrue(encoded.contains("aaron one")); assertTrue(encoded.contains("becky two")); assertTrue(encoded.contains("minerva three")); } /** * Test method for {@link EntityHandlerImpl#internalOutputFormatter(EntityView, javax.servlet.http.HttpServletRequest, HttpServletResponse)} **/ public void testInternalOutputFormatter() { String fo = null; EntityView view = null; OutputStream output = null; // XML test valid resolveable entity output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.REF4 + "." + Formats.XML); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("<id>4-one</id>")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // test null view output = new ByteArrayOutputStream(); entityEncodingManager.internalOutputFormatter(new EntityReference(TestData.REF4), Formats.XML, null, null, output, null); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("<id>4-one</id>")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // test list of entities ArrayList<EntityData> testEntities = new ArrayList<EntityData>(); testEntities.add( new EntityData(TestData.REF4, null, TestData.entity4) ); testEntities.add( new EntityData(TestData.REF4_two, null, TestData.entity4_two) ); output = new ByteArrayOutputStream(); entityEncodingManager.internalOutputFormatter(new EntityReference(TestData.PREFIX4, ""), Formats.XML, testEntities, null, output, null); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("<id>4-one</id>")); assertTrue(fo.contains("<id>4-two</id>")); assertFalse(fo.contains("<id>4-three</id>")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // test single entity testEntities.clear(); testEntities.add( new EntityData(TestData.REF4_3, null, TestData.entity4_3) ); output = new ByteArrayOutputStream(); entityEncodingManager.internalOutputFormatter(new EntityReference(TestData.REF4_3), Formats.XML, testEntities, null, output, null); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("<id>4-three</id>")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // JSON test valid resolveable entity output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.REF4 + "." + Formats.JSON); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("\"id\":")); assertTrue(fo.contains("\"4-one\",")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // JSONP test valid resolveable entity, default callback output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.ENTITY_URL4_JSONP); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("\"id\":")); assertTrue(fo.contains("\"4-one\",")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); assertTrue(fo.contains(EntityEncodingManager.JSON_DEFAULT_CALLBACK + "(")); // JSONP test valid resolveable entity, specified callback HashMap<String, Object> callbackParam = new HashMap<String, Object>(); callbackParam.put(EntityEncodingManager.JSON_CALLBACK_PARAM, "customCallback"); output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.ENTITY_URL4_JSONP); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, callbackParam, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains("\"id\":")); assertTrue(fo.contains("\"4-one\",")); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); assertTrue(fo.contains("customCallback(")); // HTML test valid resolveable entity output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.REF4 + "." + Formats.HTML); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains(TestData.REF4)); // test invalid format request output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.REF4 + "." + Formats.RSS); assertNotNull(view); try { entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fail("Should have thrown exception"); } catch (FormatUnsupportedException e) { assertNotNull(e.getMessage()); } // test for unresolvable entities // JSON test unresolvable entity output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.REF1 + "." + Formats.JSON); assertNotNull(view); try { entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_FOUND, e.responseCode); } // HTML test unresolvable entity output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.REF1); // blank assertNotNull(view); try { entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_FOUND, e.responseCode); } // test resolveable collections // XML output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.SPACE4 + "." + Formats.XML); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains(TestData.IDS4[0])); assertTrue(fo.contains(TestData.IDS4[1])); assertTrue(fo.contains(TestData.IDS4[2])); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // JSON output = new ByteArrayOutputStream(); view = entityBrokerManager.parseEntityURL(TestData.SPACE4 + "." + Formats.JSON); assertNotNull(view); entityEncodingManager.internalOutputFormatter(view.getEntityReference(), view.getExtension(), null, null, output, view); fo = output.toString(); assertNotNull(fo); assertTrue(fo.length() > 20); assertTrue(fo.contains(TestData.PREFIX4)); assertTrue(fo.contains(TestData.IDS4[0])); assertTrue(fo.contains(TestData.IDS4[1])); assertTrue(fo.contains(TestData.IDS4[2])); assertTrue(fo.contains(EntityEncodingManager.ENTITY_REFERENCE)); // test for invalid refs try { entityEncodingManager.internalOutputFormatter( new EntityReference("/fakey/fake"), Formats.JSON, null, null, output, null); fail("Should have thrown exception"); } catch (EntityException e) { assertNotNull(e.getMessage()); assertEquals(HttpServletResponse.SC_NOT_FOUND, e.responseCode); } } // testing the internal encoder public void testJSONEncode() { String encoded = null; encoded = entityEncodingManager.encodeData(null, Formats.JSON, null, null); assertNotNull(encoded); assertEquals("", encoded); Map<String, Object> m = new ArrayOrderedMap<String, Object>(); m.put("id", 123); m.put("thing", "AZ"); encoded = entityEncodingManager.encodeData(m, Formats.JSON, null, null); assertNotNull(encoded); assertTrue(encoded.contains("123")); assertTrue(encoded.contains("AZ")); Map<String, Object> m2 = new ArrayOrderedMap<String, Object>(); m2.put("name", "aaron"); m2.put("date", new Date()); m2.put("num", 456); m2.put("array", new String[] {"A","B","C"}); m.put("map", m2); encoded = entityEncodingManager.encodeData(m, Formats.JSON, null, null); assertNotNull(encoded); assertTrue(encoded.contains("123")); assertTrue(encoded.contains("AZ")); assertTrue(encoded.contains("aaron")); assertTrue(encoded.contains("456")); } // testing the internal decoder @SuppressWarnings("unchecked") public void testJSONDecode() { Map<String, Object> decoded = null; String json = "{\"id\":123,\"thing\":\"AZ\"}"; decoded = entityEncodingManager.decodeData(json, Formats.JSON); assertNotNull(decoded); assertEquals(123, decoded.get("id")); assertEquals("AZ", decoded.get("thing")); json = "{\"id\":123,\"thing\":\"AZ\",\"map\":{\"name\":\"aaron\",\"date\":1221493247004,\"num\":456,\"array\":[\"A\",\"B\",\"C\"]}}"; decoded = entityEncodingManager.decodeData(json, Formats.JSON); assertNotNull(decoded); assertEquals(3, decoded.size()); assertEquals(123, decoded.get("id")); assertEquals("AZ", decoded.get("thing")); Map<String, Object> m2d = (Map<String, Object>) decoded.get("map"); assertEquals(4, m2d.size()); assertEquals("aaron", m2d.get("name")); assertEquals(456, m2d.get("num")); } public void testXMLEncode() { String encoded = null; encoded = entityEncodingManager.encodeData(null, Formats.XML, null, null); assertNotNull(encoded); assertEquals("", encoded); Map<String, Object> m = new ArrayOrderedMap<String, Object>(); m.put("id", 123); m.put("thing", "AZ"); encoded = entityEncodingManager.encodeData(m, Formats.XML, null, null); assertNotNull(encoded); assertTrue(encoded.contains("123")); assertTrue(encoded.contains("AZ")); Map<String, Object> m2 = new ArrayOrderedMap<String, Object>(); m2.put("name", "aaron"); m2.put("date", new Date()); m2.put("num", 456); m2.put("array", new String[] {"A","B","C"}); m.put("map", m2); encoded = entityEncodingManager.encodeData(m, Formats.XML, null, null); assertNotNull(encoded); assertTrue(encoded.contains("123")); assertTrue(encoded.contains("AZ")); assertTrue(encoded.contains("aaron")); assertTrue(encoded.contains("456")); } // testing the internal decoder @SuppressWarnings("unchecked") public void testXMLDecode() { Map<String, Object> decoded = null; String xml = "<data><id type='number'>123</id><thing>AZ</thing></data>"; decoded = entityEncodingManager.decodeData(xml, Formats.XML); assertNotNull(decoded); assertEquals(123, decoded.get("id")); assertEquals("AZ", decoded.get("thing")); xml = "<data type='map' size='3' class='org.sakaiproject.genericdao.util.map.ArrayOrderedMap'><id type='number' class='java.lang.Integer'>123</id><thing>AZ</thing><map type='map' size='4' class='org.sakaiproject.genericdao.util.map.ArrayOrderedMap'><name>aaron</name><date type='date' date='2008-09-17T14:47:18+01:00'>1221659238015</date><num type='number' class='java.lang.Integer'>456</num><array type='array' length='3' component='java.lang.String'><string>A</string><string>B</string><string>C</string></array></map></data>"; decoded = entityEncodingManager.decodeData(xml, Formats.XML); assertNotNull(decoded); assertEquals(3, decoded.size()); assertEquals(123, decoded.get("id")); assertEquals("AZ", decoded.get("thing")); Map<String, Object> m2d = (Map<String, Object>) decoded.get("map"); assertEquals(4, m2d.size()); assertEquals("aaron", m2d.get("name")); assertEquals(456, m2d.get("num")); } public void testFormatAndOutputEntity() { String output = null; OutputStream outputStream = new ByteArrayOutputStream(); EntityReference ref = null; String format = Formats.XML; List<EntityData> entities = null; outputStream = new ByteArrayOutputStream(); ref = new EntityReference(TestData.PREFIX4, TestData.IDS4[0]); entityEncodingManager.formatAndOutputEntity(ref, format, entities, outputStream, null); output = outputStream.toString(); assertNotNull(output); assertTrue(output.length() > 20); assertTrue(output.contains(TestData.PREFIX4)); assertTrue(output.contains(TestData.REF4)); outputStream = new ByteArrayOutputStream(); ref = new EntityReference(TestData.PREFIX4, ""); entityEncodingManager.formatAndOutputEntity(ref, format, entities, outputStream, null); output = outputStream.toString(); assertNotNull(output); assertTrue(output.length() > 20); assertTrue(output.contains(TestData.PREFIX4)); assertTrue(output.contains(TestData.REF4)); assertTrue(output.contains(TestData.REF4_two)); assertTrue(output.contains(TestData.REF4_3)); entities = new ArrayList<EntityData>(); entities.add( new EntityData(new EntityReference(TestData.REF4), "Hello1", td.entityProviderS1.myEntities.get(TestData.IDS4[0])) ); entities.add( new EntityData(new EntityReference(TestData.REF4_two), "Hello2", td.entityProviderS1.myEntities.get(TestData.IDS4[1])) ); outputStream = new ByteArrayOutputStream(); ref = new EntityReference(TestData.PREFIX4, ""); entityEncodingManager.formatAndOutputEntity(ref, format, entities, outputStream, null); output = outputStream.toString(); assertNotNull(output); assertTrue(output.length() > 20); assertTrue(output.contains("Hello")); assertTrue(output.contains(TestData.PREFIX4)); assertTrue(output.contains(TestData.REF4)); assertTrue(output.contains(TestData.REF4_two)); entities = null; outputStream = new ByteArrayOutputStream(); ref = new EntityReference(TestData.PREFIXS1, TestData.IDSS1[0]); entityEncodingManager.formatAndOutputEntity(ref, format, entities, outputStream, null); output = outputStream.toString(); assertNotNull(output); assertTrue(output.length() > 20); assertTrue(output.contains(TestData.PREFIXS1)); assertTrue(output.contains("xtra")); assertTrue(output.contains(TestData.IDSS1[0])); entities = new ArrayList<EntityData>(); entities.add( new EntityData(new EntityReference(TestData.PREFIXS1, TestData.IDSS1[0]), "Hello1", td.entityProviderS1.myEntities.get(TestData.IDSS1[0])) ); entities.add( new EntityData(new EntityReference(TestData.PREFIXS1, TestData.IDSS1[2]), "Hello2", td.entityProviderS1.myEntities.get(TestData.IDSS1[2])) ); outputStream = new ByteArrayOutputStream(); ref = new EntityReference(TestData.PREFIXS1, ""); entityEncodingManager.formatAndOutputEntity(ref, format, entities, outputStream, null); output = outputStream.toString(); assertNotNull(output); assertTrue(output.length() > 20); assertTrue(output.contains(TestData.PREFIXS1)); assertTrue(output.contains("Hello")); assertTrue(output.contains("xtra")); assertTrue(output.contains(TestData.IDSS1[0])); assertTrue(output.contains(TestData.IDSS1[2])); } }