[cvs] expresso commit by rimovm: Update Test Suites.

JCorporate Ltd jcorp at jcorporate.com
Sat Apr 30 18:38:16 UTC 2005


Log Message:
-----------
Update Test Suites.  Fixed missing message for ErrorTag.

Modified Files:
--------------
    expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/core:
        MessagesBundle.properties
    expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/ext/controller:
        ComponentManager.java
    expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/services/test:
        package.html
    expresso/expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core:
        ExpressoTestSuite.java

Added Files:
-----------
    expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/services/test:
        ControllerTestFixture.java
    expresso/expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/controller/tests:
        ControllerReflectionTestModel.java
        TestControllerReflectionTestModel.java

Revision Data
-------------
--- /dev/null
+++ expresso-web/WEB-INF/src/com/jcorporate/expresso/services/test/ControllerTestFixture.java
@@ -0,0 +1,217 @@
+package com.jcorporate.expresso.services.test;
+
+import com.jcorporate.expresso.core.controller.ControllerFactory;
+import com.jcorporate.expresso.core.controller.session.PersistentSession;
+import com.jcorporate.expresso.core.controller.DefaultControllerFactory;
+import com.jcorporate.expresso.core.controller.session.SimplePersistentSession;
+import com.jcorporate.expresso.core.controller.ControllerException;
+import com.jcorporate.expresso.core.controller.Controller;
+import com.jcorporate.expresso.core.db.DBException;
+import com.jcorporate.expresso.core.registry.RequestRegistry;
+import java.util.Map;
+import com.jcorporate.expresso.core.controller.DefaultForm;
+import com.jcorporate.expresso.core.registry.MutableRequestRegistry;
+import com.jcorporate.expresso.core.controller.ControllerResponse;
+import com.jcorporate.expresso.core.controller.ControllerRequest;
+import com.jcorporate.expresso.core.controller.NonHandleableException;
+import com.jcorporate.expresso.core.security.User;
+import java.util.Hashtable;
+import com.jcorporate.expresso.core.security.SuperUser;
+
+/**
+ * This class provides a non-servlet based testing fixture to allow for simple
+ * usage of testing controllers that don't need server-side capabilities.
+ * Example Usage:
+ *
+ * <p>
+ * <pre>
+ * public class MyControllerTest extends TestCase {
+ * &nbsp;&nbsp;//This class.
+ * &nbsp;&nbsp;private ControllerTestFixture controllerFixture;
+ *
+ * &nbsp;&nbsp;public void setUp() {
+ * &nbsp;&nbsp;&nbsp;&nbsp;testFixture = new ControllerTestFixture();
+ * &nbsp;&nbsp;&nbsp;&nbsp;testFixture.setUp();
+ * &nbsp;&nbsp;}
+ *
+ * &nbsp;&nbsp;public void tearDown() {
+ * &nbsp;&nbsp;&nbsp;&nbsp;testFixture.tearDown();
+ * &nbsp;&nbsp;&nbsp;&nbsp;testFixture = null;
+ * &nbsp;&nbsp;}
+ *
+ * &nbsp;&nbsp;
+ * &nbsp;&nbsp;
+ * &nbsp;&nbsp;//The following code executes the function <strong>'runPromptState'</strong> in class
+ * &nbsp;&nbsp;//<strong>MyController</strong> with no parameters specified.
+ * &nbsp;&nbsp;public void testMyController() {
+ * &nbsp;&nbsp;&nbsp;&nbsp;ControllerResponse myResponse = testFixture.invokeFacade(MyController.class,new HashMap(), "prompt");
+ * &nbsp;&nbsp;&nbsp;&nbsp;assertTrue(myResponse != null);
+ * &nbsp;&nbsp;&nbsp;&nbsp;assertTrue(myResponse.getInput(&quot;loginName&quot;) != null);
+ * &nbsp;&nbsp;&nbsp;&nbsp; //...The rest of your tests here.
+ * &nbsp;&nbsp;}
+ * }
+ * </pre>
+ * </p>
+ * @author Michael Rimov
+ */
+public class ControllerTestFixture
+{
+
+    /**
+     * The ControllerFactory used for unit testing.
+     */
+    private ControllerFactory factory = new DefaultControllerFactory();
+
+    /**
+     * The Session used while unit testing.
+     */
+    private PersistentSession session = new SimplePersistentSession();
+
+    /**
+     * Default constructor.
+     */
+    public ControllerTestFixture() {
+        super();
+    }
+
+    /**
+     * JUnit-like set up.
+     */
+    public void setUp() {
+        factory = new DefaultControllerFactory();
+        session = new SimplePersistentSession();
+    }
+
+    /**
+     * JUnit-like tear down.
+     */
+    public void tearDown() {
+        session = null;
+        factory = null;
+    }
+
+    /**
+     * Constructs a controller given the class.
+     *
+     * @param controllerClass the controller class.
+     * @return Controller instance.
+     * @throws ControllerException upon construction error.
+     */
+    public Controller buildController(Class controllerClass) throws ControllerException {
+        return factory.getController(controllerClass.getName());
+    }
+
+    /**
+     * Invokes the class as specified.
+     * @param controllerClass Class the controller class to execute.
+     * @param parameters Map The parameters to send in.
+     * @param state String the Controller state to execute
+     * @return ControllerResponse The resulting controllerresponse generated after execution.
+     * @throws ControllerException upon error.
+     * @throws NonHandleableException upon fatal error.
+     */
+    public ControllerResponse invokeFacade(final Class controllerClass, final Map parameters, final String state) throws ControllerException, NonHandleableException {
+        Controller controller = null;
+        ControllerRequest request = null;
+        try {
+            controller = buildController(controllerClass);
+            request = buildControllerRequest(parameters, state);
+        } catch (DBException ex) {
+            throw new ControllerException("Error getting user's uid", ex);
+        }
+        return invokeState(state, controller, request);
+
+    }
+
+    /**
+     * Constructs a controller request given target contraoller., security context
+     * and parameters.
+     *
+     * @param parameters       the controller parameters
+     * @param state The State to invoke.
+     * @return constructed ControllerRequest
+     * @throws ControllerException upon internal error.
+     * @throws DBException upon User query error.
+     */
+    public ControllerRequest buildControllerRequest(final Map parameters, final String state) throws ControllerException, DBException {
+        ControllerRequest controllerRequest = new ControllerRequest();
+
+        buildRequestRegistry(SuperUser.INSTANCE);
+        controllerRequest.setUser(RequestRegistry.getUser().getLoginName());
+        controllerRequest.setUid(RequestRegistry.getUser().getUid());
+        controllerRequest.setSession(session);
+
+        DefaultForm form = new DefaultForm();
+        session.setAttribute("default", form);
+        controllerRequest.setFormAttribute("default");
+        controllerRequest.setDataContext(TestSystemInitializer.getTestContext());
+
+
+        controllerRequest.setParameters(new Hashtable(parameters));
+        if (state != null) {
+            controllerRequest.setParameter(Controller.STATE_PARAM_KEY, state);
+        }
+
+        return controllerRequest;
+    }
+
+    /**
+     * Constructs the request registry that is built alongside the controllerrequest
+     * object for this thread.
+     *
+     * @param testUser int the user id for the registry.
+     * @throws DBException upon error retrieving user.
+     */
+    protected void buildRequestRegistry(final User testUser) {
+        new MutableRequestRegistry(TestSystemInitializer.getTestContext(), testUser);
+    }
+
+
+    /**
+     * Retrieve the persistent session associated with this fixture.
+     *
+     * @return PersistentSession.
+     */
+    public PersistentSession getPersistentSession() {
+        return session;
+    }
+
+
+    /**
+     * Invalidates the current session.
+     */
+    public void newSession() {
+        session.invalidate();
+    }
+
+
+    /**
+     * Invokes a particular controller state.
+     *
+     * @param state            the Controller State
+     * @param targetController the target controller to invoke
+     * @param request          the controller request to pass in.
+     * @return ControllerResponse
+     * @throws ControllerException
+     * @throws NonHandleableException
+     */
+    public ControllerResponse invokeState(String state, Controller targetController, ControllerRequest request) throws ControllerException,
+            NonHandleableException {
+
+        String invokeState = state;
+
+        if (invokeState == null) {
+            invokeState = targetController.getInitialState();
+        }
+
+        if (invokeState == null) {
+            throw new ControllerException("No initial state defined for controller: "
+                    + targetController.getClass().getName()
+                    + " and no state was defined for the target context");
+        }
+        ControllerResponse controllerResponse = targetController.newState(invokeState, request);
+
+        return controllerResponse;
+    }
+
+}
Index: package.html
===================================================================
RCS file: /home/javacorp/.cvs/expresso/expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/services/test/package.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/services/test/package.html -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/services/test/package.html -u -r1.2 -r1.3
--- expresso-web/WEB-INF/src/com/jcorporate/expresso/services/test/package.html
+++ expresso-web/WEB-INF/src/com/jcorporate/expresso/services/test/package.html
@@ -4,7 +4,9 @@
   Expresso at the beginning and drops it at the end. You can then use things
   like DBUnit to create/delete individual entries if needed, but the table creation
   is just too long for practical testing.</p>
+<p>Take a look at <tt>ExpressoTestSuite</tt> in the <strong>com.jcorporate.expresso.core </strong>package for an example of how to set up a Test Suite.</p>
 <p>The other class of import is <code>TestSystemInitializer</code>. It allows you to specify
   a scratch database context that you can use, which, of course, is highly advisable
-  since the unit tests are <em><strong>highly destructive</strong></em>.</p>
+since the unit tests are <em><strong>highly destructive</strong></em> as the tables are first dropped and recreated to a known state.</p>
+<p>If your Controller state handlers do not require Servlet specifics (ie do not use the class ServletControllerRequest, then you may use the ControllerTestFixture class to help test your controllers in a client side unit test. See the documentation for that class for an example usage. </p>
 </body>
Index: ExpressoTestSuite.java
===================================================================
RCS file: /home/javacorp/.cvs/expresso/expresso/expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/ExpressoTestSuite.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -Lexpresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/ExpressoTestSuite.java -Lexpresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/ExpressoTestSuite.java -u -r1.6 -r1.7
--- expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/ExpressoTestSuite.java
+++ expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/ExpressoTestSuite.java
@@ -116,6 +116,7 @@
 
         ts.addTestSuite(com.jcorporate.expresso.core.security.filters.FilterTreeTest.class);
         ts.addTestSuite(com.jcorporate.expresso.core.db.tests.DBConnectionPoolTest.class);
+        ts.addTestSuite(com.jcorporate.expresso.core.controller.tests.TestControllerReflectionTestModel.class);
         ts.addTestSuite(com.jcorporate.expresso.core.controller.tests.InputTests.class);
         ts.addTestSuite(com.jcorporate.expresso.core.controller.tests.OutputTests.class);
         ts.addTestSuite(com.jcorporate.expresso.core.controller.tests.TransitionTests.class);
Index: MessagesBundle.properties
===================================================================
RCS file: /home/javacorp/.cvs/expresso/expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/core/MessagesBundle.properties,v
retrieving revision 1.23
retrieving revision 1.24
diff -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/core/MessagesBundle.properties -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/core/MessagesBundle.properties -u -r1.23 -r1.24
--- expresso-web/WEB-INF/src/com/jcorporate/expresso/core/MessagesBundle.properties
+++ expresso-web/WEB-INF/src/com/jcorporate/expresso/core/MessagesBundle.properties
@@ -562,8 +562,8 @@
 registration.info.approval=Once the administrator has approved or denied your registration, you will be notified via email
 registration.success.validate=Login "{0}" was registered successfully in db/context "{1}"
 registration.info.validate=You will receive an authorization email at "{0}" in a few moments. Please follow the instructions in the email to proceed with the registration process.
-errors.suffix=.
 
+errors.suffix=</li>
 errors.required={0} cannot be null.
 errors.minlength={0} cannot have less than {1} characters.
 errors.maxlength={0} cannot have more than {1} characters.
Index: ComponentManager.java
===================================================================
RCS file: /home/javacorp/.cvs/expresso/expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/ext/controller/ComponentManager.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/ext/controller/ComponentManager.java -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/ext/controller/ComponentManager.java -u -r1.21 -r1.22
--- expresso-web/WEB-INF/src/com/jcorporate/expresso/ext/controller/ComponentManager.java
+++ expresso-web/WEB-INF/src/com/jcorporate/expresso/ext/controller/ComponentManager.java
@@ -671,7 +671,7 @@
                     " appear to derive from com.jcorporate.expresso.core.dbobj.Schema");
         } catch (Exception e) {
             log.error("Error attempting to load class: " + className, e);
-            ec.addError("There was an error loading the class specified: " + className);
+            ec.addError("There was an error loading the class specified: " + className + ". Exception Type was: " + e.getClass().getName() + ", Error Message is: " + e.getMessage());
         }
 
         return ec;
--- /dev/null
+++ expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/controller/tests/ControllerReflectionTestModel.java
@@ -0,0 +1,27 @@
+package com.jcorporate.expresso.core.controller.tests;
+
+import com.jcorporate.expresso.core.controller.*;
+
+/**
+ * Test Model to make sure that reflection is working as specified.
+ *
+ * @author Michael Rimov
+ * @version $Revision: 1.1 $ on $Date: 2005/04/30 18:37:44 $
+ */
+public class ControllerReflectionTestModel extends Controller
+{
+    public ControllerReflectionTestModel() {
+        super();
+        State s = new State("test1", "ControllerRequest/ControllerResponse signature");
+        this.addState(s);
+
+        this.setInitialState("test1");
+
+    }
+
+    public void runTest1State(final ControllerRequest request, final ControllerResponse response) throws Exception {
+        response.add(new Output("This is a test"));
+    }
+
+
+}
--- /dev/null
+++ expresso-web/WEB-INF/test-src/com/jcorporate/expresso/core/controller/tests/TestControllerReflectionTestModel.java
@@ -0,0 +1,34 @@
+package com.jcorporate.expresso.core.controller.tests;
+
+import junit.framework.*;
+import com.jcorporate.expresso.core.controller.*;
+import com.jcorporate.expresso.services.test.ControllerTestFixture;
+import java.util.HashMap;
+
+/**
+ *
+ * @author Michael Rimov
+ * @version $Revision: 1.1 $ on $Date: 2005/04/30 18:37:44 $
+ */
+public class TestControllerReflectionTestModel extends TestCase {
+    private ControllerTestFixture controllerFixture;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        controllerFixture = new ControllerTestFixture();
+        controllerFixture.setUp();
+    }
+
+    protected void tearDown() throws Exception {
+        controllerFixture.tearDown();
+        controllerFixture = null;
+    }
+
+    public void testRunTest1State() throws Exception {
+        ControllerResponse response = controllerFixture.invokeFacade(ControllerReflectionTestModel.class, new HashMap(), "test1");
+        assertTrue(response != null);
+        assertTrue(response.getOutputs().size() == 1);
+    }
+
+
+}


More information about the cvs mailing list