package lt.inventi.wicket.component.breadcrumb;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertThat;
import java.util.Date;
import java.util.List;
import org.apache.wicket.core.request.handler.IPageRequestHandler;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.link.StatelessLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
import org.junit.Test;
public class BreadcrumbsPageTest extends BreadcrumbsTests {
@Test
public void testStatelessBreadcrumbs(){
BasePage page = tester
.startPage(StatelessPage.class);
assertThat(page.isStateless(), is(true));
tester.assertDisabled("back");
//same page created twice
//should be only one breadcrumb
page = tester.startPage(StatelessPage.class);
page = tester.startPage(StatelessPage.class);
assertThat(breadcrumbTitles(), contains("StatelessPage"));
assertThat("Page must be bookmarkable", page.isBookmarkable(), is(true));
//go next, should be 2 breadcrumbs
tester.clickLink("nextPage");
page = getLastRenderedPage();
assertThat(page.isStateless(), is(true));
assertThat(breadcrumbTitles(), contains("StatelessPage", "StatelessPage"));
tester.clickLink("back");
page = getLastRenderedPage();
assertThat(page.isStateless(), is(true));
assertThat(page, instanceOf(getLastRenderedPage().getClass()));
assertThat(breadcrumbTitles(), contains("StatelessPage"));
}
@Test
public void testStatelessDeeperNesting(){
tester.startPage(StatelessPage.class);
tester.clickLink("nextPage");
BasePage page = getLastRenderedPage();
assertEquals("testValue", page.getPageParameters().get("testKey").toString());
assertEquals(2, page.getBreadcrumbs().size());
tester.clickLink("nextPage2");
page = getLastRenderedPage();
List<Breadcrumb> breadcrumbList = page.getBreadcrumbs();
assertEquals("testValue2", page.getPageParameters().get("testKey2").toString());
assertEquals(3, breadcrumbList.size());
tester.assertComponent("crumbs:crumbs:0:link", Link.class);
tester.assertComponent("crumbs:crumbs:1:link", Link.class);
tester.assertComponent("crumbs:crumbs:2:link", Link.class);
tester.clickLink("back");
Class<?> prevPageClass = page.getClass();
assertEquals(prevPageClass, tester.getLastRenderedPage().getClass());
breadcrumbList = getLastRenderedPage().getBreadcrumbs();
assertEquals(2, breadcrumbList.size());
/*BookmarkablePageLink<?> backLink = (BookmarkablePageLink<?>)page.get("back");
Assert.assertNotNull("Param with previous page ID doesnt exist",
backLink.getPageParameters().get("brd").toString());*/
tester.clickLink("back");
breadcrumbList = getLastRenderedPage().getBreadcrumbs();
assertEquals(1, breadcrumbList.size());
}
@Test
public void testStatefullBreadcrumbs(){
tester.startPage(StatelessPage.class);
tester.clickLink("goStatefull");
BasePage page = getLastRenderedPage();
assertEquals(2, getLastRenderedPage().getBreadcrumbs().size());
IPageRequestHandler handler = (IPageRequestHandler)getLastRenderedPage()
.getBreadcrumbs().get(1).getHandler();
assertFalse("Page must NOT be stateless", page.isStateless());
assertEquals(page, handler.getPage());
MockHttpServletRequest request = tester.getLastRequest();
tester.processRequest(request);
tester.processRequest(request);
page = getLastRenderedPage();
assertEquals(2, getLastRenderedPage().getBreadcrumbs().size());
//same page, should be still 2 breadcrumbs
tester.clickLink("form:save");
page = getLastRenderedPage();
assertEquals(2, page.getBreadcrumbs().size());
FormTester formTest = tester.newFormTester("form");
formTest.setValue("input", "error");
formTest.submitLink("save", false);
formTest.submitLink("save", false);
formTest.submitLink("save", false);
page = (BasePage) formTest.getForm().getPage();
assertEquals(2, page.getBreadcrumbs().size());
tester.clickLink("next");
assertEquals(3, getLastRenderedPage().getBreadcrumbs().size());
tester.clickLink("next");
assertEquals(4, getLastRenderedPage().getBreadcrumbs().size());
tester.clickLink("back");
assertEquals(3, getLastRenderedPage().getBreadcrumbs().size());
tester.clickLink("back");
assertEquals(2, getLastRenderedPage().getBreadcrumbs().size());
}
private BasePage getLastRenderedPage() {
return (BasePage) tester.getLastRenderedPage();
}
public static class BasePage extends WebPage implements IBreadcrumbTitleModelProvider {
protected BreadcrumbsOperationsHelper helper;
public BasePage() {
super();
}
public BasePage(IModel<?> model) {
super(model);
}
public BasePage(PageParameters parameters) {
super(parameters);
}
@Override
protected void onInitialize() {
super.onInitialize();
helper = new BreadcrumbsOperationsHelper(this);
add(new BreadcrumbsPanel("crumbs"));
}
@Override
public IModel<String> getBreadcrumbTitleModel() {
return Model.of(getClass().getSimpleName());
}
public List<Breadcrumb> getBreadcrumbs() {
return ((BreadcrumbsPanel) get("crumbs")).getBreadcrumbs();
}
}
public static class StatefullPage extends BasePage {
private int hashCode = 0;
private Form form;
public StatefullPage() {
super();
}
public StatefullPage(WebMarkupContainer panel) {
super();
add(panel);
}
@Override
protected void onInitialize() {
super.onInitialize();
form = new Form<String>("form");
TextField<String> input = new TextField<String>("input", new Model<String>());
input.add(new IValidator<String>(){
@Override
public void validate(IValidatable<String> validatable) {
if("error".equals(validatable.getValue())){
validatable.error(new ValidationError().setMessage("error"));
}
}
});
form.add(input);
form.add(new SubmitLink("save", form){
@Override
public void onSubmit() {
super.onSubmit();
}
});
add(form);
add(new Link<Void>("next"){
@Override
public void onClick() {
helper.setNextResponsePage(new StatefullPage(new WebMarkupContainer("panel")));
}
});
add(new Link<Void>("back"){
@Override
public void onClick() {
helper.setResponseToPreviousPage();
}
});
}
@Override
protected void onBeforeRender(){
hashCode = new Date().hashCode();
super.onBeforeRender();
}
}
public static class StatelessPage extends BasePage {
public StatelessPage() {
super();
}
public StatelessPage(PageParameters parameters) {
super(parameters);
}
@Override
protected void onInitialize() {
super.onInitialize();
PageParameters params = new PageParameters();
params.set("testKey", "testValue");
Link<?> link = new NextBookmarkablePageLink<StatelessPage>("nextPage", StatelessPage.class, params);
add(link);
params = new PageParameters();
params.set("testKey2", "testValue2");
Link<?> link2 = new NextBookmarkablePageLink<StatelessPage>("nextPage2", StatelessPage.class, params);
add(link2);
add(new StatelessLink<Void>("goStatefull") {
@Override
public void onClick() {
helper.setNextResponsePage(new StatefullPage(new WebMarkupContainer("panel")));
}
});
add(new PreviousPageLink("back"));
}
}
}