1 package org.seasar.cubby.action; 2 3 import java.io.IOException; 4 import java.lang.reflect.Method; 5 6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.http.HttpServletResponseWrapper; 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 RedirectTest 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 Redirect redirect = new Redirect("path.jsp"); 36 redirect.prerender(context); 37 assertFalse(action.isPrerendered()); 38 redirect.execute(context, request, 39 new RequestDispatcherAssertionWrapper(response, new Asserter() { 40 public void assertDispatchPath(String path) { 41 assertEquals("/cubby/mock/path.jsp", path); 42 } 43 })); 44 assertFalse(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 Redirect redirect = new Redirect("page.jsp"); 56 redirect.execute(context, request, 57 new RequestDispatcherAssertionWrapper(response, new Asserter() { 58 public void assertDispatchPath(String path) { 59 assertEquals("/cubby/mock/page.jsp", path); 60 } 61 })); 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 Redirect redirect = new Redirect("/absolute/path.jsp"); 73 redirect.execute(context, request, new RequestDispatcherAssertionWrapper( 74 response, new Asserter() { 75 public void assertDispatchPath(String path) { 76 assertEquals("/cubby/absolute/path.jsp", path); 77 } 78 })); 79 } 80 81 public void testRootContextPath() throws Exception { 82 MockServletContext servletContext = this.getServletContext(); 83 servletContext.setServletContextName("/"); 84 MockHttpServletRequest request = this.getRequest(); 85 MockHttpServletResponse response = this.getResponse(); 86 ComponentDef componentDef = this.getComponentDef(MockAction.class); 87 context.initialize(new MockActionDef(componentDef)); 88 89 Redirect redirect = new Redirect("path.jsp"); 90 redirect.execute(context, request, new RequestDispatcherAssertionWrapper( 91 response, new Asserter() { 92 public void assertDispatchPath(String path) { 93 assertEquals("/mock/path.jsp", path); 94 } 95 })); 96 } 97 98 interface Asserter { 99 void assertDispatchPath(String path); 100 } 101 102 class RequestDispatcherAssertionWrapper extends HttpServletResponseWrapper { 103 104 private Asserter asserter; 105 106 public RequestDispatcherAssertionWrapper(HttpServletResponse response, 107 Asserter asserter) { 108 super(response); 109 this.asserter = asserter; 110 } 111 112 @Override 113 public void sendRedirect(String location) throws IOException { 114 asserter.assertDispatchPath(location); 115 super.sendRedirect(location); 116 } 117 118 } 119 120 class MockActionDef implements ActionDef { 121 122 private ComponentDef componentDef; 123 124 public MockActionDef(ComponentDef componentDef) { 125 this.componentDef = componentDef; 126 } 127 128 public ComponentDef getComponentDef() { 129 return componentDef; 130 } 131 132 public Method getMethod() { 133 return null; 134 } 135 136 } 137 138 public static class MockAction extends Action { 139 140 private boolean prerendered = false; 141 142 private boolean postrendered = false; 143 144 @Override 145 public void prerender() { 146 super.prerender(); 147 prerendered = true; 148 } 149 150 @Override 151 public void postrender() { 152 super.postrender(); 153 postrendered = true; 154 } 155 156 public boolean isPrerendered() { 157 return prerendered; 158 } 159 160 public boolean isPostrendered() { 161 return postrendered; 162 } 163 164 } 165 166 }