View Javadoc

1   /*
2    * $Id: UrlHelperTest.java 474191 2006-11-13 08:30:40Z mrdon $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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 }