/**
* EntityBrokerImplTest.java - 2007 Jul 21, 2007 3:04:55 PM - entity-broker - AZ
*/
package org.sakaiproject.entitybroker.rest;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Set;
import org.sakaiproject.entitybroker.EntityReference;
import org.sakaiproject.entitybroker.EntityView;
import org.sakaiproject.entitybroker.entityprovider.extension.ActionReturn;
import org.sakaiproject.entitybroker.entityprovider.extension.EntityData;
import org.sakaiproject.entitybroker.entityprovider.extension.Formats;
import org.sakaiproject.entitybroker.impl.EntityBrokerImpl;
import org.sakaiproject.entitybroker.mocks.ActionsEntityProviderMock;
import org.sakaiproject.entitybroker.mocks.data.MyEntity;
import org.sakaiproject.entitybroker.mocks.data.TestData;
/**
* Testing the entitybroker implementation
*
* @author Aaron Zeckoski (azeckoski@gmail.com)
*/
public class EntityBrokerImplTest {
protected EntityBrokerImpl entityBroker;
private TestData td;
@Before
public void setUp() {
// init the test data
td = new TestData();
// setup fake internal services
ServiceTestManager tm = new ServiceTestManager(td);
// create and setup the object to be tested
entityBroker = tm.entityBroker;
}
/**
* 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);
*/
/**
* Test method for
* {@link org.sakaiproject.entitybroker.impl.EntityBrokerImpl#entityExists(java.lang.String)}.
*/
@Test
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)}.
*/
@Test
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());
}
}
@Test
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);
}
@Test
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()}.
*/
@Test
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)}.
*/
@Test
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)}.
*/
@Test
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)}.
*/
@Test
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());
}
}
@Test
public void testFormatAndOutputEntity() {
String fo = null;
String reference = null;
OutputStream output = null;
String format = Formats.XML;
// XML test valid resolveable entity
reference = TestData.REF4;
output = new ByteArrayOutputStream();
entityBroker.formatAndOutputEntity(reference, format, 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) );
reference = TestData.SPACE4;
output = new ByteArrayOutputStream();
entityBroker.formatAndOutputEntity(reference, format, testEntities, 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));
}
/**
* 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;
}
@Test
public void testTranslateInputToEntity() {
InputStream input = null;
MyEntity me = null;
// test creating an entity
String reference = TestData.SPACE6;
String format = Formats.XML;
input = new ByteArrayInputStream( makeUTF8Bytes("<"+TestData.PREFIX6+"><stuff>TEST</stuff><number>5</number></"+TestData.PREFIX6+">") );
me = (MyEntity) entityBroker.translateInputToEntity(reference, format, input, null);
assertNotNull(me);
assertNull(me.getId());
assertEquals("TEST", me.getStuff());
assertEquals(5, me.getNumber());
// test modifying an entity
reference = TestData.REF6_2;
input = new ByteArrayInputStream( makeUTF8Bytes("<"+TestData.PREFIX6+"><id>"+TestData.IDS6[1]+"</id><stuff>TEST-PUT</stuff><number>8</number></"+TestData.PREFIX6+">") );
me = (MyEntity) entityBroker.translateInputToEntity(reference, format, input, null);
assertNotNull(me);
assertNotNull(me.getId());
assertEquals(TestData.IDS6[1], me.getId());
assertEquals("TEST-PUT", me.getStuff());
assertEquals(8, me.getNumber());
}
@Test
public void testExecuteCustomAction() {
ActionReturn actionReturn = null;
// test the double/xxx/clear actions
ActionsEntityProviderMock actionProvider = td.entityProviderA1;
// double
MyEntity me = (MyEntity) actionProvider.getEntity( new EntityReference(TestData.REFA1) );
int num = me.getNumber();
actionReturn = entityBroker.executeCustomAction(TestData.REFA1, "double", null, null);
//ActionReturn actionReturn = entityActionsManager.handleCustomActionExecution(actionProvider, ref, "double", null, null);
assertNotNull(actionReturn);
assertNotNull(actionReturn.entityData);
MyEntity doubleMe = (MyEntity) actionReturn.entityData.getData();
assertEquals(doubleMe.getNumber(), num * 2);
assertEquals(me.getId(), doubleMe.getId());
// xxx
MyEntity me1 = (MyEntity) actionProvider.getEntity( new EntityReference(TestData.REFA1) );
assertFalse("xxx".equals(me1.extra));
assertFalse("xxx".equals(me1.getStuff()));
actionReturn = entityBroker.executeCustomAction(TestData.REFA1, "xxx", null, null);
assertNull(actionReturn);
MyEntity xxxMe = (MyEntity) actionProvider.getEntity( new EntityReference(TestData.REFA1) );
assertEquals(me1.getId(), xxxMe.getId());
assertTrue("xxx".equals(xxxMe.extra));
assertTrue("xxx".equals(xxxMe.getStuff()));
// clear
assertEquals(2, actionProvider.myEntities.size());
actionReturn = entityBroker.executeCustomAction(TestData.SPACEA1, "clear", null, null);
assertEquals(0, actionProvider.myEntities.size());
// check exception when try to execute invalid action
try {
entityBroker.executeCustomAction(TestData.REF3A, "action", null, null);
fail("should have thrown exeception");
} catch (IllegalArgumentException e) {
assertNotNull(e.getMessage());
}
try {
entityBroker.executeCustomAction(TestData.INVALID_REF, "action", null, null);
fail("should have thrown exeception");
} catch (IllegalArgumentException e) {
assertNotNull(e.getMessage());
}
String ref = TestData.SPACEA1+"/yyyy/zzzzz/123456";
actionReturn = entityBroker.executeCustomAction(ref, "yyyy", null, null);
assertNotNull(actionReturn);
assertEquals(ref, actionReturn.getOutputString());
}
}