/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.sling.resourceresolver.impl.params; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.Map; import org.apache.sling.resourceresolver.impl.params.PathParser; import org.junit.Test; public class PathParserTest { private PathParser parser = new PathParser(); @Test public void nullParsesToNull() { parser.parse(null); assertNull(parser.getPath()); assertTrue(parser.getParameters().isEmpty()); } @Test public void emptyParsesToEmpty() { parser.parse(""); assertEquals("", parser.getPath()); assertTrue(parser.getParameters().isEmpty()); } @Test public void noParametersReturnEmptyMap() { parser.parse("/path/with/no/parameters"); assertEquals("/path/with/no/parameters", parser.getPath()); assertTrue(parser.getParameters().isEmpty()); } @Test public void parameterCanBeAddedAfterResource() { parser.parse("/content/test;key1=xyz"); assertEquals("/content/test", parser.getPath()); assertEquals(map("key1", "xyz"), parser.getParameters()); parser.parse("/content/test;key1=xyz.html"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", "xyz"), parser.getParameters()); } @Test public void parameterCanBeEscaped() { parser.parse("/content/test;key1='xyz'"); assertEquals("/content/test", parser.getPath()); assertEquals(map("key1", "xyz"), parser.getParameters()); parser.parse("/content/test;key1='xyz'.html"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", "xyz"), parser.getParameters()); } @Test public void multipleParametersAreAllowed() { parser.parse("/content/test;key1=xyz;key2=abc"); assertEquals("/content/test", parser.getPath()); assertEquals(map("key1", "xyz", "key2", "abc"), parser.getParameters()); parser.parse("/content/test;key1=xyz;key2=abc.html"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", "xyz", "key2", "abc"), parser.getParameters()); } @Test public void multipleParametersCanBeEscaped() { parser.parse("/content/test;key1='a.b';key2='c.d'"); assertEquals("/content/test", parser.getPath()); assertEquals(map("key1", "a.b", "key2", "c.d"), parser.getParameters()); parser.parse("/content/test;key1='a.b';key2='c.d'.html"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", "a.b", "key2", "c.d"), parser.getParameters()); } @Test public void parameterCanBeAddedAfterExtension() { parser.parse("/content/test.html;key1=xyz"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", "xyz"), parser.getParameters()); parser.parse("/content/test.html;key1=xyz/suffix"); assertEquals("/content/test.html/suffix", parser.getPath()); assertEquals(map("key1", "xyz"), parser.getParameters()); } @Test public void dotDoesntHaveToBeEscapedAfterExtension() { parser.parse("/content/test.html;v=1.0"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("v", "1.0"), parser.getParameters()); parser.parse("/content/test.html;v=1.0/suffix"); assertEquals("/content/test.html/suffix", parser.getPath()); assertEquals(map("v", "1.0"), parser.getParameters()); } @Test public void slashHaveToBeEscapedAfterExtension() { parser.parse("/content/test.html;v='1/0'"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("v", "1/0"), parser.getParameters()); parser.parse("/content/test.html;v='1/0'/suffix"); assertEquals("/content/test.html/suffix", parser.getPath()); assertEquals(map("v", "1/0"), parser.getParameters()); } @Test public void quoteHasToBeClosed() { testInvalidParams("/content/test;key1='a.b;key2=cde.html/asd"); } @Test public void emptyValueIsAllowed() { parser.parse("/content/test;key1=''.html"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", ""), parser.getParameters()); parser.parse("/content/test;key1=.html"); assertEquals("/content/test.html", parser.getPath()); assertEquals(map("key1", ""), parser.getParameters()); } @Test public void parametersWithoutEqualsSignAreInvalid() { testInvalidParams("/content/test;key1.html"); } @Test public void parametersInTheMiddleOfThePathAreInvalid() { testInvalidParams("/content;key=value/test.html"); } @Test public void parametersInTheSuffixAreInvalid() { testInvalidParams("/content/test.html/suffix;key=value"); } private static Map<String, String> map(String... values) { Map<String, String> m = new HashMap<String, String>(); for (int i = 0; i < values.length; i += 2) { m.put(values[i], values[i + 1]); } return m; } private void testInvalidParams(String path) { parser.parse(path); assertEquals(path, parser.getPath()); assertEquals(map(), parser.getParameters()); } }