1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.cubby.action;
17  
18  import java.lang.reflect.Method;
19  
20  import javax.servlet.RequestDispatcher;
21  import javax.servlet.http.HttpServletRequest;
22  import javax.servlet.http.HttpServletRequestWrapper;
23  
24  import org.seasar.cubby.controller.ActionContext;
25  import org.seasar.cubby.controller.ActionDef;
26  import org.seasar.extension.unit.S2TestCase;
27  import org.seasar.framework.container.ComponentDef;
28  import org.seasar.framework.mock.servlet.MockHttpServletRequest;
29  import org.seasar.framework.mock.servlet.MockHttpServletResponse;
30  import org.seasar.framework.mock.servlet.MockServletContext;
31  import org.seasar.framework.util.ClassUtil;
32  
33  public class ForwardTest extends S2TestCase {
34  
35  	public ActionContext context;
36  
37  	@Override
38  	protected void setUp() throws Exception {
39  		include(this.getClass().getName().replaceAll("\\.", "/") + ".dicon");
40  	}
41  
42  	public void testBasicSequence() throws Exception {
43  		MockServletContext servletContext = this.getServletContext();
44  		servletContext.setServletContextName("/cubby");
45  		MockHttpServletRequest request = this.getRequest();
46  		MockHttpServletResponse response = this.getResponse();
47  		ComponentDef componentDef = this.getComponentDef(MockAction.class);
48  		context.initialize(new MockActionDef(componentDef));
49  		MockAction action = (MockAction) context.getAction();
50  
51  		Forward forward = new Forward("path.jsp");
52  		forward.prerender(context);
53  		assertTrue(action.isPrerendered());
54  		forward.execute(context, new RequestDispatcherAssertionWrapper(request,
55  				new Asserter() {
56  					public void assertDispatchPath(String path) {
57  						assertEquals("/mock/path.jsp", path);
58  					}
59  				}), response);
60  		assertTrue(action.isPostrendered());
61  	}
62  
63  	public void testRelativePath() throws Exception {
64  		MockServletContext servletContext = this.getServletContext();
65  		servletContext.setServletContextName("/cubby");
66  		MockHttpServletRequest request = this.getRequest();
67  		MockHttpServletResponse response = this.getResponse();
68  		ComponentDef componentDef = this.getComponentDef(MockAction.class);
69  		context.initialize(new MockActionDef(componentDef));
70  
71  		Forward forward = new Forward("page.jsp");
72  		forward.execute(context, new RequestDispatcherAssertionWrapper(request,
73  				new Asserter() {
74  					public void assertDispatchPath(String path) {
75  						assertEquals("/mock/page.jsp", path);
76  					}
77  				}), response);
78  	}
79  
80  	public void testAbsolutePath() throws Exception {
81  		MockServletContext servletContext = this.getServletContext();
82  		servletContext.setServletContextName("/cubby");
83  		MockHttpServletRequest request = this.getRequest();
84  		MockHttpServletResponse response = this.getResponse();
85  		ComponentDef componentDef = this.getComponentDef(MockAction.class);
86  		context.initialize(new MockActionDef(componentDef));
87  
88  		Forward forward = new Forward("/absolute/path.jsp");
89  		forward.execute(context, new RequestDispatcherAssertionWrapper(request,
90  				new Asserter() {
91  					public void assertDispatchPath(String path) {
92  						assertEquals("/absolute/path.jsp", path);
93  					}
94  				}), response);
95  	}
96  	
97  	public void testGetPath() throws Exception {
98  		Forward forward = new Forward("/absolute/path.jsp");
99  		assertEquals("/absolute/path.jsp", forward.getPath());
100 	}
101 
102 	interface Asserter {
103 		void assertDispatchPath(String path);
104 	}
105 
106 	class RequestDispatcherAssertionWrapper extends HttpServletRequestWrapper {
107 
108 		private Asserter asserter;
109 
110 		public RequestDispatcherAssertionWrapper(HttpServletRequest request,
111 				Asserter asserter) {
112 			super(request);
113 			this.asserter = asserter;
114 		}
115 
116 		@Override
117 		public RequestDispatcher getRequestDispatcher(String path) {
118 			asserter.assertDispatchPath(path);
119 			return super.getRequestDispatcher(path);
120 		}
121 
122 	}
123 
124 	class MockActionDef implements ActionDef {
125 
126 		private ComponentDef componentDef;
127 
128 		public MockActionDef(ComponentDef componentDef) {
129 			this.componentDef = componentDef;
130 		}
131 
132 		public ComponentDef getComponentDef() {
133 			return componentDef;
134 		}
135 
136 		public Method getMethod() {
137 			Class<?> clazz = componentDef.getComponentClass();
138 			Method method = ClassUtil.getMethod(clazz, "dummy", null);
139 			return method;
140 		}
141 
142 	}
143 
144 	public static class MockAction extends Action {
145 
146 		private boolean prerendered = false;
147 
148 		private boolean postrendered = false;
149 
150 		@Override
151 		public void prerender() {
152 			super.prerender();
153 			prerendered = true;
154 		}
155 
156 		@Override
157 		public void postrender() {
158 			super.postrender();
159 			postrendered = true;
160 		}
161 
162 		public boolean isPrerendered() {
163 			return prerendered;
164 		}
165 
166 		public boolean isPostrendered() {
167 			return postrendered;
168 		}
169 
170 		public ActionResult dummy() {
171 			return null;
172 		}
173 	}
174 
175 }