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 }