1 package org.seasar.cubby.action; 2 3 import java.lang.reflect.Method; 4 5 import javax.servlet.RequestDispatcher; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletRequestWrapper; 8 9 import org.seasar.cubby.controller.ActionContext; 10 import org.seasar.cubby.controller.ActionDef; 11 import org.seasar.extension.unit.S2TestCase; 12 import org.seasar.framework.container.ComponentDef; 13 import org.seasar.framework.mock.servlet.MockHttpServletRequest; 14 import org.seasar.framework.mock.servlet.MockHttpServletResponse; 15 import org.seasar.framework.mock.servlet.MockServletContext; 16 17 public class ForwardTest extends S2TestCase { 18 19 public ActionContext context; 20 21 @Override 22 protected void setUp() throws Exception { 23 include(this.getClass().getName().replaceAll("\\.", "/") + ".dicon"); 24 } 25 26 public void testBasicSequence() throws Exception { 27 MockServletContext servletContext = this.getServletContext(); 28 servletContext.setServletContextName("/cubby"); 29 MockHttpServletRequest request = this.getRequest(); 30 MockHttpServletResponse response = this.getResponse(); 31 ComponentDef componentDef = this.getComponentDef(MockAction.class); 32 context.initialize(new MockActionDef(componentDef)); 33 MockAction action = (MockAction) context.getAction(); 34 35 Forward forward = new Forward("path.jsp"); 36 forward.prerender(context); 37 assertTrue(action.isPrerendered()); 38 forward.execute(context, new RequestDispatcherAssertionWrapper(request, 39 new Asserter() { 40 public void assertDispatchPath(String path) { 41 assertEquals("/mock/path.jsp", path); 42 } 43 }), response); 44 assertTrue(action.isPostrendered()); 45 } 46 47 public void testRelativePath() throws Exception { 48 MockServletContext servletContext = this.getServletContext(); 49 servletContext.setServletContextName("/cubby"); 50 MockHttpServletRequest request = this.getRequest(); 51 MockHttpServletResponse response = this.getResponse(); 52 ComponentDef componentDef = this.getComponentDef(MockAction.class); 53 context.initialize(new MockActionDef(componentDef)); 54 55 Forward forward = new Forward("page.jsp"); 56 forward.execute(context, new RequestDispatcherAssertionWrapper(request, 57 new Asserter() { 58 public void assertDispatchPath(String path) { 59 assertEquals("/mock/page.jsp", path); 60 } 61 }), response); 62 } 63 64 public void testAbsolutePath() throws Exception { 65 MockServletContext servletContext = this.getServletContext(); 66 servletContext.setServletContextName("/cubby"); 67 MockHttpServletRequest request = this.getRequest(); 68 MockHttpServletResponse response = this.getResponse(); 69 ComponentDef componentDef = this.getComponentDef(MockAction.class); 70 context.initialize(new MockActionDef(componentDef)); 71 72 Forward forward = new Forward("/absolute/path.jsp"); 73 forward.execute(context, new RequestDispatcherAssertionWrapper(request, 74 new Asserter() { 75 public void assertDispatchPath(String path) { 76 assertEquals("/absolute/path.jsp", path); 77 } 78 }), response); 79 } 80 81 interface Asserter { 82 void assertDispatchPath(String path); 83 } 84 85 class RequestDispatcherAssertionWrapper extends HttpServletRequestWrapper { 86 87 private Asserter asserter; 88 89 public RequestDispatcherAssertionWrapper(HttpServletRequest request, 90 Asserter asserter) { 91 super(request); 92 this.asserter = asserter; 93 } 94 95 @Override 96 public RequestDispatcher getRequestDispatcher(String path) { 97 asserter.assertDispatchPath(path); 98 return super.getRequestDispatcher(path); 99 } 100 101 } 102 103 class MockActionDef implements ActionDef { 104 105 private ComponentDef componentDef; 106 107 public MockActionDef(ComponentDef componentDef) { 108 this.componentDef = componentDef; 109 } 110 111 public ComponentDef getComponentDef() { 112 return componentDef; 113 } 114 115 public Method getMethod() { 116 return null; 117 } 118 119 } 120 121 public static class MockAction extends Action { 122 123 private boolean prerendered = false; 124 125 private boolean postrendered = false; 126 127 @Override 128 public void prerender() { 129 super.prerender(); 130 prerendered = true; 131 } 132 133 @Override 134 public void postrender() { 135 super.postrender(); 136 postrendered = true; 137 } 138 139 public boolean isPrerendered() { 140 return prerendered; 141 } 142 143 public boolean isPostrendered() { 144 return postrendered; 145 } 146 147 } 148 149 }