/*
* 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.wicket.request.mapper.parameter;
import org.apache.wicket.request.Url;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests for {@link UrlPathPageParametersEncoder}
*/
public class UrlPathPageParametersEncoderTest extends Assert
{
/**
* Encode named parameters in the segments (so they look like indexed parameters)
*/
@Test
public void encodeNamedParameters()
{
PageParameters params = new PageParameters();
params.add("name1", "value1", INamedParameters.Type.MANUAL);
params.add("name2", "value2", INamedParameters.Type.MANUAL);
UrlPathPageParametersEncoder encoder = new UrlPathPageParametersEncoder();
Url url = encoder.encodePageParameters(params);
assertEquals("name1/value1/name2/value2", url.toString());
}
/**
* Encode named parameters in the segments (so they look like indexed parameters) and the name
* and/or value have non-ASCII characters
*/
@Test
public void encodeNamedParametersWithSpecialChars()
{
// the non-ASCII characters are randomly chosen
PageParameters params = new PageParameters();
params.add("name1", "valueএ", INamedParameters.Type.MANUAL);
params.add("nameㄘ", "value2", INamedParameters.Type.MANUAL);
UrlPathPageParametersEncoder encoder = new UrlPathPageParametersEncoder();
Url url = encoder.encodePageParameters(params);
assertEquals("name1/value%E0%A6%8F/name%E3%84%98/value2", url.toString());
}
/**
* This encoder doesn't support indexed parameters
*/
@Test(expected = IllegalArgumentException.class)
public void encodeIndexedParameters()
{
PageParameters params = new PageParameters();
params.set(0, "value1");
params.set(1, "value2");
UrlPathPageParametersEncoder encoder = new UrlPathPageParametersEncoder();
encoder.encodePageParameters(params);
}
/**
* Decode properly encoded parameters
*/
@Test
public void decodeUrl()
{
Url url = Url.parse("name1/value1/name2/value2");
UrlPathPageParametersEncoder decoder = new UrlPathPageParametersEncoder();
PageParameters parameters = decoder.decodePageParameters(url);
assertEquals(2, parameters.getAllNamed().size());
assertEquals("value1", parameters.get("name1").toString());
assertEquals("value2", parameters.get("name2").toString());
}
/**
* Decode encoded parameters with trailing slash. The parameter with the empty name should be
* ignored
*/
@Test
public void decodeUrlWithTrailingSlash()
{
Url url = Url.parse("name1/value1/name2/value2/");
UrlPathPageParametersEncoder decoder = new UrlPathPageParametersEncoder();
PageParameters parameters = decoder.decodePageParameters(url);
assertEquals(2, parameters.getAllNamed().size());
assertEquals("value1", parameters.get("name1").toString());
assertEquals("value2", parameters.get("name2").toString());
}
/**
* Decode encoded parameters with trailing slash. The parameter with the empty value should be
* ignored
*/
@Test
public void decodeUrlWithTrailingSlashAfterName()
{
Url url = Url.parse("name1/value1/name2/value2/name3");
UrlPathPageParametersEncoder decoder = new UrlPathPageParametersEncoder();
PageParameters parameters = decoder.decodePageParameters(url);
assertEquals(2, parameters.getAllNamed().size());
assertEquals("value1", parameters.get("name1").toString());
assertEquals("value2", parameters.get("name2").toString());
}
/**
* Decode encoded parameters with a leading slash. The empty name segment should be ignored.
*/
@Test
public void decodeUrlWithLeadingSlash()
{
Url url = Url.parse("/name1/value1/name2/value2");
UrlPathPageParametersEncoder decoder = new UrlPathPageParametersEncoder();
PageParameters parameters = decoder.decodePageParameters(url);
assertEquals(2, parameters.getAllNamed().size());
assertEquals("value1", parameters.get("name1").toString());
assertEquals("value2", parameters.get("name2").toString());
}
/**
* Decode encoded parameters with a slashes in the middle. The empty name segments should be
* ignored.
*/
@Test
public void decodeUrlWithSlashesInTheMiddle()
{
Url url = Url.parse("name1/value1////name2/value2");
UrlPathPageParametersEncoder decoder = new UrlPathPageParametersEncoder();
PageParameters parameters = decoder.decodePageParameters(url);
assertEquals(2, parameters.getAllNamed().size());
assertEquals("value1", parameters.get("name1").toString());
assertEquals("value2", parameters.get("name2").toString());
}
/**
* Decode encoded parameters with a slashes in the middle. The empty name segments should be
* ignored.
*/
@Test
public void decodeUrlWithSlashesInTheMiddleAndEmptyValue()
{
Url url = Url.parse("name1/value1////name2//");
UrlPathPageParametersEncoder decoder = new UrlPathPageParametersEncoder();
PageParameters parameters = decoder.decodePageParameters(url);
assertEquals(2, parameters.getAllNamed().size());
assertEquals("value1", parameters.get("name1").toString());
assertEquals("", parameters.get("name2").toString());
}
}