1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.myfaces.context.servlet; 20 21 import org.apache.myfaces.test.base.junit4.AbstractJsfTestCase; 22 import org.junit.After; 23 import org.junit.Assert; 24 import org.junit.Before; 25 import org.junit.Test; 26 import org.junit.runner.RunWith; 27 import org.junit.runners.JUnit4; 28 29 import java.util.Arrays; 30 import java.util.HashMap; 31 import java.util.List; 32 import java.util.Map; 33 34 /** 35 * Test cases for ServletExternalContextImpl. 36 * 37 * @author Jakob Korherr (latest modification by $Author$) 38 * @version $Revision$ $Date$ 39 */ 40 @RunWith(JUnit4.class) 41 public class ServletExternalContextImplTest extends AbstractJsfTestCase 42 { 43 44 private ServletExternalContextImpl _testExternalContext; 45 46 @Before 47 @Override 48 public void setUp() throws Exception 49 { 50 super.setUp(); 51 52 _testExternalContext = new ServletExternalContextImpl(servletContext, request, response); 53 } 54 55 @After 56 @Override 57 public void tearDown() throws Exception 58 { 59 _testExternalContext = null; 60 61 super.tearDown(); 62 } 63 64 /** 65 * Tests if encodeRedirectURL() and encodeBookmarkableURL() correctly 66 * evaluate ValueExpressions as parameters values. 67 */ 68 /* TODO: Invalid test, because EL evaluation should be done before call these methods. 69 @Test 70 @SuppressWarnings("unchecked") 71 public void testEncodeURLHandlesValueExpressionParameters() 72 { 73 // put EL values in the application map 74 Map<String, Object> applicationMap = externalContext.getApplicationMap(); 75 applicationMap.put("el1", "myvalue1"); 76 applicationMap.put("el2", "myvalue2"); 77 78 // create parameters Map 79 // note that Arrays.asList() return an UnmodifiableList and thus we 80 // indirectly also check for modification here. 81 Map<String, List<String>> parameters = new HashMap<String, List<String>>(); 82 parameters.put("param1", Arrays.asList("literalvalue", "#{el1}")); 83 parameters.put("param2", Arrays.asList("#{el2}")); 84 85 // encode the URL with parameters 86 final String redirectUrl = _testExternalContext.encodeRedirectURL("someUrl.jsf", parameters); 87 final String bookmarkableUrl = _testExternalContext.encodeBookmarkableURL("someUrl.jsf", parameters); 88 89 // asserts for redirectUrl 90 Assert.assertTrue(redirectUrl.contains("param1=literalvalue")); 91 Assert.assertTrue(redirectUrl.contains("param1=myvalue1")); 92 Assert.assertTrue(redirectUrl.contains("param2=myvalue2")); 93 94 // asserts for bookmarkableUrl 95 Assert.assertTrue(bookmarkableUrl.contains("param1=literalvalue")); 96 Assert.assertTrue(bookmarkableUrl.contains("param1=myvalue1")); 97 Assert.assertTrue(bookmarkableUrl.contains("param2=myvalue2")); 98 }*/ 99 100 @Test 101 public void testEncodeRedirectUrlWithEmptyParamInBaseUrl() 102 { 103 // query parameter p1 has an empty value 104 String baseUrl = "/test?p1=&p2=test"; 105 106 // encode that URL without adding further parameters 107 final String redirectUrl = _testExternalContext.encodeRedirectURL(baseUrl, null); 108 109 // the URL should not change 110 Assert.assertTrue(redirectUrl.contains("p1=")); 111 Assert.assertTrue(redirectUrl.contains("p2=test")); 112 113 } 114 115 @Test 116 public void testEncodedSpaceInExistingQueryParameter() 117 { 118 // the base URL with an existing encoded query parameter 119 String baseUrl = "/test?p1=a+b"; 120 121 // encode that URL without adding further parameters 122 final String redirectUrl = _testExternalContext.encodeRedirectURL(baseUrl, null); 123 124 // the URL should not change 125 Assert.assertEquals(baseUrl, redirectUrl); 126 127 } 128 129 @Test 130 public void testEncodedAmpersandInExistingQueryParameter() 131 { 132 // the base URL with an existing encoded query parameter 133 String baseUrl = "/test?p1=a%26b"; 134 135 // encode that URL without adding further parameters 136 final String redirectUrl = _testExternalContext.encodeRedirectURL(baseUrl, null); 137 138 // the URL should not change 139 Assert.assertEquals(baseUrl, redirectUrl); 140 141 } 142 143 @Test 144 public void testSameParameterNames() 145 { 146 String baseUrl = "/test?par=test1&par=test2"; 147 148 // encode that URL without adding further parameters 149 final String redirectUrl = _testExternalContext.encodeRedirectURL(baseUrl, null); 150 151 // the URL should not change 152 Assert.assertTrue(redirectUrl.contains("par=test1")); 153 Assert.assertTrue(redirectUrl.contains("par=test2")); 154 155 } 156 }