1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts2.views.util;
22
23 import java.util.HashMap;
24 import java.util.LinkedHashMap;
25 import java.util.Map;
26 import java.util.TreeMap;
27
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.apache.struts2.StrutsConstants;
32 import org.apache.struts2.StrutsTestCase;
33
34 import com.mockobjects.dynamic.Mock;
35
36
37 /***
38 * Test case for UrlHelper.
39 *
40 */
41 public class UrlHelperTest extends StrutsTestCase {
42
43
44
45 public void testForceAddSchemeHostAndPort() throws Exception {
46 String expectedUrl = "http://localhost/contextPath/path1/path2/myAction.action";
47
48 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
49 mockHttpServletRequest.expectAndReturn("getScheme", "http");
50 mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
51 mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
52
53 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
54 mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
55
56 String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, true);
57 assertEquals(expectedUrl, result);
58 mockHttpServletRequest.verify();
59 }
60
61 public void testDoNotForceAddSchemeHostAndPort() throws Exception {
62 String expectedUrl = "/contextPath/path1/path2/myAction.action";
63
64 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
65 mockHttpServletRequest.expectAndReturn("getScheme", "http");
66 mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
67 mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
68
69 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
70 mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
71
72 String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, false);
73
74 assertEquals(expectedUrl, result);
75 }
76
77
78 public void testBuildParametersStringWithUrlHavingSomeExistingParameters() throws Exception {
79 String expectedUrl = "http://localhost:8080/myContext/myPage.jsp?initParam=initValue&param1=value1&param2=value2";
80
81 Map parameters = new LinkedHashMap();
82 parameters.put("param1", "value1");
83 parameters.put("param2", "value2");
84
85 StringBuffer url = new StringBuffer("http://localhost:8080/myContext/myPage.jsp?initParam=initValue");
86
87 UrlHelper.buildParametersString(parameters, url);
88
89 assertEquals(
90 expectedUrl, url.toString());
91 }
92
93
94
95 public void testBuildWithRootContext() {
96 String expectedUrl = "/MyAction.action";
97
98 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
99 mockHttpServletRequest.expectAndReturn("getContextPath", "/");
100 mockHttpServletRequest.expectAndReturn("getScheme", "http");
101
102 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
103 mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
104
105 String actualUrl = UrlHelper.buildUrl(expectedUrl, (HttpServletRequest) mockHttpServletRequest.proxy(),
106 (HttpServletResponse) mockHttpServletResponse.proxy(), new HashMap());
107 assertEquals(expectedUrl, actualUrl);
108 }
109
110 /***
111 * just one &, not &
112 */
113 public void testBuildUrlCorrectlyAddsAmp() {
114 String expectedString = "my.actionName?foo=bar&hello=world";
115 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
116 mockHttpServletRequest.expectAndReturn("getScheme", "http");
117 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
118 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
119
120 String actionName = "my.actionName";
121 TreeMap params = new TreeMap();
122 params.put("hello", "world");
123 params.put("foo", "bar");
124
125 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
126 assertEquals(expectedString, urlString);
127 }
128
129 public void testBuildUrlWithStringArray() {
130 String expectedString = "my.actionName?foo=bar&hello=earth&hello=mars";
131 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
132 mockHttpServletRequest.expectAndReturn("getScheme", "http");
133 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
134 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
135
136 String actionName = "my.actionName";
137 TreeMap params = new TreeMap();
138 params.put("hello", new String[]{"earth", "mars"});
139 params.put("foo", "bar");
140
141 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
142 assertEquals(expectedString, urlString);
143 }
144
145 /***
146 * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
147 * current request is "http" and the port for the "https" scheme is 443.
148 */
149 public void testSwitchToHttpsScheme() {
150 String expectedString = "https://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
151
152 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
153 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
154 mockHttpServletRequest.expectAndReturn("getScheme", "http");
155 mockHttpServletRequest.expectAndReturn("getServerPort", 80);
156 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
157
158 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
159 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
160
161 String actionName = "/MyAction.action";
162 TreeMap params = new TreeMap();
163 params.put("hello", new String[]{"earth", "mars"});
164 params.put("foo", "bar");
165
166 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
167 assertEquals(expectedString, urlString);
168 }
169
170 /***
171 * The UrlHelper should build a URL that starts with "http" followed by the server name when the scheme of the
172 * current request is "https" and the port for the "http" scheme is 80.
173 */
174 public void testSwitchToHttpScheme() {
175 String expectedString = "http://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
176
177 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
178 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
179 mockHttpServletRequest.expectAndReturn("getScheme", "https");
180 mockHttpServletRequest.expectAndReturn("getServerPort", 443);
181 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
182
183 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
184 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
185
186 String actionName = "/MyAction.action";
187 TreeMap params = new TreeMap();
188 params.put("hello", new String[]{"earth", "mars"});
189 params.put("foo", "bar");
190
191 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
192 assertEquals(expectedString, urlString);
193 }
194
195 /***
196 * This test is similar to {@link #testSwitchToHttpsScheme()} with the HTTP port equal to 7001 and the HTTPS port
197 * equal to 7002.
198 */
199 public void testSwitchToHttpsNonDefaultPort() {
200
201 String expectedString = "https://www.mydomain.com:7002/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
202
203 UrlHelper.setHttpPort("7001");
204 UrlHelper.setHttpsPort("7002");
205
206 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
207 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
208 mockHttpServletRequest.expectAndReturn("getScheme", "http");
209 mockHttpServletRequest.expectAndReturn("getServerPort", 7001);
210 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
211
212 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
213 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
214
215 String actionName = "/MyAction.action";
216 TreeMap params = new TreeMap();
217 params.put("hello", new String[]{"earth", "mars"});
218 params.put("foo", "bar");
219
220 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
221 assertEquals(expectedString, urlString);
222 }
223
224 /***
225 * This test is similar to {@link #testSwitchToHttpScheme()} with the HTTP port equal to 7001 and the HTTPS port
226 * equal to port 7002.
227 */
228 public void testSwitchToHttpNonDefaultPort() {
229
230 String expectedString = "http://www.mydomain.com:7001/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
231
232 UrlHelper.setHttpPort("7001");
233 UrlHelper.setHttpsPort("7002");
234
235 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
236 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
237 mockHttpServletRequest.expectAndReturn("getScheme", "https");
238 mockHttpServletRequest.expectAndReturn("getServerPort", 7002);
239 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
240
241 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
242 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
243
244 String actionName = "/MyAction.action";
245 TreeMap params = new TreeMap();
246 params.put("hello", new String[]{"earth", "mars"});
247 params.put("foo", "bar");
248
249 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
250 assertEquals(expectedString, urlString);
251 }
252
253 /***
254 * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
255 * current request is "http" and the port for the "https" scheme is 443. When the request has been forwarded
256 * in a Servlet 2.4 container, the UrlHelper should use the javax.servlet.forward.request_uri request attribute
257 * instead of a call to HttpServletRequest#getRequestURI().
258 */
259 public void testForwardedRequest() {
260 String expectedString = "https://www.example.com/mywebapp/product/widget/promo.html";
261
262 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
263 mockHttpServletRequest.expectAndReturn("getServerName", "www.example.com");
264 mockHttpServletRequest.expectAndReturn("getScheme", "http");
265 mockHttpServletRequest.expectAndReturn("getServerPort", 80);
266 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
267 mockHttpServletRequest.expectAndReturn("getAttribute", "javax.servlet.forward.request_uri", "/mywebapp/product/widget/");
268 mockHttpServletRequest.expectAndReturn("getRequestURI", "/mywebapp/");
269
270 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
271 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
272
273 String actionName = "promo.html";
274 Map params = new TreeMap();
275
276 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
277 assertEquals(expectedString, urlString);
278 }
279
280
281 public void testParseQuery() throws Exception {
282 Map result = UrlHelper.parseQueryString("aaa=aaaval&bbb=bbbval&ccc=");
283
284 assertEquals(result.get("aaa"), "aaaval");
285 assertEquals(result.get("bbb"), "bbbval");
286 assertEquals(result.get("ccc"), "");
287 }
288
289 public void testParseEmptyQuery() throws Exception {
290 Map result = UrlHelper.parseQueryString("");
291
292 assertNotNull(result);
293 assertEquals(result.size(), 0);
294 }
295
296 public void testParseNullQuery() throws Exception {
297 Map result = UrlHelper.parseQueryString(null);
298
299 assertNotNull(result);
300 assertEquals(result.size(), 0);
301 }
302
303
304 public void testTranslateAndEncode() throws Exception {
305 UrlHelper.setCustomEncoding("UTF-8");
306 String result = UrlHelper.translateAndEncode("\u65b0\u805e");
307 String expectedResult = "%E6%96%B0%E8%81%9E";
308
309 assertEquals(result, expectedResult);
310 }
311
312 public void testTranslateAndDecode() throws Exception {
313 UrlHelper.setCustomEncoding("UTF-8");
314 String result = UrlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
315 String expectedResult = "\u65b0\u805e";
316
317 assertEquals(result, expectedResult);
318 }
319 }