package org.springmodules.workflow.osworkflow.configuration; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import junit.framework.TestCase; import org.springframework.util.ClassUtils; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.workflow.FactoryException; import com.opensymphony.workflow.StoreException; import com.opensymphony.workflow.loader.WorkflowDescriptor; import com.opensymphony.workflow.query.WorkflowExpressionQuery; import com.opensymphony.workflow.query.WorkflowQuery; import com.opensymphony.workflow.spi.Step; import com.opensymphony.workflow.spi.WorkflowEntry; import com.opensymphony.workflow.spi.WorkflowStore; import com.opensymphony.workflow.spi.memory.MemoryWorkflowStore; /** * @author robh */ public class ConfigurationBeanTests extends TestCase { public void testGetDefaultStore() throws Exception { ConfigurationBean bean = new ConfigurationBean(); WorkflowStore store = bean.getWorkflowStore(); assertNotNull("Default WorkflowStore should not be null", store); assertEquals("Incorrect default store type", MemoryWorkflowStore.class, store.getClass()); } public void testGetCustomStore() throws Exception { ConfigurationBean bean = new ConfigurationBean(); bean.setPersistence(MockWorkflowStore.class.getName()); WorkflowStore store = bean.getWorkflowStore(); assertNotNull("Custom store should not be null", store); assertEquals("Incorrect store type", MockWorkflowStore.class, store.getClass()); } public void testWithPersistenceArgs() throws Exception { ConfigurationBean bean = new ConfigurationBean(); bean.setPersistence(MockWorkflowStore.class.getName()); Map args = new HashMap(); args.put("foo", "bar"); bean.setPersistenceArgs(args); MockWorkflowStore store = (MockWorkflowStore) bean.getWorkflowStore(); assertSame("Persistence args not carried to WorkflowStore", args, store.getArgs()); } public void testNullWorkflowLocations() throws Exception { try { new ConfigurationBean().setWorkflowLocations(null); fail("Should not be able to set workflowLocations to null"); } catch (IllegalArgumentException e) { // success } } public void testNullAndEmptyPersistenceArgs() throws Exception { try { new ConfigurationBean().setPersistenceArgs(null); fail("Should not be able to set persistenceArgs to null"); } catch (IllegalArgumentException ex) { // success } try { new ConfigurationBean().setPersistenceArgs(new HashMap()); fail("Should not be able to set persistenceArgs to an empty Map"); } catch (IllegalArgumentException ex) { // success } } public void testLoadWorkflows() throws Exception { Properties locations = new Properties(); locations.put("foo", ClassUtils.classPackageAsResourcePath(getClass()) + "/fooFlow.xml"); locations.put("bar", ClassUtils.classPackageAsResourcePath(getClass()) + "/barFlow.xml"); ConfigurationBean bean = new ConfigurationBean(); bean.setWorkflowLocations(locations); String[] names = bean.getWorkflowNames(); Arrays.sort(names); assertTrue(Arrays.binarySearch(names, "foo") > -1); assertTrue(Arrays.binarySearch(names, "bar") > -1); WorkflowDescriptor wd = bean.getWorkflow("foo"); assertNotNull("Workflow descriptor should not be null", wd); } public void testGetNonExistentWorkflowDescriptor() throws Exception { try { new ConfigurationBean().getWorkflow("foo"); fail("Accessing a non-existent workflow should throw FactoryException"); } catch (FactoryException ex) { // success } } public void testRemoveWorkflowIsUnsupported() throws Exception { try { new ConfigurationBean().removeWorkflow("foo"); fail("removeWorkflow should throw UnsupportedOperationException"); } catch (UnsupportedOperationException ex) { // success } } public void testUserDefinedWorkflowStore() throws Exception { MockWorkflowStore mockStore = new MockWorkflowStore(); // do smth on the store to make sure it's our and not overwritten Map marker = new HashMap(); marker.put("foo", "bar"); mockStore.init(marker); ConfigurationBean cfg = new ConfigurationBean(); cfg.setWorkflowStore(mockStore); MockWorkflowStore store = (MockWorkflowStore) cfg.getWorkflowStore(); assertSame("Stores are not the same", mockStore, store); assertSame("Persistence args not carried to WorkflowStore", marker, store.getArgs()); } public static class MockWorkflowStore implements WorkflowStore { private Map args; public void setEntryState(long entryId, int state) throws StoreException { } public PropertySet getPropertySet(long entryId) throws StoreException { return null; } public Step createCurrentStep(long entryId, int stepId, String owner, Date startDate, Date dueDate, String status, long[] previousIds) throws StoreException { return null; } public WorkflowEntry createEntry(String workflowName) throws StoreException { return null; } public List findCurrentSteps(long entryId) throws StoreException { return null; } public WorkflowEntry findEntry(long entryId) throws StoreException { return null; } public List findHistorySteps(long entryId) throws StoreException { return null; } public void init(Map props) throws StoreException { this.args = props; } public Map getArgs() { return this.args; } public Step markFinished(Step step, int actionId, Date finishDate, String status, String caller) throws StoreException { return null; } public void moveToHistory(Step step) throws StoreException { } public List query(WorkflowQuery query) throws StoreException { return null; } public List query(WorkflowExpressionQuery query) throws StoreException { return null; } } }