package lt.inventi.wicket.component.breadcrumb; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertThat; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.markup.IMarkupFragment; import org.apache.wicket.markup.Markup; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.component.IRequestablePage; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.StringValue; import org.junit.Test; public class BreadcrumbsOperationsHelperTest extends BreadcrumbsTests { @Test public void goesToNextAndPreviousPages() { tester.startPage(OperationsTestPage.class, new PageParameters().add("count", 10)); assertThat(breadcrumbTitles(), contains("10")); tester.clickLink("statelessLinkClassOnly"); assertThat(breadcrumbTitles(), contains("10", "0")); tester.clickLink("statefulLink"); assertThat(breadcrumbTitles(), contains("10", "0", "1")); tester.clickLink("statelessLinkClassWithParams"); assertThat(breadcrumbTitles(), contains("10", "0", "1", "1")); tester.clickLink("previousPageLink"); // TODO: Why? /* assertThat(breadcrumbTitles(), contains("10", "0", "1")); tester.clickLink("previousPageLink"); assertThat(breadcrumbTitles(), contains("10", "0")); */ } @Test public void defensivelyClonesPageParametersIfSameInstanceAsPage() { OperationsTestPage page = tester.startPage(OperationsTestPage.class, new PageParameters().add("count", 10)); PageParameters params = BreadcrumbPageParameters.setTrailTo(new PageParameters().set("count", 20), page); page = tester.startPage(OperationsTestPage.class, params); tester.clickLink("statelessLinkClassOnly"); PageParameters newParams = tester.getLastRenderedPage().getPageParameters(); assertThat(newParams, is(not(params))); params = newParams; tester.clickLink("statefulLink"); newParams = tester.getLastRenderedPage().getPageParameters(); assertThat(newParams, is(not(params))); params = newParams; tester.clickLink("statelessLinkClassWithParams"); newParams = tester.getLastRenderedPage().getPageParameters(); assertThat(newParams, is(not(params))); } @Test public void failsToRedirectIfSameParametersInstanceUsedForNextPage() { tester.startPage(OperationsTestPage.class, new PageParameters().add("count", 10)); try { tester.clickLink("statefulLinkWithParams"); } catch (WicketRuntimeException e) { assertThat(e.getCause().getCause(), instanceOf(IllegalStateException.class)); } } public static class OperationsTestPage extends AbstractBreadcrumbTestsPage implements IBreadcrumbsOperations { private final BreadcrumbsOperationsHelper helper; private int count; public OperationsTestPage() { super(); this.helper = new BreadcrumbsOperationsHelper(this); } public OperationsTestPage(PageParameters parameters) { super(parameters); StringValue countParam = parameters.get("count"); this.count = countParam.isEmpty() ? 0 : countParam.toInt(); this.helper = new BreadcrumbsOperationsHelper(this); } public OperationsTestPage(int i) { super(); this.helper = new BreadcrumbsOperationsHelper(this); count = i; } @Override protected void onInitialize() { super.onInitialize(); add(new Link<Void>("statelessLinkClassOnly") { @Override public void onClick() { setNextResponsePage(OperationsTestPage.class); } }); add(new Link<Void>("statelessLinkClassWithParams") { @Override public void onClick() { setNextResponsePage(OperationsTestPage.class, getPage().getPageParameters().set("count", count)); } }); add(new Link<Void>("statefulLink") { @Override public void onClick() { setNextResponsePage(new OperationsTestPage(count + 1)); } }); add(new Link<Void>("statefulLinkWithParams") { @Override public void onClick() { setNextResponsePage(new OperationsTestPage(getPage().getPageParameters())); } }); add(new Link<Void>("previousPageLink") { @Override public void onClick() { setResponseToPreviousPage(); } }); } @Override public IMarkupFragment getMarkup() { return Markup.of("<body><div wicket:id=\"crumbs\" />" + "<a wicket:id=\"statelessLinkClassWithParams\" />" + "<a wicket:id=\"statelessLinkClassOnly\" />" + "<a wicket:id=\"statefulLink\" />" + "<a wicket:id=\"statefulLinkWithParams\" />" + "<a wicket:id=\"previousPageLink\" />" + "</body>"); } @Override public IModel<String> getBreadcrumbTitleModel() { return Model.of(String.valueOf(count)); } @Override public void setResponseToPreviousPage() { helper.setResponseToPreviousPage(); } @Override public void setNextResponsePage(IRequestablePage page) { helper.setNextResponsePage(page); } @Override public void setNextResponsePage(Class<? extends IRequestablePage> clazz) { helper.setNextResponsePage(clazz); } @Override public void setNextResponsePage(Class<? extends IRequestablePage> clazz, PageParameters params) { helper.setNextResponsePage(clazz, params); } } }