/* * Copyright 2010 Lincoln Baxter, III * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ocpsoft.pretty.faces.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.faces.component.UIParameter; import org.junit.BeforeClass; import org.junit.Test; import com.ocpsoft.pretty.PrettyException; import com.ocpsoft.pretty.faces.component.Link; import com.ocpsoft.pretty.faces.config.mapping.QueryParameter; import com.ocpsoft.pretty.faces.config.mapping.UrlAction; import com.ocpsoft.pretty.faces.config.mapping.UrlMapping; /** * @author lb3 */ public class PrettyURLBuilderTest { static Link link = new Link(); static UrlMapping mapping = new UrlMapping(); static UIParameter param1 = new UIParameter(); static UIParameter param2 = new UIParameter(); static UIParameter param3 = new UIParameter(); static UIParameter param4 = new UIParameter(); static UIParameter param5 = new UIParameter(); static String expectedPath = ""; static List<Object> values = new ArrayList<Object>(); static Object[] valuesArray; @BeforeClass public static void setUpBeforeClass() throws Exception { mapping.addAction(new UrlAction("#{bean.action}")); mapping.setId("testMapping"); mapping.setPattern("/test/#{bean.param1}/mapping/#{bean.param2}"); mapping.addQueryParam(new QueryParameter("key1", "#{bean.qp1}")); mapping.addQueryParam(new QueryParameter("key2", "#{bean.qp2}")); param1.setName("key1"); param1.setValue("qp1"); link.getChildren().add(param1); param2.setValue("up1"); link.getChildren().add(param2); values.add(param2.getValue()); param3.setName("key2"); param3.setValue("qp2"); link.getChildren().add(param3); param4.setValue("up2"); link.getChildren().add(param4); values.add(param4.getValue()); valuesArray = values.toArray(); param5.setName("double"); param5.setValue(new Object[] { "12", "34" }); link.getChildren().add(param5); expectedPath = "/test/" + param2.getValue() + "/mapping/" + param4.getValue(); link.getAttributes().put("mappingId", mapping.getId()); } private final PrettyURLBuilder builder = new PrettyURLBuilder(); @Test public void testExtractParameters() { List<UIParameter> parameters = builder.extractParameters(link); assertEquals(5, parameters.size()); assertTrue(parameters.contains(param1)); assertTrue(parameters.contains(param2)); assertTrue(parameters.contains(param3)); assertTrue(parameters.contains(param4)); assertTrue(parameters.contains(param5)); } @Test public void testBuildMappedUrlPrettyUrlMappingListOfUIParameter() { List<UIParameter> parameters = builder.extractParameters(link); String mappedUrl = builder.build(mapping, false, parameters); assertTrue(mappedUrl.startsWith(expectedPath)); assertTrue(mappedUrl.contains(param1.getName() + "=" + param1.getValue())); assertTrue(mappedUrl.contains(param3.getName() + "=" + param3.getValue())); } @Test public void testBuildMappedUrlPrettyUrlMappingListOfUIParameterContainsArrayQueryParam() { List<UIParameter> parameters = builder.extractParameters(link); String mappedUrl = builder.build(mapping, false, parameters); assertTrue(mappedUrl.startsWith(expectedPath)); assertTrue(mappedUrl.contains(param5.getName() + "=" + ((Object[]) param5.getValue())[0])); assertTrue(mappedUrl.contains(param5.getName() + "=" + ((Object[]) param5.getValue())[1])); } @Test public void testBuildMappedUrlPrettyUrlMappingSingleParameterContainingList() { List<UIParameter> parameters = new ArrayList<UIParameter>(); UIParameter param = new UIParameter(); param.setValue(values); parameters.add(param); String mappedUrl = builder.build(mapping, false, parameters); assertTrue(mappedUrl.startsWith(expectedPath)); } @Test public void testBuildMappedUrlPrettyUrlMappingSingleParameterContainingArray() { List<UIParameter> parameters = new ArrayList<UIParameter>(); UIParameter param = new UIParameter(); param.setValue(valuesArray); parameters.add(param); String mappedUrl = builder.build(mapping, false, parameters); assertTrue(mappedUrl.startsWith(expectedPath)); } @Test(expected = PrettyException.class) public void testBuildMappedUrlPrettyUrlMappingSingleNamedParameterDefaultsToNonListBuild() { List<UIParameter> parameters = new ArrayList<UIParameter>(); UIParameter param = new UIParameter(); param.setValue(values); param.setName("something"); parameters.add(param); builder.build(mapping, false, parameters); } @Test public void testBuildUrlWithUnicodeCharacters() { List<UIParameter> params = Arrays.asList( createUIParameter(null, "\u20ac"), // Euro sign createUIParameter(null, "\u0142"), // L with stroke createUIParameter("key1", "\u00a3"), // pound sign createUIParameter("key2", "\u0644") // Lamedh ); // encoded String encodedUrl = builder.build(mapping, true, params); assertTrue(encodedUrl.startsWith("/test/%E2%82%AC/mapping/%C5%82?")); assertTrue(encodedUrl.contains("key1=%C2%A3")); assertTrue(encodedUrl.contains("key2=%D9%84")); // unicode String unicodeUrl = builder.build(mapping, false, params); assertTrue(unicodeUrl.startsWith("/test/\u20ac/mapping/\u0142?")); assertTrue(unicodeUrl.contains("key1=%C2%A3")); assertTrue(unicodeUrl.contains("key2=%D9%84")); // unicode String oldUrl = builder.build(mapping, false, params); assertTrue(oldUrl.startsWith("/test/\u20ac/mapping/\u0142?")); assertTrue(oldUrl.contains("key1=%C2%A3")); assertTrue(oldUrl.contains("key2=%D9%84")); } private final static UIParameter createUIParameter(String name, Object value) { UIParameter p = new UIParameter(); p.setName(name); p.setValue(value); return p; } }