package fr.openwide.core.test.wicket.more.link.descriptor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import java.util.List;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.javatuples.Pair;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import fr.openwide.core.commons.util.functional.Suppliers2;
import fr.openwide.core.test.wicket.more.business.person.model.Person;
import fr.openwide.core.test.wicket.more.business.person.service.IPersonService;
import fr.openwide.core.test.wicket.more.link.descriptor.page.TestLinkDescriptorNoParameterPage;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.link.descriptor.IImageResourceLinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.ILinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.IPageLinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.IResourceLinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.LinkInvalidTargetRuntimeException;
import fr.openwide.core.wicket.more.link.descriptor.builder.LinkDescriptorBuilder;
import fr.openwide.core.wicket.more.link.descriptor.builder.state.terminal.ILateTargetDefinitionTerminalState;
import fr.openwide.core.wicket.more.link.descriptor.parameter.CommonParameters;
import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.LinkParameterModelValidationException;
import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.LinkParameterSerializedFormValidationException;
import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.LinkParameterValidationRuntimeException;
import fr.openwide.core.wicket.more.model.CollectionCopyModel;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
public abstract class AbstractAnyTargetTestLinkDescriptor extends AbstractTestLinkDescriptor {
@Autowired
private IPersonService personService;
protected abstract ILinkDescriptor buildWithNullTarget(
ILateTargetDefinitionTerminalState<
IPageLinkDescriptor, IResourceLinkDescriptor, IImageResourceLinkDescriptor
> builder);
protected abstract ILinkDescriptor buildWithNoParameterTarget(
ILateTargetDefinitionTerminalState<
IPageLinkDescriptor, IResourceLinkDescriptor, IImageResourceLinkDescriptor
> builder);
protected abstract ILinkDescriptor buildWithOneParameterTarget(
ILateTargetDefinitionTerminalState<
IPageLinkDescriptor, IResourceLinkDescriptor, IImageResourceLinkDescriptor
> builder);
protected abstract String getNoParameterTargetPathPrefix();
protected abstract String getOneParameterTargetPathPrefix();
@Test
public void url_noParam_validatorPasses() throws Exception {
ILinkDescriptor linkDescriptor =
buildWithNoParameterTarget(
LinkDescriptorBuilder.start()
.validator(Condition.alwaysTrue())
);
assertThat(linkDescriptor.url(), hasPathAndQuery(getNoParameterTargetPathPrefix()));
}
@Test
public void extract_noParam_validatorPasses() throws Exception {
ILinkDescriptor linkDescriptor =
buildWithNoParameterTarget(
LinkDescriptorBuilder.start()
.validator(Condition.alwaysTrue())
);
linkDescriptor.extract(new PageParameters());
}
@Test(expected = LinkParameterValidationRuntimeException.class)
public void url_noParam_validatorFails() {
ILinkDescriptor linkDescriptor = LinkDescriptorBuilder.start()
.validator(Condition.alwaysFalse())
.page(TestLinkDescriptorNoParameterPage.class);
linkDescriptor.url();
}
@Test(expected = LinkParameterModelValidationException.class)
public void extract_noParam_validatorFails() throws Exception {
ILinkDescriptor linkDescriptor =
buildWithNoParameterTarget(
LinkDescriptorBuilder.start()
.validator(Condition.alwaysFalse())
);
linkDescriptor.extract(new PageParameters());
}
@Test(expected = LinkInvalidTargetRuntimeException.class)
public void url_noParam_missingTarget() {
ILinkDescriptor linkDescriptor =
buildWithNullTarget(
LinkDescriptorBuilder.start()
);
linkDescriptor.url();
}
@Test
public void extract_noParam_missingTarget() throws Exception {
ILinkDescriptor linkDescriptor =
buildWithNullTarget(
LinkDescriptorBuilder.start()
);
linkDescriptor.extract(new PageParameters());
// Just check that there is no exception thrown, which means that target validation is *not* performed
}
@Test(expected = LinkParameterValidationRuntimeException.class)
public void url_oneParamMandatory_mandatoryFails() {
IModel<Long> model = Model.of((Long)null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).mandatory()
);
linkDescriptor.url();
}
@Test(expected = LinkParameterSerializedFormValidationException.class)
public void extract_oneParamMandatory_mandatoryFails() throws Exception {
IModel<Long> model = Model.of((Long)null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).mandatory()
);
linkDescriptor.extract(new PageParameters());
}
@Test
public void url_oneParamMandatory_mandatoryPasses() {
IModel<Long> model = Model.of(1L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).mandatory()
);
assertThat(linkDescriptor.url(), hasPathAndQuery(getOneParameterTargetPathPrefix() + "1"));
}
@Test
public void extract_oneParamMandatory_mandatoryPasses() throws Exception {
IModel<Long> model = Model.of((Long)null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).mandatory()
);
linkDescriptor.extract(new PageParameters().add(CommonParameters.ID, 1L));
assertEquals(Long.valueOf(1L), model.getObject());
}
@Test(expected = LinkParameterValidationRuntimeException.class)
public void url_oneParamOptional_validatorFails() {
IModel<Long> model = Model.of(1L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).optional()
.validator(Condition.alwaysFalse())
);
linkDescriptor.url();
}
@Test(expected = LinkParameterModelValidationException.class)
public void extract_oneParamOptional_validatorFails() throws Exception {
IModel<Long> model = Model.of(1L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).optional()
.validator(Condition.alwaysFalse())
);
linkDescriptor.extract(new PageParameters());
}
@Test
public void url_oneParamOptional_validatorPasses() {
IModel<Long> model = Model.of(1L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).optional()
.validator(Condition.alwaysTrue())
);
assertThat(linkDescriptor.url(), hasPathAndQuery(getOneParameterTargetPathPrefix() + "1"));
}
@Test
public void extract_oneParamOptional_validatorPasses() throws Exception {
IModel<Long> model = Model.of((Long)null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).optional()
.validator(Condition.alwaysTrue())
);
linkDescriptor.extract(new PageParameters().add(CommonParameters.ID, 1L));
assertEquals(Long.valueOf(1L), model.getObject());
}
@Test
public void url_oneParamOptional_genericEntity() throws Exception {
Person person = new Person("John", "Doe");
personService.create(person);
IModel<Person> model = GenericEntityModel.of(person);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Person.class).optional()
);
assertThat(linkDescriptor.url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + person.getId()));
}
@Test
public void extract_oneParamOptional_genericEntity() throws Exception {
Person person = new Person("John", "Doe");
personService.create(person);
IModel<Person> model = GenericEntityModel.of(person);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Person.class).optional()
);
linkDescriptor.extract(new PageParameters().add(CommonParameters.ID, person.getId()));
assertEquals(person, model.getObject());
}
@Test
public void url_oneParamOptional_collection() {
IModel<List<Long>> model = new ListModel<Long>(Lists.newArrayList(1L, 2L));
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.mapCollection(CommonParameters.ID, model, List.class, Long.class).optional()
);
assertThat(linkDescriptor.url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + "1,2"));
}
@Test
public void extract_oneParamOptional_collection() throws Exception {
IModel<List<Long>> model = new ListModel<Long>(null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.mapCollection(CommonParameters.ID, model, List.class, Long.class).optional()
);
linkDescriptor.extract(new PageParameters().add(CommonParameters.ID, "1,2"));
assertEquals(Lists.newArrayList(1L, 2L), model.getObject());
}
@Test
public void url_oneParamOptional_afterSerialization() {
IModel<Long> model = Model.of(1L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).optional()
);
ILinkDescriptor deserializedLinkDescriptor = serializeAndDeserialize(linkDescriptor);
assertThat(deserializedLinkDescriptor.url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + "1"));
}
/**
* We've had issues in the past with serializing TypeDescriptors of Collection<? extends GenericEntity>
*/
@Test
public void serialization_oneParamOptional_genericEntityCollection() throws Exception {
Person person1 = new Person("Jane", "Doe");
personService.create(person1);
Person person2 = new Person("John", "Doe");
personService.create(person2);
IModel<List<Person>> model = CollectionCopyModel.custom(
Suppliers2.<Person>arrayListAsList(), GenericEntityModel.<Person>factory()
);
model.setObject(ImmutableList.of(person1, person2));
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.mapCollection(CommonParameters.ID, model, List.class, Person.class).optional()
);
Pair<IModel<List<Person>>, ILinkDescriptor> deserialized =
serializeAndDeserialize(Pair.with(model, linkDescriptor));
assertThat(deserialized.getValue1().url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + person1.getId() + "," + person2.getId()));
}
@Test
public void extract_oneParamOptional_afterSerialization() throws Exception {
IModel<Long> model = Model.of((Long) null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model, Long.class).optional()
);
Pair<IModel<Long>, ILinkDescriptor> deserialized =
serializeAndDeserialize(Pair.with(model, linkDescriptor));
assertNull(deserialized.getValue0().getObject());
deserialized.getValue1().extract(new PageParameters().add(CommonParameters.ID, 1L));
assertEquals(Long.valueOf(1L), deserialized.getValue0().getObject());
}
@Test
public void url_twoParam() {
IModel<Long> model1 = Model.of(1L);
IModel<Long> model2 = Model.of(2L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model1, Long.class).mandatory()
.map("param2", model2, Long.class).mandatory()
);
assertThat(linkDescriptor.url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + "1?param2=2"));
}
@Test
public void extract_twoParam() throws Exception {
IModel<Long> model1 = Model.of((Long) null);
IModel<Long> model2 = Model.of((Long) null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model1, Long.class).mandatory()
.map("param2", model2, Long.class).mandatory()
);
linkDescriptor.extract(new PageParameters()
.add(CommonParameters.ID, 1L)
.add("param2", 2L)
);
assertEquals(Long.valueOf(1L), model1.getObject());
assertEquals(Long.valueOf(2L), model2.getObject());
}
@Test
public void url_threeParam() {
IModel<Long> model1 = Model.of(1L);
IModel<Long> model2 = Model.of(2L);
IModel<Long> model3 = Model.of(3L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model1, Long.class).mandatory()
.map("param2", model2, Long.class).mandatory()
.map("param3", model3, Long.class).mandatory()
);
assertThat(linkDescriptor.url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + "1?param2=2¶m3=3"));
}
@Test
public void extract_threeParam() throws Exception {
IModel<Long> model1 = Model.of((Long) null);
IModel<Long> model2 = Model.of((Long) null);
IModel<Long> model3 = Model.of((Long) null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model1, Long.class).mandatory()
.map("param2", model2, Long.class).mandatory()
.map("param3", model3, Long.class).mandatory()
);
linkDescriptor.extract(new PageParameters()
.add(CommonParameters.ID, 1L)
.add("param2", 2L)
.add("param3", 3L)
);
assertEquals(Long.valueOf(1L), model1.getObject());
assertEquals(Long.valueOf(2L), model2.getObject());
assertEquals(Long.valueOf(3L), model3.getObject());
}
@Test
public void url_fourParam() {
IModel<Long> model1 = Model.of(1L);
IModel<Long> model2 = Model.of(2L);
IModel<Long> model3 = Model.of(3L);
IModel<Long> model4 = Model.of(4L);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model1, Long.class).mandatory()
.map("param2", model2, Long.class).mandatory()
.map("param3", model3, Long.class).mandatory()
.map("param4", model4, Long.class).mandatory()
);
assertThat(linkDescriptor.url(),
hasPathAndQuery(getOneParameterTargetPathPrefix() + "1?param2=2¶m3=3¶m4=4"));
}
@Test
public void extract_fourParam() throws Exception {
IModel<Long> model1 = Model.of((Long) null);
IModel<Long> model2 = Model.of((Long) null);
IModel<Long> model3 = Model.of((Long) null);
IModel<Long> model4 = Model.of((Long) null);
ILinkDescriptor linkDescriptor =
buildWithOneParameterTarget(
LinkDescriptorBuilder.start()
.map(CommonParameters.ID, model1, Long.class).mandatory()
.map("param2", model2, Long.class).mandatory()
.map("param3", model3, Long.class).mandatory()
.map("param4", model4, Long.class).mandatory()
);
linkDescriptor.extract(new PageParameters()
.add(CommonParameters.ID, 1L)
.add("param2", 2L)
.add("param3", 3L)
.add("param4", 4L)
);
assertEquals(Long.valueOf(1L), model1.getObject());
assertEquals(Long.valueOf(2L), model2.getObject());
assertEquals(Long.valueOf(3L), model3.getObject());
assertEquals(Long.valueOf(4L), model4.getObject());
}
}