diff --git a/cust-services/src/main/java/de/hsadmin/service/customer/MemberShareVO.java b/cust-services/src/main/java/de/hsadmin/service/customer/MemberShareVO.java new file mode 100644 index 0000000..8e772a8 --- /dev/null +++ b/cust-services/src/main/java/de/hsadmin/service/customer/MemberShareVO.java @@ -0,0 +1,90 @@ +package de.hsadmin.service.customer; + +import java.util.Date; + +import de.hsadmin.common.error.TechnicalException; +import de.hsadmin.module.ValueObject; +import de.hsadmin.module.impl.AbstractVO; +import de.hsadmin.module.property.ReadWrite; +import de.hsadmin.module.property.ReadWritePolicy; +import de.hsadmin.module.property.Required; +import de.hsadmin.module.property.Search; +import de.hsadmin.module.property.SearchPolicy; +import de.hsadmin.module.property.mapping.DefaultStringParameterMapMapper; +import de.hsadmin.module.property.mapping.Mapping; +import de.hsadmin.module.property.mapping.ReferredStringPersistentObjectMapper; + +public class MemberShareVO extends AbstractVO implements ValueObject { + + @Mapping(boMapping=ReferredStringPersistentObjectMapper.class, + rpcMapping=DefaultStringParameterMapMapper.class, + boMappingPath="customer.name") + @ReadWrite(ReadWritePolicy.WRITEONCE) + @Required(true) + @Search(SearchPolicy.EQUALS) + private String customer; + + @ReadWrite(ReadWritePolicy.WRITEONCE) + @Required(true) + @Search(SearchPolicy.EQUALS) + private String action; + + @ReadWrite(ReadWritePolicy.WRITEONCE) + @Required(true) + @Search(SearchPolicy.COMPARE) + private Date date; + + @ReadWrite(ReadWritePolicy.WRITEONCE) + @Required(true) + @Search(SearchPolicy.COMPARE) + private Integer quantity; + + @ReadWrite(ReadWritePolicy.WRITEONCE) + @Required(true) + @Search(SearchPolicy.LIKE) + private String comment; + + public MemberShareVO() throws TechnicalException { + super(); + } + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } +} diff --git a/cust-services/src/test/java/de/hsadmin/service/customer/MemberShareVOTest.java b/cust-services/src/test/java/de/hsadmin/service/customer/MemberShareVOTest.java new file mode 100644 index 0000000..af6b3bd --- /dev/null +++ b/cust-services/src/test/java/de/hsadmin/service/customer/MemberShareVOTest.java @@ -0,0 +1,146 @@ +package de.hsadmin.service.customer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import static junitparams.JUnitParamsRunner.$; + +import org.joda.time.LocalDate; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; + + +import de.hsadmin.common.error.TechnicalException; +import de.hsadmin.common.error.UserException; +import de.hsadmin.module.impl.ValidationDelegate; +import de.hsadmin.module.property.Property; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; + +@RunWith(JUnitParamsRunner.class) +public class MemberShareVOTest { + + private static final String INITIAL_COMMENT = "initial comment"; + + private static final LocalDate INITIAL_DATE = new LocalDate(1996, 12, 26); + + private static final String INITIAL_ACTION = "SUBSCRIPTION"; + + private static final String INITIAL_CUSTOMER = "initCust"; + + private static final int INITIAL_QUANTITY = 4; + + private final ValidationDelegate validator = new ValidationDelegate(); + + @Rule + public final ExpectedException exception = ExpectedException.none(); + + // --- tests --- + + @Test + @Parameters(method = "properties") + public void propertyIsRequired(final String propertyName) throws UserException, TechnicalException { + MemberShareVO initializedMemberShareVO = givenInitializedMemberShareVO(); + initializedMemberShareVO.get(propertyName).setValue(null); + assertInitialPropertyValueIsNull(initializedMemberShareVO, propertyName); + assertPrototypeIsNotCreateable(initializedMemberShareVO, "MSG_REQUIRED_FIELD: " + propertyName); + } + public static Object[] properties() { + return $( + // nur die Properties auffuehren, die 'required' sind + "customer", + "action", + "date", + "quantity", + "comment" + ); + } + + @Test + @Parameters(method = "propertiesWithInitialValues") + public void propertyIsCreatable(final String propertyName, final Object initialValue) throws UserException, TechnicalException { + MemberShareVO initializedMemberShareVO = givenInitializedMemberShareVO(); + assertInitialPropertyValue(initializedMemberShareVO, propertyName, initialValue); + assertPrototypeIsCreateable(initializedMemberShareVO); + } + public static Object[] propertiesWithInitialValues() { + return $( + // nur die Properties auffuehren, die 'creatable' sind + $("customer", INITIAL_CUSTOMER), + $("action", INITIAL_ACTION), + $("date", INITIAL_DATE.toDate()), + $("quantity", + INITIAL_QUANTITY), + $("comment", INITIAL_COMMENT) + ); + } + + @Test + @Parameters(method = "propertiesWithChangedValues") + public void propertyIsNotUpdateable(final String propertyName, final Object changedValue) throws UserException, TechnicalException { + MemberShareVO initializedMemberShareVO = givenInitializedMemberShareVO(); + assertChangedPropertyValue(initializedMemberShareVO, propertyName, changedValue); + assertPrototypeIsNotUpdateable(initializedMemberShareVO, "MSG_NO_FIELD_WRITEACCESS: " + propertyName); + } + public static Object[] propertiesWithChangedValues() { + return $( + // nur die Properties auffuehren, die NICHT 'updateable' sind + $("customer", INITIAL_CUSTOMER + "Changed"), + $("action", "UN" + INITIAL_ACTION), + $("date", INITIAL_DATE.plusDays(1).toDate()), + $("quantity", + INITIAL_QUANTITY * 2), + $("comment", INITIAL_COMMENT + "Changed") + ); + } + + // === test fixture === + + private MemberShareVO givenInitializedMemberShareVO() throws TechnicalException, UserException { + MemberShareVO memberShareVO = new MemberShareVO(); + memberShareVO.setCustomer(INITIAL_CUSTOMER); + memberShareVO.setAction(INITIAL_ACTION); + memberShareVO.setDate( INITIAL_DATE.toDate() ); + memberShareVO.setQuantity(INITIAL_QUANTITY); + memberShareVO.setComment(INITIAL_COMMENT); + memberShareVO.initPropertyValues(); + return memberShareVO; + } + + private void assertInitialPropertyValueIsNull(final MemberShareVO memberShareVO, final String propertyName) throws UserException, TechnicalException { + assertNull(memberShareVO.get(propertyName).getValue()); + } + + private void assertInitialPropertyValue(final MemberShareVO memberShareVO, final String propertyName, final Object expectedValue) throws UserException, TechnicalException { + assertEquals(expectedValue, memberShareVO.get(propertyName).getValue()); + } + + private void assertChangedPropertyValue(final MemberShareVO memberShareVO, final String propertyName, final T changedValue) throws UserException, TechnicalException { + @SuppressWarnings("unchecked") + Property customerProp = (Property) memberShareVO.get(propertyName); + customerProp.setValue(changedValue); + assertEquals(changedValue, customerProp.getValue()); + } + + private void assertPrototypeIsCreateable(final MemberShareVO memberShareVO) throws UserException, TechnicalException { + validator.checkPrototypeIsCreateable(memberShareVO); + } + + private void assertPrototypeIsNotCreateable(final MemberShareVO someMemberShareVO, final String expectedMessage) throws UserException, TechnicalException { + exception.expect(UserException.class); + exception.expectMessage(expectedMessage); + validator.checkPrototypeIsCreateable(someMemberShareVO); + } + + private void assertPrototypeIsNotUpdateable(final MemberShareVO someMemberShareVO, final String expectedMessage) throws UserException, TechnicalException { + exception.expect(UserException.class); + exception.expectMessage(expectedMessage); + validator.checkPrototypeIsUpdateable(someMemberShareVO); + } + + public LocalDate asDate(String input) { + return LocalDate.parse(input); + } +} + +