Title: [waffle-scm] [321] trunk/core/src/test/java/org/codehaus/waffle/action: DefaultActionMethodResponseHandler will process ActionMethodExceptions so that response status code will be set correctly

Diff

Modified: trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java (320 => 321)

--- trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java	2007-10-09 17:42:22 UTC (rev 320)
+++ trunk/core/src/main/java/org/codehaus/waffle/action/ActionMethodException.java	2007-10-10 12:36:24 UTC (rev 321)
@@ -14,7 +14,29 @@
 
 /**
  * This is a specialized exception that will be thrown directly from an ActionMethod.  Exceptions of this type
- * will set the response status code and response body specially.
+ * will set the response statusCode code and response body.
  */
 public class ActionMethodException extends WaffleException {
+    private final int statusCode;
+    private final String message;
+
+    /**
+     * An expected error has occurred the requestor should be notified with the appropriate status and message.
+     *
+     * @param statusCode the value the response status should be set to
+     * @param message the text to be returned
+     */
+    public ActionMethodException(int statusCode, String message) {
+        this.statusCode = statusCode;
+        this.message = message;
+    }
+
+    public int getStatusCode() {
+        return statusCode;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
 }

Modified: trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java (320 => 321)

--- trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java	2007-10-09 17:42:22 UTC (rev 320)
+++ trunk/core/src/main/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandler.java	2007-10-10 12:36:24 UTC (rev 321)
@@ -58,10 +58,10 @@
         if (returnValue instanceof View) {
             View view = (View) returnValue;
             viewDispatcher.dispatch(request, response, view);
-        } else if (returnValue instanceof Exception) {
-            Exception exception = (Exception) returnValue;
-            monitor.actionMethodExecutionFailed(exception);
-            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        } else if (returnValue instanceof ActionMethodException) {
+            ActionMethodException exception = (ActionMethodException) returnValue;
+            monitor.actionMethodExecutionFailed(exception); // todo ... this isn't really necessarily a true failure
+            response.setStatus(exception.getStatusCode());
             handleResponse(response, exception.getMessage());
         } else {
             handleResponse(response, returnValue.toString());

Copied: trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandlerTest.java (from rev 317, trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java) (0 => 321)

--- trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandlerTest.java	                        (rev 0)
+++ trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionMethodResponseHandlerTest.java	2007-10-10 12:36:24 UTC (rev 321)
@@ -0,0 +1,157 @@
+package org.codehaus.waffle.action;
+
+import org.codehaus.waffle.monitor.ActionMonitor;
+import org.codehaus.waffle.testmodel.StubMonitor;
+import org.codehaus.waffle.testmodel.StubViewDispatcher;
+import org.codehaus.waffle.view.View;
+import org.codehaus.waffle.view.ViewDispatcher;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JMock;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
[EMAIL PROTECTED](JMock.class)
+public class DefaultActionMethodResponseHandlerTest {
+    private final Mockery context = new JUnit4Mockery();
+
+    @Test
+    public void constructorShouldsNotAcceptNulls() {
+        try {
+            new DefaultActionMethodResponseHandler(null, null);
+            Assert.fail("IllegalArgumentException expected, null is not a valid argument");
+        } catch (IllegalArgumentException expected) {
+            // expected
+        }
+        try {
+            new DefaultActionMethodResponseHandler(null, new StubMonitor());
+            Assert.fail("IllegalArgumentException expected, null is not a valid argument");
+        } catch (IllegalArgumentException expected) {
+            // expected
+        }
+        try {
+            new DefaultActionMethodResponseHandler(new StubViewDispatcher(), null);
+            Assert.fail("IllegalArgumentException expected, null is not a valid argument");
+        } catch (IllegalArgumentException expected) {
+            // expected
+        }
+    }
+
+    @Test
+    public void executeShouldNotProcessResponseValueWhenResponseHasBeenCommitted() throws Exception {
+        final HttpServletResponse response = context.mock(HttpServletResponse.class);
+        context.checking(new Expectations() {{
+            one (response).isCommitted();
+            will(returnValue(true));
+        }});
+
+        ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class);
+        ActionMonitor actionMonitor = context.mock(ActionMonitor.class);
+
+        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
+        handler.handle(null, response, null);
+    }
+
+    @Test
+    public void responseValueOfTypeViewShouldBeDelegatedToViewDispatcher() throws IOException, ServletException {
+        final View view = new View("foobar", null);
+        ActionMethodResponse actionMethodResponse = new ActionMethodResponse();
+        actionMethodResponse.setReturnValue(view);
+
+        final HttpServletResponse response = context.mock(HttpServletResponse.class);
+        context.checking(new Expectations() {{
+            one (response).isCommitted();
+            will(returnValue(false));
+        }});
+
+        final HttpServletRequest request = context.mock(HttpServletRequest.class);
+        final ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class);
+        context.checking(new Expectations() {{
+            one (viewDispatcher).dispatch(request, response, view);
+        }});
+
+        ActionMonitor actionMonitor = context.mock(ActionMonitor.class);
+
+        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
+        handler.handle(request, response, actionMethodResponse);
+    }
+
+    @Test
+    public void responseValueShouldBeWrittenToOutputStream() throws Exception {
+        ActionMethodResponse actionMethodResponse = new ActionMethodResponse();
+        actionMethodResponse.setReturnValue("Mmmmm Waffles!");
+
+        final StubServletOutputStream out = new StubServletOutputStream();
+
+        final HttpServletResponse response = context.mock(HttpServletResponse.class);
+        context.checking(new Expectations() {{
+            one (response).isCommitted();
+            will(returnValue(false));
+            one(response).getOutputStream();
+            will(returnValue(out));
+            one(response).flushBuffer();
+        }});
+
+        HttpServletRequest request = context.mock(HttpServletRequest.class);
+        ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class);
+        ActionMonitor actionMonitor = context.mock(ActionMonitor.class);
+
+        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
+        handler.handle(request, response, actionMethodResponse);
+
+        Assert.assertEquals("Mmmmm Waffles!", out.buffer.toString());
+    }
+
+    @SuppressWarnings({"ThrowableInstanceNeverThrown"})
+    @Test
+    public void responseValueOfTypeActionMethodExceptionShouldSetResponseCorrectly() throws IOException, ServletException {
+        final Exception exception = new ActionMethodException(1985, "my message");
+        ActionMethodResponse actionMethodResponse = new ActionMethodResponse();
+        actionMethodResponse.setReturnValue(exception);
+        final StubServletOutputStream out = new StubServletOutputStream();
+
+        HttpServletRequest request = context.mock(HttpServletRequest.class);
+
+        final HttpServletResponse response = context.mock(HttpServletResponse.class);
+        context.checking(new Expectations() {{
+            one (response).isCommitted();
+            will(returnValue(false));
+            one(response).setStatus(1985);
+            one(response).getOutputStream();
+            will(returnValue(out));
+            one(response).flushBuffer();
+        }});
+
+        ViewDispatcher viewDispatcher = context.mock(ViewDispatcher.class);
+        final ActionMonitor actionMonitor = context.mock(ActionMonitor.class);
+        context.checking(new Expectations() {{
+            one (actionMonitor).actionMethodExecutionFailed(exception);
+        }});
+
+        // must fire the exception to the monitor
+        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
+        handler.handle(request, response, actionMethodResponse);
+
+        Assert.assertEquals("my message", out.buffer.toString());
+    }
+
+    private class StubServletOutputStream extends ServletOutputStream {
+        public StringBuffer buffer = new StringBuffer();
+
+        public void print(String string) throws IOException {
+            buffer.append(string);
+        }
+
+        public void write(int b) throws IOException {
+            // do nothing
+        }
+    }
+}

Deleted: trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java (320 => 321)

--- trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java	2007-10-09 17:42:22 UTC (rev 320)
+++ trunk/core/src/test/java/org/codehaus/waffle/action/DefaultActionResponseHandlerTest.java	2007-10-10 12:36:24 UTC (rev 321)
@@ -1,202 +0,0 @@
-package org.codehaus.waffle.action;
-
-import org.codehaus.waffle.monitor.ActionMonitor;
-import org.codehaus.waffle.testmodel.StubMonitor;
-import org.codehaus.waffle.testmodel.StubViewDispatcher;
-import org.codehaus.waffle.view.View;
-import org.codehaus.waffle.view.ViewDispatcher;
-import org.jmock.Mock;
-import org.jmock.MockObjectTestCase;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-public class DefaultActionResponseHandlerTest extends MockObjectTestCase {
-
-    public void testConstructorDoesNotAcceptNull() {
-        try {
-            new DefaultActionMethodResponseHandler(null, null);
-            fail("IllegalArgumentException expected, null is not a valid argument");
-        } catch (IllegalArgumentException expected) {
-            // expected
-        }
-        try {
-            new DefaultActionMethodResponseHandler(null, new StubMonitor());
-            fail("IllegalArgumentException expected, null is not a valid argument");
-        } catch (IllegalArgumentException expected) {
-            // expected
-        }
-        try {
-            new DefaultActionMethodResponseHandler(new StubViewDispatcher(), null);
-            fail("IllegalArgumentException expected, null is not a valid argument");
-        } catch (IllegalArgumentException expected) {
-            // expected
-        }
-    }
-
-    public void testHandleWhenResponseIsCommitted() throws Exception {
-        // Mock HttpServletResponse
-        Mock mockHttpServletResponse = mock(HttpServletResponse.class);
-        mockHttpServletResponse.expects(once())
-                .method("isCommitted")
-                .will(returnValue(true));
-        HttpServletResponse response = (HttpServletResponse) mockHttpServletResponse.proxy();
-
-        // Mock ViewDispatcher
-        Mock mockViewResolver = mock(ViewDispatcher.class);
-        ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy();
-
-        // Mock ActionMonitor
-        Mock mockActionMonitor = mock(ActionMonitor.class);
-        ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy();
-
-        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
-        handler.handle(null, response, null);
-    }
-
-    public void testMethodResponseWrapsView() throws IOException, ServletException {
-        View view = new View("foobar", null);
-        ActionMethodResponse actionMethodResponse = new ActionMethodResponse();
-        actionMethodResponse.setReturnValue(view);
-
-        // Mock HttpServletResponse
-        Mock mockResponse = mock(HttpServletResponse.class);
-        mockResponse.expects(once())
-                .method("isCommitted")
-                .will(returnValue(false));
-        HttpServletResponse response = (HttpServletResponse) mockResponse.proxy();
-
-        // Mock HttpServletRequest
-        Mock mockRequest = mock(HttpServletRequest.class);
-        HttpServletRequest request = (HttpServletRequest) mockRequest.proxy();
-
-        // Mock ViewDispatcher
-        Mock mockViewResolver = mock(ViewDispatcher.class);
-        mockViewResolver.expects(once()).method("dispatch");
-        ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy();
-
-        // Mock ActionMonitor
-        Mock mockActionMonitor = mock(ActionMonitor.class);
-        ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy();
-
-        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
-        handler.handle(request, response, actionMethodResponse);
-    }
-
-    public void testDirectResponseActionMethod() throws Exception {
-        ActionMethodResponse actionMethodResponse = new ActionMethodResponse();
-        actionMethodResponse.setReturnValue("Mmmmm Waffles!");
-
-        // Mock HttpServletRequest
-        Mock mockRequest = mock(HttpServletRequest.class);
-        HttpServletRequest request = (HttpServletRequest) mockRequest.proxy();
-
-        // Mock HttpServletResponse
-        Mock mockResponse = mock(HttpServletResponse.class);
-        mockResponse.expects(once())
-                .method("isCommitted")
-                .will(returnValue(false));
-        StubServletOutputStream out = new StubServletOutputStream();
-        mockResponse.expects(once()).method("getOutputStream")
-                .will(returnValue(out));
-        mockResponse.expects(once()).method("flushBuffer");
-        HttpServletResponse response = (HttpServletResponse) mockResponse.proxy();
-
-        // Mock ViewDispatcher
-        Mock mockViewResolver = mock(ViewDispatcher.class);
-        ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy();
-
-        // Mock ActionMonitor
-        Mock mockActionMonitor = mock(ActionMonitor.class);
-        ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy();
-
-        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
-        handler.handle(request, response, actionMethodResponse);
-
-        assertEquals("Mmmmm Waffles!", out.buffer.toString());
-    }
-
-    public void testResponseIsAnException() throws IOException, ServletException {
-        Exception exception = new Exception("error for testing");
-        ActionMethodResponse actionMethodResponse = new ActionMethodResponse();
-        actionMethodResponse.setReturnValue(exception);
-
-        // Mock HttpServletRequest
-        Mock mockRequest = mock(HttpServletRequest.class);
-        HttpServletRequest request = (HttpServletRequest) mockRequest.proxy();
-
-        // Mock HttpServletResponse
-        Mock mockResponse = mock(HttpServletResponse.class);
-        mockResponse.expects(once())
-                .method("isCommitted")
-                .will(returnValue(false));
-        StubServletOutputStream out = new StubServletOutputStream();
-        mockResponse.expects(once()).method("setStatus")
-                .with(eq(HttpServletResponse.SC_BAD_REQUEST));
-        mockResponse.expects(once()).method("getOutputStream")
-                .will(returnValue(out));
-        mockResponse.expects(once()).method("flushBuffer");
-        HttpServletResponse response = (HttpServletResponse) mockResponse.proxy();
-
-        // Mock ViewDispatcher
-        Mock mockViewResolver = mock(ViewDispatcher.class);
-        ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy();
-
-        // Mock ActionMonitor
-        Mock mockActionMonitor = mock(ActionMonitor.class);
-        // must fire the exception to the monitor
-        mockActionMonitor.expects(once()).method("actionMethodExecutionFailed").with(same(exception));
-        ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy();
-
-        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
-        handler.handle(request, response, actionMethodResponse);
-
-        assertEquals("error for testing", out.buffer.toString());
-    }
-
-    public void handleNullMethodResponse() throws IOException, ServletException {
-        // Mock HttpServletRequest
-        Mock mockRequest = mock(HttpServletRequest.class);
-        mockRequest.expects(once())
-                .method("getHeader")
-                .with(eq("referer"))
-                .will(returnValue("foobar"));
-        HttpServletRequest request = (HttpServletRequest) mockRequest.proxy();
-
-        // Mock HttpServletResponse
-        Mock mockResponse = mock(HttpServletResponse.class);
-        mockResponse.expects(once())
-                .method("isCommitted")
-                .will(returnValue(false));
-        mockResponse.expects(once())
-                .method("sendRedirect")
-                .with(eq("foobar"));
-        HttpServletResponse response = (HttpServletResponse) mockResponse.proxy();
-
-        // Mock ViewDispatcher
-        Mock mockViewResolver = mock(ViewDispatcher.class);
-        ViewDispatcher viewDispatcher = (ViewDispatcher) mockViewResolver.proxy();
-
-        // Mock ActionMonitor
-        Mock mockActionMonitor = mock(ActionMonitor.class);
-        ActionMonitor actionMonitor = (ActionMonitor) mockActionMonitor.proxy();
-
-        ActionMethodResponseHandler handler = new DefaultActionMethodResponseHandler(viewDispatcher, actionMonitor);
-        handler.handle(request, response, null);
-    }
-
-    private class StubServletOutputStream extends ServletOutputStream {
-        public StringBuffer buffer = new StringBuffer();
-
-        public void print(String string) throws IOException {
-            buffer.append(string);
-        }
-
-        public void write(int b) throws IOException {
-
-        }
-    }
-}

Modified: trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java (320 => 321)

--- trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java	2007-10-09 17:42:22 UTC (rev 320)
+++ trunk/core/src/test/java/org/codehaus/waffle/testmodel/FakeController.java	2007-10-10 12:36:24 UTC (rev 321)
@@ -64,7 +64,7 @@
     }
 
     public void actionThrowsActionMethodException() throws ActionMethodException {
-        throw new ActionMethodException();
+        throw new ActionMethodException(0, "blah blah");
     }
 
     public void sayHello() {


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to