package lt.inventi.wicket.component.repeater.expandable;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Test;
public class ModelWrappingExpandableViewTest {
private WicketTester tester = new WicketTester();
private List<TestObject> viewObjects = new ArrayList<TestObject>();
@Test
public void properlyAddsNewItemsWhenModelsAreWrapped() {
IModel<List<TestObject>> model = PropertyModel.of(this, "viewObjects");
TestPage page = tester.startPage(new TestPage(model));
tester.clickLink(page.addLink);
assertThat(getView().size(), is(1));
assertThat(getView().get("0:name").getDefaultModelObjectAsString(), equalTo("0"));
assertThat(viewObjects.size(), is(1));
tester.clickLink(page.addLink);
assertThat(getView().size(), is(2));
assertThat(getView().get("0:name").getDefaultModelObjectAsString(), equalTo("0"));
assertThat(getView().get("1:name").getDefaultModelObjectAsString(), equalTo("1"));
assertThat(viewObjects.size(), is(2));
tester.executeAjaxEvent(getView().get("0:remove"), "click");
assertThat(getView().size(), is(1));
assertThat(getView().get("1:name").getDefaultModelObjectAsString(), equalTo("1"));
assertThat(viewObjects.size(), is(1));
}
private MarkupContainer getView() {
return ((TestPage) tester.getLastRenderedPage()).view;
}
@SuppressWarnings("unused")
private static class TestObject {
String name;
String description;
public TestObject(String name, String description) {
this.name = name;
this.description = description;
}
}
private static class TestPage extends WebPage {
private final AddNewItemLink<TestObject> addLink;
private final ExpandableView<TestObject> view;
TestPage(final IModel<List<TestObject>> viewModel) {
super();
WebMarkupContainer container1 = new WebMarkupContainer("viewContainer");
container1.setMarkupId(container1.getId());
container1.add(view = new ExpandableView<TestObject>("view", viewModel) {
@Override
protected void populateItem(Item<TestObject> item) {
item.setModel(CompoundPropertyModel.of(item.getModel()));
item.add(new Label("name"));
item.add(new Label("description"));
item.add(new AutoRemoveItemLink<TestObject>("remove", item));
}
});
add(container1);
add(addLink = new AutoAddNewItemLink<TestObject>("addLink", view) {
private int counter = 0;
@Override
protected TestObject createNewItem() {
return new TestObject(String.valueOf(counter++), null);
}
});
}
}
}