package org.springframework.data.simpledb.core.entity; import static org.junit.Assert.*; import java.text.ParseException; import java.util.Map; import java.util.Set; import org.apache.commons.lang.builder.EqualsBuilder; import org.junit.Test; import org.springframework.data.annotation.Id; import org.springframework.data.simpledb.attributeutil.SimpleDBAttributeConverter; import org.springframework.data.simpledb.core.domain.SimpleDbSampleEntity; import org.springframework.data.simpledb.core.entity.EntityWrapperTest.AClass.BClass; import org.springframework.data.simpledb.core.entity.EntityWrapperTest.AClass.BClass.CClass; import org.springframework.data.simpledb.util.EntityInformationSupport; public class EntityWrapperTest { @Test public void generateId_should_populate_itemName_of_Item() { SimpleDbSampleEntity object = new SimpleDbSampleEntity(); EntityWrapper<SimpleDbSampleEntity, String> sdbEntity = new EntityWrapper<SimpleDbSampleEntity, String>(SimpleDbSampleEntity.entityInformation(), object); sdbEntity.generateIdIfNotSet(); assertNotNull(object.getItemName()); } @Test public void generateId_should_not_overwrite_existing_id() { SimpleDbSampleEntity object = new SimpleDbSampleEntity(); object.setItemName("gigi"); EntityWrapper<SimpleDbSampleEntity, String> sdbEntity = new EntityWrapper<SimpleDbSampleEntity, String>(SimpleDbSampleEntity.entityInformation(), object); sdbEntity.generateIdIfNotSet(); assertEquals("gigi", object.getItemName()); } @Test public void generateId_should_create_distinct_values() { SimpleDbSampleEntity object1 = new SimpleDbSampleEntity(); SimpleDbSampleEntity object2 = new SimpleDbSampleEntity(); EntityWrapper<SimpleDbSampleEntity, String> sdbEntity1 = new EntityWrapper<SimpleDbSampleEntity, String>(SimpleDbSampleEntity.entityInformation(), object1); sdbEntity1.generateIdIfNotSet(); EntityWrapper<SimpleDbSampleEntity, String> sdbEntity2 = new EntityWrapper<SimpleDbSampleEntity, String>(SimpleDbSampleEntity.entityInformation(), object2); sdbEntity2.generateIdIfNotSet(); assertNotEquals(object1.getItemName(), object2.getItemName()); } @Test public void test_getSerializedPrimitiveAttributes() throws ParseException { final SampleEntity entity = new SampleEntity(); entity.setIntField(11); entity.setLongField(123); entity.setShortField((short) -12); entity.setFloatField(-0.01f); entity.setDoubleField(1.2d); entity.setByteField((byte) 1); entity.setBooleanField(Boolean.TRUE); entity.setStringField("string"); entity.setDoubleWrapper(Double.valueOf("2323.32d")); EntityWrapper<SampleEntity, String> sdbEntity = new EntityWrapper<SampleEntity, String>( EntityInformationSupport.readEntityInformation(SampleEntity.class), entity); assertNotNull(sdbEntity); final Map<String, String> attributes = sdbEntity.serialize(); assertNotNull(attributes); /* test int field */ String intValues = attributes.get("intField"); assertNotNull(intValues); assertEquals(entity.getIntField(), ((Integer) SimpleDBAttributeConverter.decodeToFieldOfType(intValues, Integer.class)).intValue()); /* test long field */ String longValues = attributes.get("longField"); assertEquals(entity.getLongField(), ((Long) SimpleDBAttributeConverter.decodeToFieldOfType(longValues, Long.class)).longValue()); /* test short field */ String shortValues = attributes.get("shortField"); assertEquals(entity.getShortField(), ((Short) SimpleDBAttributeConverter.decodeToFieldOfType(shortValues, Short.class)).shortValue()); /* test float field */ String floatValues = attributes.get("floatField"); assertTrue(entity.getFloatField() == ((Float) SimpleDBAttributeConverter.decodeToFieldOfType(floatValues, Float.class)).floatValue()); /* test double field */ String doubleValues = attributes.get("doubleField"); assertTrue(entity.getDoubleField() == ((Double) SimpleDBAttributeConverter.decodeToFieldOfType(doubleValues, Double.class)).doubleValue()); /* test byte field */ String byteValues = attributes.get("byteField"); assertTrue(entity.getByteField() == ((Byte) SimpleDBAttributeConverter.decodeToFieldOfType(byteValues, Byte.class)).byteValue()); /* test boolean field */ String booleanValues = attributes.get("booleanField"); assertTrue(entity.getBooleanField() == ((Boolean) SimpleDBAttributeConverter.decodeToFieldOfType(booleanValues, Boolean.class)).booleanValue()); } /* ***************************** Test serializing nested domain entities ******************* */ @Test public void should_generate_attribute_keys_for_nested_domain_fields() { final AClass aDomain = new AClass(); { aDomain.nestedB = new BClass(); { aDomain.nestedB.floatField = 21f; aDomain.nestedB.nestedNestedC = new CClass(); { aDomain.nestedB.nestedNestedC.doubleField = 14d; } } } EntityWrapper<AClass, String> sdbEntity = new EntityWrapper<AClass, String>( EntityInformationSupport.readEntityInformation(AClass.class), aDomain); final Map<String, String> attributes = sdbEntity.serialize(); assertNotNull(attributes); assertEquals(3, attributes.size()); final Set<String> keySet = attributes.keySet(); assertTrue(keySet.contains("intField")); assertTrue(keySet.contains("nestedB.floatField")); assertTrue(keySet.contains("nestedB.nestedNestedC.doubleField")); } @Test public void should_build_entity_with_nested_domain_entities() { final AClass aDomain = new AClass(); { aDomain.intField = 13; aDomain.nestedB = new BClass(); { aDomain.nestedB.floatField = 21f; aDomain.nestedB.nestedNestedC = new CClass(); { aDomain.nestedB.nestedNestedC.doubleField = 14d; } } } EntityWrapper<AClass, String> sdbEntity = new EntityWrapper<AClass, String>( EntityInformationSupport.readEntityInformation(AClass.class), aDomain); final Map<String, String> attributes = sdbEntity.serialize(); /* convert back */ final EntityWrapper<AClass, String> convertedEntity = new EntityWrapper<AClass, String>( EntityInformationSupport.readEntityInformation(AClass.class)); convertedEntity.deserialize(attributes); assertTrue(aDomain.equals(convertedEntity.getItem())); } @SuppressWarnings("unused") public static class AClass { @Id private String id; private int intField; private BClass nestedB; private Long longField; public BClass getNestedB() { return nestedB; } public void setNestedB(BClass nestedB) { this.nestedB = nestedB; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getIntField() { return intField; } public void setIntField(int intField) { this.intField = intField; } private Long getLongField() { return longField; } public void setLongField(Long longField) { this.longField = longField; } public static class BClass { private float floatField; private CClass nestedNestedC; public CClass getNestedNestedC() { return nestedNestedC; } public void setNestedNestedC(CClass nestedNestedC) { this.nestedNestedC = nestedNestedC; } public float getFloatField() { return floatField; } public void setFloatField(float floatField) { this.floatField = floatField; } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } public static class CClass { private double doubleField; public double getDoubleField() { return doubleField; } public void setDoubleField(double doubleField) { this.doubleField = doubleField; } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } } } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } } public static class SampleEntity { private int intField; private float floatField; private double doubleField; private short shortField; private long longField; private byte byteField; private boolean booleanField; private String stringField; private Double doubleWrapper; public int getIntField() { return intField; } public void setIntField(int intField) { this.intField = intField; } public float getFloatField() { return floatField; } public void setFloatField(float floatField) { this.floatField = floatField; } public double getDoubleField() { return doubleField; } public void setDoubleField(double doubleField) { this.doubleField = doubleField; } public short getShortField() { return shortField; } public void setShortField(short shortField) { this.shortField = shortField; } public long getLongField() { return longField; } public void setLongField(long longField) { this.longField = longField; } public byte getByteField() { return byteField; } public void setByteField(byte byteField) { this.byteField = byteField; } public boolean getBooleanField() { return booleanField; } public void setBooleanField(boolean booleanField) { this.booleanField = booleanField; } public String getStringField() { return stringField; } public void setStringField(String stringField) { this.stringField = stringField; } public Double getDoubleWrapper() { return doubleWrapper; } public void setDoubleWrapper(Double doubleWrapper) { this.doubleWrapper = doubleWrapper; } } }