[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 {
+ * //This class.
+ * private ControllerTestFixture controllerFixture;
+ *
+ * public void setUp() {
+ * testFixture = new ControllerTestFixture();
+ * testFixture.setUp();
+ * }
+ *
+ * public void tearDown() {
+ * testFixture.tearDown();
+ * testFixture = null;
+ * }
+ *
+ *
+ *
+ * //The following code executes the function <strong>'runPromptState'</strong> in class
+ * //<strong>MyController</strong> with no parameters specified.
+ * public void testMyController() {
+ * ControllerResponse myResponse = testFixture.invokeFacade(MyController.class,new HashMap(), "prompt");
+ * assertTrue(myResponse != null);
+ * assertTrue(myResponse.getInput("loginName") != null);
+ * //...The rest of your tests here.
+ * }
+ * }
+ * </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