/*
* 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.url;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import com.ocpsoft.pretty.PrettyException;
import com.ocpsoft.pretty.faces.config.mapping.PathParameter;
/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class URLPatternParserTest
{
@Test
public void testSimplestMatch() throws Exception
{
URLPatternParser parser = new URLPatternParser("/");
assertTrue(parser.matches(new URL("/")));
List<PathParameter> parameters = parser.parse(new URL("/"));
assertEquals(0, parameters.size());
}
@Test
public void testGetNamedParameterList()
{
URLPatternParser namedParamParser = new URLPatternParser("/foo/#{named}/");
List<PathParameter> params = namedParamParser.parse(new URL("/foo/love/"));
assertEquals(1, params.size());
PathParameter p = params.get(0);
assertEquals(0, p.getPosition());
assertEquals("love", p.getValue());
assertEquals("named", p.getName());
assertEquals("#{named}", p.getExpression().getELExpression());
}
@Test
public void testGetInjectedParameterList()
{
URLPatternParser namedParamParser = new URLPatternParser("/foo/#{:injected}/");
List<PathParameter> params = namedParamParser.parse(new URL("/foo/love/"));
assertEquals(1, params.size());
PathParameter p = params.get(0);
assertEquals(0, p.getPosition());
assertEquals("love", p.getValue());
assertEquals("#{injected}", p.getExpression().getELExpression());
}
@Test
public void testGetNamedValuedParameterList()
{
URLPatternParser namedValuedParamParser = new URLPatternParser("/foo/#{named:bean.value}/");
List<PathParameter> params = namedValuedParamParser.parse(new URL("/foo/love/"));
assertEquals(1, params.size());
PathParameter p = params.get(0);
assertEquals(0, p.getPosition());
assertEquals("love", p.getValue());
assertEquals("named", p.getName());
assertEquals("#{bean.value}", p.getExpression().getELExpression());
}
@Test
public void testMatches()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
assertTrue(parser.matches(new URL("/project/starfish1/starfish2/story1")));
assertFalse(parser.matches(new URL("project/starfish1/starfish2/story1")));
assertFalse(parser.matches(new URL("/project/starfish1/starfish2/story1/")));
assertFalse(parser.matches(new URL("project/starfish1/starfish2/story1/test")));
assertFalse(parser.matches(new URL("project/starfish2/story1")));
assertFalse(parser.matches(new URL("project/starfish1/starfish2")));
assertFalse(parser.matches(new URL("project/starfish1/starfish2/")));
}
@Test
public void testMatchesPrefixedSegmentExpressionInjected()
{
URLPatternParser parser = new URLPatternParser("/project/#{paramsBean.project}/story-#{paramsBean.story}/");
assertTrue(parser.matches(new URL("/project/starfish/story-1/")));
assertFalse(parser.matches(new URL("/project/starfish/story-1/-")));
assertFalse(parser.matches(new URL("/project/starfish/story-/")));
assertFalse(parser.matches(new URL("project/starfish/story-23/")));
}
@Test
public void testMatchesPrefixedSegmentExpressionNamed()
{
URLPatternParser parser = new URLPatternParser("/project/#{paramsBean.project}/story-#{story}/");
assertTrue(parser.matches(new URL("/project/starfish/story-1/")));
}
@Test
public void testMatchesMultipleExpressionNamedSegment()
{
URLPatternParser parser = new URLPatternParser("/project/#{paramsBean.project}/story-#{story}-#{comment}");
assertTrue(parser.matches(new URL("/project/starfish/story-1-23")));
assertFalse(parser.matches(new URL("/project/starfish/story-1-23/")));
}
@Test
public void testMatchesPrefixedSegmentExpressionNamedInjected()
{
URLPatternParser parser = new URLPatternParser("/project/#{paramsBean.project}/story-#{story:paramsBean.story}/");
assertTrue(parser.matches(new URL("/project/starfish/story-1/")));
}
@Test
public void testGetMappedParameters()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
List<PathParameter> params = parser.parse(new URL("/project/starfish1/sprint1/story1"));
assertEquals(3, params.size());
assertEquals("starfish1", params.get(0).getValue());
assertEquals("sprint1", params.get(1).getValue());
assertEquals("story1", params.get(2).getValue());
}
@Test
public void testGetMappedParametersDuplicatesAreRepresented()
{
URLPatternParser duplicateParamsParser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.project}/#{paramsBean.story}");
List<PathParameter> params = duplicateParamsParser.parse(new URL("/project/starfish1/sprint1/story1"));
assertEquals(3, params.size());
assertEquals("starfish1", params.get(0).getValue());
assertEquals("sprint1", params.get(1).getValue());
assertEquals("story1", params.get(2).getValue());
}
@Test
public void testGetMappedParameterList()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
List<PathParameter> params = parser.parse(new URL("/project/starfish1/sprint1/story1"));
assertEquals(3, params.size());
PathParameter p = params.get(0);
assertEquals(0, p.getPosition());
assertEquals("starfish1", p.getValue());
assertEquals("#{paramsBean.project}", p.getExpression().getELExpression());
PathParameter p1 = params.get(1);
assertEquals(1, p1.getPosition());
assertEquals("sprint1", p1.getValue());
assertEquals("#{paramsBean.iteration}", p1.getExpression().getELExpression());
PathParameter p2 = params.get(2);
assertEquals(2, p2.getPosition());
assertEquals("story1", p2.getValue());
assertEquals("#{paramsBean.story}", p2.getExpression().getELExpression());
}
@Test
public void testGetMappedUrl()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
String mappedUrl = parser.getMappedURL("p1", 22, 55).toURL();
assertEquals("/project/p1/22/55", mappedUrl);
}
@Test
public void testGetParameterCount()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
assertEquals(3, parser.getParameterCount());
}
@Test
public void testGetMappedUrlWithList()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
List<Object> params = new ArrayList<Object>();
params.add("p1");
params.add(22);
params.add(55);
String mappedUrl = parser.getMappedURL(params).toURL();
assertEquals("/project/p1/22/55", mappedUrl);
params.remove(2);
try
{
mappedUrl = parser.getMappedURL(params, 55).toURL();
assertEquals("/project/p1/22/55", mappedUrl);
assertTrue("Parameter count is wrong.", false);
}
catch (PrettyException pe)
{
assertTrue(true);
}
assertNotSame("/project/p1/22/55", parser.getMappedURL(params, 22, 55).toURL());
}
@Test
public void testGetMappedUrlWithArray()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
Object[] params = new Object[3];
params[0] = "p1";
params[1] = 22;
params[2] = 55;
String mappedUrl = parser.getMappedURL(params).toURL();
assertEquals("/project/p1/22/55", mappedUrl);
params[2] = null;
params[1] = null;
try
{
mappedUrl = parser.getMappedURL(params, 55).toURL();
assertEquals("/project/p1/22/55", mappedUrl);
assertTrue("An exception should have been thrown by now", false);
}
catch (PrettyException pe)
{
assertTrue(true);
}
assertNotSame("/project/p1/22/55", parser.getMappedURL(params, 22, 55).toURL());
}
@Test
public void testGetMappedUrlWithMap()
{
URLPatternParser parser = new URLPatternParser(
"/project/#{paramsBean.project}/#{paramsBean.iteration}/#{paramsBean.story}");
Map<String, String> params = new HashMap<String, String>();
params.put("1", "p1");
params.put("2", "22");
params.put("3", "55");
try
{
String mappedUrl = parser.getMappedURL(params).toURL();
assertEquals("An exception should have been thrown: Map parameters are not supported at this time.", mappedUrl);
}
catch (PrettyException pe)
{
assertTrue(true);
}
assertNotSame("/project/p1/22/55", parser.getMappedURL(params, 22, 55).toURL());
}
@Test
public void testGetMappedUrlWithListWithoutParams()
{
URLPatternParser noParamsParser = new URLPatternParser("/no/param");
List<?> params = new ArrayList<Object>();
String mappedUrl = noParamsParser.getMappedURL(params).toURL();
assertEquals("Empty list failed", "/no/param", mappedUrl);
}
@Test
public void testGetMappedUrlNullListWithoutParams()
{
URLPatternParser noParamsParser = new URLPatternParser("/no/param");
List<?> params = null;
String mappedUrl = noParamsParser.getMappedURL(params).toURL();
assertEquals("Null param failed", "/no/param", mappedUrl);
}
@Test
public void testGetMappedUrlWithRegexes()
{
URLPatternParser regexParser = new URLPatternParser("/(foo|bar|baz|cat|dog).jsf");
List<PathParameter> params = regexParser.parse(new URL("/foo.jsf"));
Assert.assertTrue(params.isEmpty());
}
@Test
public void testBackslashHandling()
{
// simple path parameter
URLPatternParser regexParser = new URLPatternParser("/#{string}/");
// parse an URL containing a \ character
List<PathParameter> params = regexParser.parse(new URL("/\\/"));
assertEquals(1, params.size());
assertEquals("\\", params.get(0).getValue());
// generate URL
URL url = regexParser.getMappedURL(new Object[] { "\\" });
assertEquals("/\\/", url.toURL());
}
}