View Javadoc

1   /*
2    * $Id: DefaultActionMapperTest.java 541982 2007-05-27 13:04:02Z 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.dispatcher.mapper;
22  
23  import java.util.HashMap;
24  import java.util.Map;
25  
26  import org.apache.struts2.StrutsConstants;
27  import org.apache.struts2.StrutsTestCase;
28  import org.apache.struts2.ServletActionContext;
29  import org.apache.struts2.dispatcher.ServletRedirectResult;
30  import org.apache.struts2.views.jsp.StrutsMockHttpServletRequest;
31  import org.apache.struts2.views.jsp.StrutsMockHttpServletResponse;
32  
33  import com.mockobjects.servlet.MockHttpServletRequest;
34  import com.mockobjects.dynamic.Mock;
35  import com.opensymphony.xwork2.Result;
36  import com.opensymphony.xwork2.DefaultActionInvocation;
37  import com.opensymphony.xwork2.ActionInvocation;
38  import com.opensymphony.xwork2.ActionContext;
39  import com.opensymphony.xwork2.config.Configuration;
40  import com.opensymphony.xwork2.config.ConfigurationManager;
41  import com.opensymphony.xwork2.config.entities.PackageConfig;
42  import com.opensymphony.xwork2.config.impl.DefaultConfiguration;
43  
44  import javax.servlet.http.HttpServletResponse;
45  
46  /***
47   * DefaultActionMapper test case.
48   *
49   */
50  public class DefaultActionMapperTest extends StrutsTestCase {
51  
52      private MockHttpServletRequest req;
53      private ConfigurationManager configManager;
54      private Configuration config;
55  
56      protected void setUp() throws Exception {
57          super.setUp();
58          req = new MockHttpServletRequest();
59          req.setupGetParameterMap(new HashMap());
60          req.setupGetContextPath("/my/namespace");
61  
62          config = new DefaultConfiguration();
63          PackageConfig pkg = new PackageConfig("myns", "/my/namespace", false, null);
64          PackageConfig pkg2 = new PackageConfig("my", "/my", false, null);
65          config.addPackageConfig("mvns", pkg);
66          config.addPackageConfig("my", pkg2);
67          configManager = new ConfigurationManager() {
68              public Configuration getConfiguration() {
69                  return config;
70              }
71          };
72      }
73  
74      public void testGetMapping() throws Exception {
75          setUp();
76          req.setupGetRequestURI("/my/namespace/actionName.action");
77          req.setupGetServletPath("/my/namespace/actionName.action");
78          req.setupGetAttribute(null);
79          req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
80  
81          DefaultActionMapper mapper = new DefaultActionMapper();
82          ActionMapping mapping = mapper.getMapping(req, configManager);
83  
84          assertEquals("/my/namespace", mapping.getNamespace());
85          assertEquals("actionName", mapping.getName());
86          assertNull(mapping.getMethod());
87      }
88  
89      public void testGetMappingWithMethod() throws Exception {
90          req.setupGetParameterMap(new HashMap());
91          req.setupGetRequestURI("/my/namespace/actionName!add.action");
92          req.setupGetServletPath("/my/namespace/actionName!add.action");
93          req.setupGetAttribute(null);
94          req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
95  
96          DefaultActionMapper mapper = new DefaultActionMapper();
97          ActionMapping mapping = mapper.getMapping(req, configManager);
98  
99          assertEquals("/my/namespace", mapping.getNamespace());
100         assertEquals("actionName", mapping.getName());
101         assertEquals("add", mapping.getMethod());
102     }
103 
104     public void testGetMappingWithSlashedName() throws Exception {
105 
106         req.setupGetRequestURI("/my/foo/actionName.action");
107         req.setupGetServletPath("/my/foo/actionName.action");
108         req.setupGetAttribute(null);
109         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
110 
111         DefaultActionMapper mapper = new DefaultActionMapper();
112         mapper.setSlashesInActionNames("true");
113         ActionMapping mapping = mapper.getMapping(req, configManager);
114 
115         assertEquals("/my", mapping.getNamespace());
116         assertEquals("foo/actionName", mapping.getName());
117         assertNull(mapping.getMethod());      
118     }
119     
120     public void testGetMappingWithNamespaceSlash() throws Exception {
121 
122         req.setupGetRequestURI("/my.hh/abc.action");
123         req.setupGetServletPath("/my.hh/abc.action");
124         req.setupGetAttribute(null);
125         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
126 
127         DefaultActionMapper mapper = new DefaultActionMapper();
128         ActionMapping mapping = mapper.getMapping(req, configManager);
129 
130         assertEquals("", mapping.getNamespace());
131         assertEquals("abc", mapping.getName());
132         
133         req.setupGetAttribute(null);
134         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
135         mapper = new DefaultActionMapper();
136         mapper.setSlashesInActionNames("true");
137         mapping = mapper.getMapping(req, configManager);
138 
139         assertEquals("", mapping.getNamespace());
140         assertEquals("my.hh/abc", mapping.getName());
141     }
142 
143     public void testGetMappingWithUnknownNamespace() throws Exception {
144         setUp();
145         req.setupGetRequestURI("/bo/foo/actionName.action");
146         req.setupGetServletPath("/bo/foo/actionName.action");
147         req.setupGetAttribute(null);
148         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
149 
150         DefaultActionMapper mapper = new DefaultActionMapper();
151         ActionMapping mapping = mapper.getMapping(req, configManager);
152 
153         assertEquals("", mapping.getNamespace());
154         assertEquals("actionName", mapping.getName());
155         assertNull(mapping.getMethod());
156     }
157     
158     public void testGetMappingWithUnknownNamespaceButFullNamespaceSelect() throws Exception {
159         setUp();
160         req.setupGetRequestURI("/bo/foo/actionName.action");
161         req.setupGetServletPath("/bo/foo/actionName.action");
162         req.setupGetAttribute(null);
163         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
164 
165         DefaultActionMapper mapper = new DefaultActionMapper();
166         mapper.setAlwaysSelectFullNamespace("true");
167         ActionMapping mapping = mapper.getMapping(req, configManager);
168 
169         assertEquals("/bo/foo", mapping.getNamespace());
170         assertEquals("actionName", mapping.getName());
171         assertNull(mapping.getMethod());
172     }
173 
174     public void testGetUri() throws Exception {
175         req.setupGetParameterMap(new HashMap());
176         req.setupGetRequestURI("/my/namespace/actionName.action");
177         req.setupGetServletPath("/my/namespace/actionName.action");
178         req.setupGetAttribute(null);
179         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
180 
181         DefaultActionMapper mapper = new DefaultActionMapper();
182         ActionMapping mapping = mapper.getMapping(req, configManager);
183         assertEquals("/my/namespace/actionName.action", mapper.getUriFromActionMapping(mapping));
184     }
185 
186     public void testGetUriWithMethod() throws Exception {
187         req.setupGetParameterMap(new HashMap());
188         req.setupGetRequestURI("/my/namespace/actionName!add.action");
189         req.setupGetServletPath("/my/namespace/actionName!add.action");
190         req.setupGetAttribute(null);
191         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
192 
193         DefaultActionMapper mapper = new DefaultActionMapper();
194         ActionMapping mapping = mapper.getMapping(req, configManager);
195 
196         assertEquals("/my/namespace/actionName!add.action", mapper.getUriFromActionMapping(mapping));
197     }
198 
199     public void testGetMappingWithNoExtension() throws Exception {
200         req.setupGetParameterMap(new HashMap());
201         req.setupGetRequestURI("/my/namespace/actionName");
202         req.setupGetServletPath("/my/namespace/actionName");
203         req.setupGetAttribute(null);
204         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
205 
206         DefaultActionMapper mapper = new DefaultActionMapper();
207         mapper.setExtensions("");
208         ActionMapping mapping = mapper.getMapping(req, configManager);
209 
210         assertEquals("/my/namespace", mapping.getNamespace());
211         assertEquals("actionName", mapping.getName());
212         assertNull(mapping.getMethod());
213     }
214     
215     public void testGetMappingWithNoExtensionButUriHasExtension() throws Exception {
216         req.setupGetParameterMap(new HashMap());
217         req.setupGetRequestURI("/my/namespace/actionName.html");
218         req.setupGetServletPath("/my/namespace/actionName.html");
219         req.setupGetAttribute(null);
220         req.addExpectedGetAttributeName("javax.servlet.include.servlet_path");
221 
222         DefaultActionMapper mapper = new DefaultActionMapper();
223         mapper.setExtensions("");
224         ActionMapping mapping = mapper.getMapping(req, configManager);
225 
226         assertEquals("/my/namespace", mapping.getNamespace());
227         assertEquals("actionName.html", mapping.getName());
228         assertNull(mapping.getMethod());
229     }
230 
231     // =============================
232     // === test name & namespace ===
233     // =============================
234 
235     public void testParseNameAndNamespace1() throws Exception {
236         ActionMapping actionMapping = new ActionMapping();
237 
238         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
239         defaultActionMapper.parseNameAndNamespace("someAction", actionMapping, configManager);
240 
241         assertEquals(actionMapping.getName(), "someAction");
242         assertEquals(actionMapping.getNamespace(), "");
243     }
244 
245     public void testParseNameAndNamespace2() throws Exception {
246         ActionMapping actionMapping = new ActionMapping();
247 
248         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
249         defaultActionMapper.parseNameAndNamespace("/someAction", actionMapping, configManager);
250 
251         assertEquals(actionMapping.getName(), "someAction");
252         assertEquals(actionMapping.getNamespace(), "/");
253     }
254 
255     public void testParseNameAndNamespace3() throws Exception {
256         ActionMapping actionMapping = new ActionMapping();
257 
258         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
259         defaultActionMapper.parseNameAndNamespace("/my/someAction", actionMapping, configManager);
260 
261         assertEquals(actionMapping.getName(), "someAction");
262         assertEquals(actionMapping.getNamespace(), "/my");
263     }
264 
265     public void testParseNameAndNamespace_NoSlashes() throws Exception {
266         ActionMapping actionMapping = new ActionMapping();
267 
268         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
269         defaultActionMapper.setSlashesInActionNames("false");
270         defaultActionMapper.parseNameAndNamespace("/foo/someAction", actionMapping, configManager);
271 
272         assertEquals(actionMapping.getName(), "someAction");
273         assertEquals(actionMapping.getNamespace(), "");
274     }
275 
276     public void testParseNameAndNamespace_AllowSlashes() throws Exception {
277         ActionMapping actionMapping = new ActionMapping();
278 
279         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
280         defaultActionMapper.setSlashesInActionNames("true");
281         defaultActionMapper.parseNameAndNamespace("/foo/someAction", actionMapping, configManager);
282 
283         assertEquals(actionMapping.getName(), "foo/someAction");
284         assertEquals(actionMapping.getNamespace(), "");
285     }
286 
287 
288     // ===========================
289     // === test special prefix ===
290     // ===========================
291 
292     public void testActionPrefix() throws Exception {
293         Map parameterMap = new HashMap();
294         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", "");
295 
296         StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
297         request.setParameterMap(parameterMap);
298         request.setupGetServletPath("/someServletPath.action");
299 
300         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
301         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
302 
303         assertEquals(actionMapping.getName(), "myAction");
304     }
305     
306     public void testActionPrefix_fromImageButton() throws Exception {
307         Map parameterMap = new HashMap();
308         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", "");
309         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.x", "");
310         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.y", "");
311 
312         StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
313         request.setParameterMap(parameterMap);
314         request.setupGetServletPath("/someServletPath.action");
315 
316         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
317         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
318 
319         assertEquals(actionMapping.getName(), "myAction");
320     }
321     
322     public void testActionPrefix_fromIEImageButton() throws Exception {
323         Map parameterMap = new HashMap();
324         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.x", "");
325         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.y", "");
326 
327         StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
328         request.setParameterMap(parameterMap);
329         request.setupGetServletPath("/someServletPath.action");
330 
331         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
332         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
333 
334         assertEquals(actionMapping.getName(), "myAction");
335     }
336 
337     public void testRedirectPrefix() throws Exception {
338         Map parameterMap = new HashMap();
339         parameterMap.put(DefaultActionMapper.REDIRECT_PREFIX + "http://www.google.com", "");
340 
341         StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
342         request.setupGetServletPath("/someServletPath.action");
343         request.setParameterMap(parameterMap);
344 
345         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
346         defaultActionMapper.setContainer(container);
347         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
348 
349         Result result = actionMapping.getResult();
350         assertNotNull(result);
351         assertTrue(result instanceof ServletRedirectResult);
352 
353         Mock invMock = new Mock(ActionInvocation.class);
354         ActionInvocation inv = (ActionInvocation) invMock.proxy();
355         ActionContext ctx = ActionContext.getContext();
356         ctx.put(ServletActionContext.HTTP_REQUEST, request);
357         StrutsMockHttpServletResponse response = new StrutsMockHttpServletResponse();
358         ctx.put(ServletActionContext.HTTP_RESPONSE, response);
359         invMock.expectAndReturn("getInvocationContext", ctx);
360         invMock.expectAndReturn("getStack", ctx.getValueStack());
361         result.execute(inv);
362         assertEquals("http://www.google.com", response.getRedirectURL());
363         //TODO: need to test location but there's noaccess to the property/method, unless we use reflection
364     }
365 
366     public void testRedirectActionPrefix() throws Exception {
367         Map parameterMap = new HashMap();
368         parameterMap.put(DefaultActionMapper.REDIRECT_ACTION_PREFIX + "myAction", "");
369 
370         StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
371         request.setupGetServletPath("/someServletPath.action");
372         request.setParameterMap(parameterMap);
373 
374         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
375         defaultActionMapper.setContainer(container);
376         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
377         
378 
379         Result result = actionMapping.getResult();
380         assertNotNull(result);
381         assertTrue(result instanceof ServletRedirectResult);
382 
383         // TODO: need to test location but there's noaccess to the property/method, unless we use reflection
384     }
385 
386     public void testDropExtension() throws Exception {
387         DefaultActionMapper mapper = new DefaultActionMapper();
388         String name = mapper.dropExtension("foo.action");
389         assertTrue("Name not right: "+name, "foo".equals(name));
390 
391         name = mapper.dropExtension("foo.action.action");
392         assertTrue("Name not right: "+name, "foo.action".equals(name));
393 
394     }
395 
396     public void testGetUriFromActionMapper1() throws Exception {
397         DefaultActionMapper mapper = new DefaultActionMapper();
398         ActionMapping actionMapping = new ActionMapping();
399         actionMapping.setMethod("myMethod");
400         actionMapping.setName("myActionName");
401         actionMapping.setNamespace("/myNamespace");
402         String uri = mapper.getUriFromActionMapping(actionMapping);
403 
404         assertEquals("/myNamespace/myActionName!myMethod.action", uri);
405     }
406 
407     public void testGetUriFromActionMapper2() throws Exception {
408         DefaultActionMapper mapper = new DefaultActionMapper();
409         ActionMapping actionMapping = new ActionMapping();
410         actionMapping.setMethod("myMethod");
411         actionMapping.setName("myActionName");
412         actionMapping.setNamespace("/");
413         String uri = mapper.getUriFromActionMapping(actionMapping);
414 
415         assertEquals("/myActionName!myMethod.action", uri);
416     }
417 
418     public void testGetUriFromActionMapper3() throws Exception {
419         DefaultActionMapper mapper = new DefaultActionMapper();
420         ActionMapping actionMapping = new ActionMapping();
421         actionMapping.setMethod("myMethod");
422         actionMapping.setName("myActionName");
423         actionMapping.setNamespace("");
424         String uri = mapper.getUriFromActionMapping(actionMapping);
425 
426         assertEquals("/myActionName!myMethod.action", uri);
427     }
428 
429 
430     public void testGetUriFromActionMapper4() throws Exception {
431         DefaultActionMapper mapper = new DefaultActionMapper();
432         ActionMapping actionMapping = new ActionMapping();
433         actionMapping.setName("myActionName");
434         actionMapping.setNamespace("");
435         String uri = mapper.getUriFromActionMapping(actionMapping);
436 
437         assertEquals("/myActionName.action", uri);
438     }
439 
440     public void testGetUriFromActionMapper5() throws Exception {
441         DefaultActionMapper mapper = new DefaultActionMapper();
442         ActionMapping actionMapping = new ActionMapping();
443         actionMapping.setName("myActionName");
444         actionMapping.setNamespace("/");
445         String uri = mapper.getUriFromActionMapping(actionMapping);
446 
447         assertEquals("/myActionName.action", uri);
448     }
449 
450     //
451     public void testGetUriFromActionMapper6() throws Exception {
452         DefaultActionMapper mapper = new DefaultActionMapper();
453         ActionMapping actionMapping = new ActionMapping();
454         actionMapping.setMethod("myMethod");
455         actionMapping.setName("myActionName?test=bla");
456         actionMapping.setNamespace("/myNamespace");
457         String uri = mapper.getUriFromActionMapping(actionMapping);
458 
459         assertEquals("/myNamespace/myActionName!myMethod.action?test=bla", uri);
460     }
461 
462     public void testGetUriFromActionMapper7() throws Exception {
463         DefaultActionMapper mapper = new DefaultActionMapper();
464         ActionMapping actionMapping = new ActionMapping();
465         actionMapping.setMethod("myMethod");
466         actionMapping.setName("myActionName?test=bla");
467         actionMapping.setNamespace("/");
468         String uri = mapper.getUriFromActionMapping(actionMapping);
469 
470         assertEquals("/myActionName!myMethod.action?test=bla", uri);
471     }
472 
473     public void testGetUriFromActionMapper8() throws Exception {
474         DefaultActionMapper mapper = new DefaultActionMapper();
475         ActionMapping actionMapping = new ActionMapping();
476         actionMapping.setMethod("myMethod");
477         actionMapping.setName("myActionName?test=bla");
478         actionMapping.setNamespace("");
479         String uri = mapper.getUriFromActionMapping(actionMapping);
480 
481         assertEquals("/myActionName!myMethod.action?test=bla", uri);
482     }
483 
484 
485     public void testGetUriFromActionMapper9() throws Exception {
486         DefaultActionMapper mapper = new DefaultActionMapper();
487         ActionMapping actionMapping = new ActionMapping();
488         actionMapping.setName("myActionName?test=bla");
489         actionMapping.setNamespace("");
490         String uri = mapper.getUriFromActionMapping(actionMapping);
491 
492         assertEquals("/myActionName.action?test=bla", uri);
493     }
494 
495     public void testGetUriFromActionMapper10() throws Exception {
496         DefaultActionMapper mapper = new DefaultActionMapper();
497         ActionMapping actionMapping = new ActionMapping();
498         actionMapping.setName("myActionName?test=bla");
499         actionMapping.setNamespace("/");
500         String uri = mapper.getUriFromActionMapping(actionMapping);
501 
502         assertEquals("/myActionName.action?test=bla", uri);
503     }
504 
505     public void testGetUriFromActionMapper11() throws Exception {
506         DefaultActionMapper mapper = new DefaultActionMapper();
507         ActionMapping actionMapping = new ActionMapping();
508         actionMapping.setName("myActionName.action");
509         actionMapping.setNamespace("/");
510         String uri = mapper.getUriFromActionMapping(actionMapping);
511 
512         assertEquals("/myActionName.action", uri);
513     }
514 
515     public void testGetUriFromActionMapper12() throws Exception {
516         DefaultActionMapper mapper = new DefaultActionMapper();
517         ActionMapping actionMapping = new ActionMapping();
518         actionMapping.setName("myActionName.action");
519         actionMapping.setNamespace("/");
520         String uri = mapper.getUriFromActionMapping(actionMapping);
521 
522         assertEquals("/myActionName.action", uri);
523     }
524 
525 }