/**
* Copyright 2014 55 Minutes (http://www.55minutes.com)
*
* 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 fiftyfive.wicket.util;
import java.io.Serializable;
import fiftyfive.wicket.test.PageWithInlineMarkup;
import fiftyfive.wicket.test.WicketTestUtils;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ParameterSpecTest
{
private WicketTester tester;
@Before
public void createTester()
{
this.tester = new WicketTester();
}
@After
public void destroyTester()
{
this.tester.destroy();
}
@Test
public void testCreateLink_indexed()
{
TestBean bean = new TestBean(1L, "foo");
ParameterSpec builder =
new ParameterSpec<TestBean>(TestPage.class, "id", "name");
BookmarkablePageLink link = builder.createLink("bar", new Model(bean));
this.tester.startComponent(link);
Assert.assertEquals("bar", link.getId());
Assert.assertEquals(TestPage.class, link.getPageClass());
PageParameters params = link.getPageParameters();
Assert.assertEquals(bean.getId(), params.get("id").toLongObject());
Assert.assertEquals(bean.getName(), params.get("name").toString());
}
@Test
public void testCreateParameters_indexed()
{
TestBean bean = new TestBean(1L, "foo");
ParameterSpec builder =
new ParameterSpec<TestBean>(TestPage.class, "id", "name");
PageParameters params = builder.createParameters(bean);
Assert.assertEquals(bean.getId(), params.get("id").toLongObject());
Assert.assertEquals(bean.getName(), params.get("name").toString());
}
@Test
public void testParseParameters_indexed()
{
ParameterSpec builder =
new ParameterSpec<TestBean>(TestPage.class, "id", "name");
TestBean bean = new TestBean();
PageParameters params = new PageParameters();
params.set("id", "5");
params.set("name", "hello");
builder.parseParameters(params, bean);
Assert.assertEquals((Long) 5L, (Long) bean.getId());
Assert.assertEquals("hello", bean.getName());
}
/**
* Asserts that badly formatted page parameter value causes an abort
* with 404.
*/
@Test
public void testParseParameters_badformat404()
{
ParameterSpec builder =
new ParameterSpec<TestBean>(TestPage.class, "id", "name");
TestBean bean = new TestBean();
PageParameters params = new PageParameters();
params.set("id", "notparseableaslong");
try
{
builder.parseParameters(params, bean);
Assert.fail("AbortWithHttpErrorCodeException was not thrown.");
}
catch(AbortWithHttpErrorCodeException awhece)
{
Assert.assertEquals(404, awhece.getErrorCode());
}
}
/**
* Asserts that badly formatted page parameter value is ignored when
* {@code throw404OnParseError} is {@code false}.
*/
@Test
public void testParseParameters_badformatnull()
{
ParameterSpec builder =
new ParameterSpec<TestBean>(TestPage.class, "id", "name");
TestBean bean = new TestBean();
PageParameters params = new PageParameters();
params.set("id", "notparseableaslong");
builder.parseParameters(params, bean, false);
Assert.assertNull(bean.getId());
}
/**
* Asserts that missing parameter values are gracefully ignored.
*/
@Test
public void testParseParameters_missing()
{
ParameterSpec builder =
new ParameterSpec<TestBean>(TestPage.class, "id", "name");
TestBean bean = new TestBean();
PageParameters params = new PageParameters();
builder.parseParameters(params, bean);
Assert.assertNull(bean.getId());
Assert.assertNull(bean.getName());
}
@Test
public void testCreateLink_named()
{
TestBean bean = new TestBean(1L, "foo");
ParameterSpec builder = new ParameterSpec<TestBean>(TestPage.class);
builder.registerParameter("beanId", "id");
builder.registerParameter("beanName", "name");
BookmarkablePageLink link = builder.createLink("bar", new Model(bean));
this.tester.startComponent(link);
Assert.assertEquals("bar", link.getId());
Assert.assertEquals(TestPage.class, link.getPageClass());
PageParameters params = link.getPageParameters();
Assert.assertEquals(bean.getId(), params.get("beanId").toLongObject());
Assert.assertEquals(bean.getName(), params.get("beanName").toString());
}
@Test
public void testCreateParameters_named()
{
TestBean bean = new TestBean(1L, "foo");
ParameterSpec builder = new ParameterSpec<TestBean>(TestPage.class);
builder.registerParameter("beanId", "id");
builder.registerParameter("beanName", "name");
PageParameters params = builder.createParameters(bean);
Assert.assertEquals(bean.getId(), params.get("beanId").toLongObject());
Assert.assertEquals(bean.getName(), params.get("beanName").toString());
}
@Test
public void testParseParameters_named()
{
ParameterSpec builder = new ParameterSpec<TestBean>(TestPage.class);
builder.registerParameter("beanId", "id");
builder.registerParameter("beanName", "name");
TestBean bean = new TestBean();
PageParameters params = new PageParameters();
params.set("beanId", "5");
params.set("beanName", "hello");
builder.parseParameters(params, bean);
Assert.assertEquals((Long) 5L, bean.getId());
Assert.assertEquals("hello", bean.getName());
}
/**
* Verify that the redirect method actually redirects to a new page as
* we expect.
*/
@Test
public void testRedirect()
{
final ParameterSpec spec = new ParameterSpec<TestBean>(TestPage.class);
// Force the redirect during wicket's normal request processing.
// For example, when a link is clicked.
WicketTestUtils.startComponentWithXHtml(this.tester, new Link("link") {
public void onClick()
{
spec.redirect(Model.of(new TestBean()));
}
}, "<a wicket:id=\"link\">link</a>");
// Click the link that we just rendered
this.tester.clickLink("link");
// The redirect should have forced wicket to render TestPage
this.tester.assertRenderedPage(TestPage.class);
}
public static class TestPage extends PageWithInlineMarkup
{
public TestPage(PageParameters params)
{
super("<html><head></head><body>hello</body></html>");
}
}
public static class TestBean implements Serializable
{
private Long id;
private String name;
public TestBean()
{
super();
}
public TestBean(Long id, String name)
{
this.id = id;
this.name = name;
}
public Long getId()
{
return this.id;
}
public void setId(Long newId)
{
this.id = newId;
}
public String getName()
{
return this.name;
}
public void setName(String newName)
{
this.name = newName;
}
}
}