/* * 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.core.request.mapper; import java.nio.charset.Charset; import java.util.List; import java.util.Locale; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.IRequestMapper; import org.apache.wicket.request.Request; import org.apache.wicket.request.Url; import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.request.resource.SharedResourceReference; import org.apache.wicket.util.string.StringValue; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Before; import org.junit.Test; /** */ public class ResourceMapperTest extends WicketTestCase { private static final Charset CHARSET = Charset.forName("UTF-8"); private static final String SHARED_NAME = "test-resource"; private IRequestMapper mapper; private IRequestMapper mapperWithPlaceholder; private TestResource resource; /** * @throws Exception */ @Before public void before() throws Exception { resource = new TestResource(); tester.getApplication().getSharedResources().add(SHARED_NAME, resource); ResourceReference resourceReference = new SharedResourceReference(SHARED_NAME); mapper = new ResourceMapper("/test/resource", resourceReference); mapperWithPlaceholder = new ResourceMapper("/test2/${name}/resource", resourceReference); tester.getApplication().getRootRequestMapperAsCompound().add(mapper); } private Request createRequest(final String url) { return new Request() { @Override public Url getUrl() { return Url.parse(url, CHARSET); } @Override public Locale getLocale() { return null; } @Override public Charset getCharset() { return CHARSET; } @Override public Url getClientUrl() { return getUrl(); } @Override public Object getContainerRequest() { return null; } }; } /** * testInvalidPathIsEmpty() */ @Test public void invalidPathIsEmpty() { IRequestHandler requestHandler = mapper.mapRequest(createRequest("")); assertNull(requestHandler); } /** * testInvalidPathIsMismatch() */ @Test public void invalidPathIsMismatch() { IRequestHandler requestHandler = mapper.mapRequest(createRequest("test/resourcex")); assertNull(requestHandler); } /** * testInvalidPathIsTooShort() */ @Test public void invalidPathIsTooShort() { IRequestHandler requestHandler = mapper.mapRequest(createRequest("test")); assertNull(requestHandler); } /** * testValidPathWithParams() */ @Test public void validPathWithParams() { Request request = createRequest("test/resource/1/fred"); IRequestHandler requestHandler = mapper.mapRequest(request); assertNotNull(requestHandler); assertEquals(ResourceReferenceRequestHandler.class, requestHandler.getClass()); assertEquals(request.getUrl(), mapper.mapHandler(requestHandler)); tester.processRequest(requestHandler); PageParameters params = resource.pageParameters; assertNotNull(params); assertEquals(0, params.getAllNamed().size()); assertEquals(2, params.getIndexedCount()); StringValue paramId = params.get(0); assertNotNull(paramId); assertEquals(1, paramId.toInt()); StringValue paramName = params.get(1); assertNotNull(paramName); assertEquals("fred", paramName.toString()); } /** * testValidPathWithParamsAndQueryPath() */ @Test public void validPathWithParamsAndQueryPath() { Request request = createRequest("test/resource/1/fred?foo=bar&foo=baz&value=12"); IRequestHandler requestHandler = mapper.mapRequest(request); assertNotNull(requestHandler); assertEquals(ResourceReferenceRequestHandler.class, requestHandler.getClass()); assertEquals(request.getUrl(), mapper.mapHandler(requestHandler)); tester.processRequest(requestHandler); PageParameters params = resource.pageParameters; assertNotNull(params); assertEquals(3, params.getAllNamed().size()); assertEquals(2, params.getIndexedCount()); StringValue paramId = params.get(0); assertNotNull(paramId); assertEquals(1, paramId.toInt()); StringValue paramName = params.get(1); assertNotNull(paramName); assertEquals("fred", paramName.toString()); List<StringValue> foo = params.getValues("foo"); assertNotNull(foo.size() == 2); assertEquals("bar", foo.get(0).toString("")); assertEquals("baz", foo.get(1).toString("")); StringValue paramValue = params.get("value"); assertEquals(12, paramValue.toInt()); } /** * testPlaceholders() */ @Test public void placeholders() { Request request = createRequest("test2/image/resource/foo/bar?a=abc&b=123"); IRequestHandler requestHandler = mapperWithPlaceholder.mapRequest(request); assertNotNull(requestHandler); assertEquals(ResourceReferenceRequestHandler.class, requestHandler.getClass()); assertEquals(request.getUrl(), mapperWithPlaceholder.mapHandler(requestHandler)); tester.processRequest(requestHandler); PageParameters params = resource.pageParameters; assertNotNull(params); assertEquals(3, params.getAllNamed().size()); assertEquals(2, params.getIndexedCount()); assertEquals("foo", params.get(0).toString()); assertEquals("bar", params.get(1).toString()); assertEquals("image", params.get("name").toString()); assertEquals("abc", params.get("a").toString()); assertEquals("123", params.get("b").toString()); } /** * testPlaceholdersWithQueryParamDuplicate() */ @Test public void placeholdersWithQueryParamDuplicate() { // we have one named parameter that exists twice Request request = createRequest("test2/image/resource/foo/bar?name=name-2&val=123"); IRequestHandler handler = mapperWithPlaceholder.mapRequest(request); assertNotNull(handler); assertEquals(ResourceReferenceRequestHandler.class, handler.getClass()); // the query part of the duplicate should be gone now Url newUrl = mapperWithPlaceholder.mapHandler(handler); assertEquals(Url.parse("test2/name-2/resource/foo/bar?val=123"), newUrl); // create new request request = createRequest(newUrl.toString()); // get handler again handler = mapperWithPlaceholder.mapRequest(request); assertNotNull(handler); tester.processRequest(handler); PageParameters params = resource.pageParameters; assertNotNull(params); assertEquals(2, params.getAllNamed().size()); assertEquals(2, params.getIndexedCount()); assertEquals("foo", params.get(0).toString()); assertEquals("bar", params.get(1).toString()); assertEquals("name-2", params.get("name").toString()); assertEquals("123", params.get("val").toString()); } /** * */ @Test public void requestWithEmptyFilename() { // request invalid path with empty filename // this must not return a handler Request request = createRequest("test2/image/"); IRequestHandler handler = mapperWithPlaceholder.mapRequest(request); assertNull(handler); } private static class TestResource implements IResource { private static final long serialVersionUID = -3130204487473856574L; public PageParameters pageParameters; @Override public void respond(Attributes attributes) { pageParameters = attributes.getParameters(); } } }