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()); } }