/** * EntityBrokerImplTest.java - 2007 Jul 21, 2007 3:04:55 PM - entity-broker - AZ */ package org.sakaiproject.entitybroker.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; import java.util.Set; import org.sakaiproject.entitybroker.EntityReference; import org.sakaiproject.entitybroker.EntityView; import org.sakaiproject.entitybroker.dao.EntityBrokerDao; import org.sakaiproject.entitybroker.entityprovider.extension.Formats; import org.sakaiproject.entitybroker.impl.data.TestDataPreload; import org.sakaiproject.entitybroker.mocks.data.MyEntity; import org.sakaiproject.entitybroker.mocks.data.TestData; import org.springframework.test.AbstractTransactionalSpringContextTests; /** * Testing the entitybroker implementation * * @author Aaron Zeckoski (azeckoski@gmail.com) */ @SuppressWarnings("deprecation") public class EntityBrokerTransactionalTest extends AbstractTransactionalSpringContextTests { protected EntityBrokerImpl entityBroker; private EntityBrokerDao dao; private TestData td; private TestDataPreload tdp; protected String[] getConfigLocations() { // point to the needed spring config files, must be on the classpath // (add component/src/webapp/WEB-INF to the build path in Eclipse), // they also need to be referenced in the project.xml file return new String[] { "database-test.xml", "classpath:org/sakaiproject/entitybroker/spring-jdbc.xml" }; } // run this before each test starts protected void onSetUpBeforeTransaction() throws Exception { // load the spring created dao class bean from the Spring Application Context dao = (EntityBrokerDao) applicationContext .getBean("org.sakaiproject.entitybroker.dao.EntityBrokerDao"); if (dao == null) { throw new NullPointerException("Dao could not be retrieved from spring context"); } // load up the test data preloader from spring tdp = (TestDataPreload) applicationContext.getBean("org.sakaiproject.entitybroker.impl.test.data.TestDataPreload"); if (tdp == null) { throw new NullPointerException( "TestDatePreload could not be retrieved from spring context"); } // load up any other needed spring beans // init the test data td = new TestData(); // setup fake internal services ServiceTestManager tm = new ServiceTestManager(td, dao); // create and setup the object to be tested entityBroker = new EntityBrokerImpl(); entityBroker.setEntityBrokerManager( tm.entityBrokerManager ); entityBroker.setEntityProviderManager( tm.entityProviderManager ); entityBroker.setTagSearchService( tm.entityTaggingService ); entityBroker.setPropertiesProvider( tm.entityMetaPropertiesService ); entityBroker.setRequestStorage( tm.requestStorage ); // NOTE: no external integration provider set // NOTE: no REST provider set } // run this before each test starts and as part of the transaction protected void onSetUpInTransaction() { // preload additional data if desired } /** * ADD unit tests below here, use testMethod as the name of the unit test, Note that if a method * is overloaded you should include the arguments in the test name like so: testMethodClassInt * (for method(Class, int); */ public void testValidTestData() { // ensure the test data is setup the way we think assertNotNull(td); assertNotNull(tdp); // assertEquals(new Long(1), tdp.pNode1.getId()); } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#entityExists(java.lang.String)}. */ public void testEntityExists() { boolean exists = false; exists = entityBroker.entityExists(TestData.REF1); assertTrue(exists); exists = entityBroker.entityExists(TestData.REF1_1); assertTrue(exists); exists = entityBroker.entityExists(TestData.REF2); assertTrue(exists); // test that invalid id with valid prefix does not pass exists = entityBroker.entityExists(TestData.REF1_INVALID); assertFalse(exists); // test that unregistered ref does not pass exists = entityBroker.entityExists(TestData.REF9); assertFalse(exists); // test that invalid ref causes exception try { exists = entityBroker.entityExists(TestData.INVALID_REF); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#getEntityURL(java.lang.String)}. */ public void testGetEntityURL() { String url = null; url = entityBroker.getEntityURL(TestData.REF1); assertEquals(TestData.URL1, url); url = entityBroker.getEntityURL(TestData.REF2); assertEquals(TestData.URL2, url); url = entityBroker.getEntityURL(TestData.REF1_INVALID); try { url = entityBroker.getEntityURL(TestData.INVALID_REF); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } public void testGetEntityURLStringStringString() { String url = null; url = entityBroker.getEntityURL(TestData.REF1, null, null); assertEquals(TestData.URL1, url); url = entityBroker.getEntityURL(TestData.REF2, null, null); assertEquals(TestData.URL2, url); // test adding viewkey url = entityBroker.getEntityURL(TestData.REF1, EntityView.VIEW_SHOW, null); assertEquals(TestData.URL1, url); url = entityBroker.getEntityURL(TestData.REF1, EntityView.VIEW_LIST, null); assertEquals(TestData.SPACE_URL1, url); url = entityBroker.getEntityURL(TestData.REF1, EntityView.VIEW_NEW, null); assertEquals(TestData.SPACE_URL1 + "/new", url); url = entityBroker.getEntityURL(TestData.REF1, EntityView.VIEW_EDIT, null); assertEquals(TestData.URL1 + "/edit", url); url = entityBroker.getEntityURL(TestData.REF1, EntityView.VIEW_DELETE, null); assertEquals(TestData.URL1 + "/delete", url); // test extension url = entityBroker.getEntityURL(TestData.REF1, null, "xml"); assertEquals(TestData.URL1 + ".xml", url); url = entityBroker.getEntityURL(TestData.REF2, null, "json"); assertEquals(TestData.URL2 + ".json", url); // test both url = entityBroker.getEntityURL(TestData.REF1, EntityView.VIEW_EDIT, "xml"); assertEquals(TestData.URL1 + "/edit.xml", url); } public void testIsPrefixRegistered() { assertTrue( entityBroker.isPrefixRegistered(TestData.PREFIX1) ); assertTrue( entityBroker.isPrefixRegistered(TestData.PREFIX2) ); assertTrue( entityBroker.isPrefixRegistered(TestData.PREFIX3) ); assertTrue( entityBroker.isPrefixRegistered(TestData.PREFIX4) ); assertTrue( entityBroker.isPrefixRegistered(TestData.PREFIX5) ); assertFalse( entityBroker.isPrefixRegistered(TestData.PREFIX9) ); assertFalse( entityBroker.isPrefixRegistered("XXXXXX") ); } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#getRegisteredPrefixes()}. */ public void testGetRegisteredPrefixes() { Set<String> s = entityBroker.getRegisteredPrefixes(); assertNotNull(s); assertTrue(s.contains(TestData.PREFIX1)); assertTrue(s.contains(TestData.PREFIX2)); assertTrue(s.contains(TestData.PREFIX3)); assertFalse(s.contains(TestData.PREFIX9)); } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#fireEvent(java.lang.String, java.lang.String)}. */ public void testFireEvent() { // we are mostly handing this to a mocked service so we can only check to see if errors occur entityBroker.fireEvent(TestData.EVENT1_NAME, TestData.REF1); entityBroker.fireEvent(TestData.EVENT1_NAME, TestData.REF2); entityBroker.fireEvent(TestData.EVENT2_NAME, TestData.REF1); entityBroker.fireEvent(TestData.EVENT2_NAME, "XXXXXXXXXXXXXX"); // event with a null name should die try { entityBroker.fireEvent(null, TestData.REF1); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } try { entityBroker.fireEvent("", TestData.REF1); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#parseReference(java.lang.String)}. */ public void testParseReference() { EntityReference er = null; er = entityBroker.parseReference(TestData.REF1); assertNotNull(er); assertEquals(TestData.PREFIX1, er.getPrefix()); assertEquals(TestData.IDS1[0], er.getId()); er = entityBroker.parseReference(TestData.REF2); assertNotNull(er); assertEquals(TestData.PREFIX2, er.getPrefix()); // test parsing a defined reference er = entityBroker.parseReference(TestData.REF3A); assertNotNull(er); assertEquals(TestData.PREFIX3, er.getPrefix()); // parsing of unregistered entity references returns null er = entityBroker.parseReference(TestData.REF9); assertNull(er); // parsing with nonexistent prefix returns null er = entityBroker.parseReference("/totallyfake/notreal"); assertNull(er); try { er = entityBroker.parseReference(TestData.INVALID_REF); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#fetchEntity(java.lang.String)}. */ public void testFetchEntity() { Object obj = null; obj = entityBroker.fetchEntity(TestData.REF4); assertNotNull(obj); assertTrue(obj instanceof MyEntity); MyEntity entity = (MyEntity) obj; assertEquals(entity.getId(), TestData.IDS4[0]); obj = entityBroker.fetchEntity(TestData.REF4_two); assertNotNull(obj); assertTrue(obj instanceof MyEntity); MyEntity entity2 = (MyEntity) obj; assertEquals(entity2.getId(), TestData.IDS4[1]); // no object available should cause failure obj = entityBroker.fetchEntity(TestData.REF1); assertNull(obj); obj = entityBroker.fetchEntity(TestData.REF2); assertNull(obj); // use an unregistered provider to trigger the attempt to do a legacy lookup which will fail and return null obj = entityBroker.fetchEntity(TestData.REF9); assertNull(obj); // expect invalid reference to fail try { obj = entityBroker.fetchEntity(TestData.INVALID_REF); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } try { obj = entityBroker.fetchEntity(null); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } public void testFormatAndOutputEntity() { // test no provider String reference = TestData.REF4; OutputStream output = new ByteArrayOutputStream(); String format = Formats.XML; try { entityBroker.formatAndOutputEntity(reference, format, null, output, null); fail("Should have died"); } catch (UnsupportedOperationException 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; } public void testTranslateInputToEntity() { // test no provider String reference = TestData.SPACE6; String format = Formats.XML; InputStream input = new ByteArrayInputStream( makeUTF8Bytes("<"+TestData.PREFIX6+"><stuff>TEST</stuff><number>5</number></"+TestData.PREFIX6+">") ); try { entityBroker.translateInputToEntity(reference, format, input, null); fail("Should have died"); } catch (UnsupportedOperationException e) { assertNotNull(e.getMessage()); } } public void testExecuteCustomAction() { // test no provider try { entityBroker.executeCustomAction(TestData.REFA1, "double", null, null); fail("Should have died"); } catch (UnsupportedOperationException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#findEntityRefs(java.lang.String[], java.lang.String[], java.lang.String[], boolean)}. */ public void testFindEntityRefs() { List<String> l = null; // test search with limit by prefix l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, null, null, true); assertNotNull(l); assertEquals(2, l.size()); assertTrue(l.contains(TestData.REF5)); assertTrue(l.contains(TestData.REF5_2)); // test search with limit by prefix (check that no results ok) l = entityBroker.findEntityRefs(new String[] { TestData.INVALID_REF }, null, null, true); assertNotNull(l); assertEquals(0, l.size()); // test searching with multiple prefixes l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5, TestData.PREFIX1 }, null, null, true); assertNotNull(l); assertEquals(2, l.size()); assertTrue(l.contains(TestData.REF5)); assertTrue(l.contains(TestData.REF5_2)); // test searching by names l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] { TestData.PROPERTY_NAME5A }, null, true); assertNotNull(l); assertEquals(1, l.size()); assertTrue(l.contains(TestData.REF5)); // test searching by invalid name (return no results) l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] { TestData.INVALID_REF }, null, true); assertNotNull(l); assertEquals(0, l.size()); // test searching with multiple names l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] { TestData.PROPERTY_NAME5A, TestData.PROPERTY_NAME5C }, null, true); assertNotNull(l); assertEquals(2, l.size()); assertTrue(l.contains(TestData.REF5)); assertTrue(l.contains(TestData.REF5_2)); // test search limit by values (long exact match) l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] { TestData.PROPERTY_NAME5C }, new String[] { TestData.PROPERTY_VALUE5C }, true); assertNotNull(l); assertEquals(1, l.size()); assertTrue(l.contains(TestData.REF5_2)); // test search limit by values (exact match) l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] { TestData.PROPERTY_NAME5B }, new String[] { TestData.PROPERTY_VALUE5B }, true); assertNotNull(l); assertEquals(1, l.size()); assertTrue(l.contains(TestData.REF5)); // cannot have empty or null prefix try { l = entityBroker.findEntityRefs(new String[] {}, new String[] { TestData.PROPERTY_NAME5A }, null, true); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } try { l = entityBroker.findEntityRefs(null, new String[] { TestData.PROPERTY_NAME5A }, null, true); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } // test search limit by values cannot have name null or empty try { l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] {}, new String[] { TestData.PROPERTY_VALUE5A }, true); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } // test name and values arrays must match sizes try { l = entityBroker.findEntityRefs(new String[] { TestData.PREFIX5 }, new String[] { TestData.PROPERTY_NAME5A, TestData.PROPERTY_NAME5B }, new String[] { TestData.PROPERTY_VALUE5A }, true); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } // test search with all empty fields fail try { l = entityBroker.findEntityRefs(new String[] {}, new String[] {}, new String[] {}, false); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#getProperties(java.lang.String)}. */ public void testGetProperties() { Map<String, String> m = null; m = entityBroker.getProperties(TestData.REF5); assertNotNull(m); assertEquals(2, m.size()); assertTrue(m.containsKey(TestData.PROPERTY_NAME5A)); assertTrue(m.containsKey(TestData.PROPERTY_NAME5B)); m = entityBroker.getProperties(TestData.REF5_2); assertNotNull(m); assertEquals(1, m.size()); assertTrue(m.containsKey(TestData.PROPERTY_NAME5C)); // ref with no properties should fetch none m = entityBroker.getProperties(TestData.REF1); assertNotNull(m); assertTrue(m.isEmpty()); // make sure invalid ref causes failure try { m = entityBroker.getProperties(TestData.INVALID_REF); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#getPropertyValue(java.lang.String, java.lang.String)}. */ public void testGetPropertyValue() { String value = null; value = entityBroker.getPropertyValue(TestData.REF5, TestData.PROPERTY_NAME5A); assertNotNull(value); assertEquals(TestData.PROPERTY_VALUE5A, value); value = entityBroker.getPropertyValue(TestData.REF5, TestData.PROPERTY_NAME5B); assertNotNull(value); assertEquals(TestData.PROPERTY_VALUE5B, value); // test large value retrieval value = entityBroker.getPropertyValue(TestData.REF5_2, TestData.PROPERTY_NAME5C); assertNotNull(value); assertEquals(TestData.PROPERTY_VALUE5C, value); // nonexistent value property get retrieves null value = entityBroker.getPropertyValue(TestData.REF5, "XXXXXXXXXXXX"); assertNull(value); // make sure invalid ref causes failure try { value = entityBroker.getPropertyValue(TestData.INVALID_REF, TestData.PROPERTY_NAME5A); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } // null name causes failure try { value = entityBroker.getPropertyValue(TestData.REF5, null); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } // empty name causes failure try { value = entityBroker.getPropertyValue(TestData.REF5, ""); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for * {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#setPropertyValue(java.lang.String, java.lang.String, java.lang.String[])}. */ public void testSetPropertyValue() { String value = null; // check that we can save a new property on an entity entityBroker.setPropertyValue(TestData.REF5, "newNameAlpha", "newValueAlpha"); value = entityBroker.getPropertyValue(TestData.REF5, "newNameAlpha"); assertNotNull(value); assertEquals("newValueAlpha", value); // check that we can update an existing property on an entity entityBroker.setPropertyValue(TestData.REF5, TestData.PROPERTY_NAME5A, "AZnewValue"); value = entityBroker.getPropertyValue(TestData.REF5, TestData.PROPERTY_NAME5A); assertNotNull(value); assertNotSame(TestData.PROPERTY_VALUE5A, value); assertEquals("AZnewValue", value); // check that we can remove a property on an entity entityBroker.setPropertyValue(TestData.REF5, "newNameAlpha", null); value = entityBroker.getPropertyValue(TestData.REF5, "newNameAlpha"); assertNull(value); // check that we can remove all properties on an entity Map<String, String> m = entityBroker.getProperties(TestData.REF5); assertEquals(2, m.size()); entityBroker.setPropertyValue(TestData.REF5, null, null); m = entityBroker.getProperties(TestData.REF5); assertEquals(0, m.size()); // make sure invalid ref causes failure try { entityBroker.setPropertyValue(TestData.INVALID_REF, "newNameAlpha", "newValueAlpha"); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } // make sure invalid params cause failure try { entityBroker.setPropertyValue(TestData.REF1, null, "XXXXXXXXX"); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertNotNull(e.getMessage()); } } /** * Test method for {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#getTags(java.lang.String)}. */ public void testGetTags() { Set<String> tags = null; tags = entityBroker.getTags(TestData.REF1); assertNotNull(tags); assertEquals(2, tags.size()); assertTrue(tags.contains("test")); assertTrue(tags.contains("aaronz")); tags = entityBroker.getTags(TestData.REF1_1); assertNotNull(tags); assertEquals(0, tags.size()); } /** * Test method for {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#setTags(java.lang.String, java.util.Set)}. */ public void testSetTags() { // test adding new tags entityBroker.setTags(TestData.REF1_1, new String[] {"test"}); assertEquals(1, entityBroker.getTags(TestData.REF1_1).size() ); // test clearing tags entityBroker.setTags(TestData.REF1, new String[] {}); assertEquals(0, entityBroker.getTags(TestData.REF1).size() ); } /** * Test method for {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#findEntityRefsByTags(java.lang.String[])}. */ public void testFindEntityRefsByTags() { List<String> refs = null; refs = entityBroker.findEntityRefsByTags( new String[] {"aaronz"} ); assertNotNull(refs); assertEquals(1, refs.size()); assertEquals(TestData.REF1, refs.get(0)); refs = entityBroker.findEntityRefsByTags( new String[] {"test"} ); assertNotNull(refs); assertEquals(2, refs.size()); assertEquals(TestData.REFT1, refs.get(0)); assertEquals(TestData.REF1, refs.get(1)); entityBroker.setTags(TestData.REF1_1, new String[] {"test"}); refs = entityBroker.findEntityRefsByTags( new String[] {"test"} ); assertNotNull(refs); assertEquals(3, refs.size()); } }