diff --git a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java index 9c5dd831..7e3b8286 100644 --- a/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/mapping/MappingCouchbaseConverterTests.java @@ -20,13 +20,18 @@ import org.joda.time.LocalDateTime; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; import org.springframework.data.annotation.Id; import org.springframework.data.couchbase.TestApplicationConfig; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.mapping.model.MappingException; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.data.couchbase.core.convert.CustomConversions; +import org.springframework.data.convert.ReadingConverter; +import org.springframework.data.convert.WritingConverter; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -372,6 +377,94 @@ public class MappingCouchbaseConverterTests { readConverted.listOfEmails.get(0).emailAddr); } + @Test + public void writesAndReadsCustomConvertedClass() { + List converters = new ArrayList(); + converters.add(BigDecimalToStringConverter.INSTANCE); + converters.add(StringToBigDecimalConverter.INSTANCE); + converter.setCustomConversions(new CustomConversions(converters)); + converter.afterPropertiesSet(); + + CouchbaseDocument converted = new CouchbaseDocument(); + + final String valueStr = "12.345"; + final BigDecimal value = new BigDecimal(valueStr); + final String value2Str = "0.6789"; + final BigDecimal value2 = new BigDecimal(value2Str); + List listOfValues = new ArrayList(); + listOfValues.add(value); + listOfValues.add(value2); + Map mapOfValues = new HashMap(); + mapOfValues.put("val1", value); + mapOfValues.put("val2", value2); + + CustomEntity entity = new CustomEntity(value, listOfValues, mapOfValues); + converter.write(entity, converted); + + CouchbaseDocument source = new CouchbaseDocument(); + source.put("_class", CustomEntity.class.getName()); + source.put("value", valueStr); + CouchbaseList listOfValuesDoc = new CouchbaseList(); + listOfValuesDoc.put(valueStr); + listOfValuesDoc.put(value2Str); + source.put("listOfValues", listOfValuesDoc); + CouchbaseDocument mapOfValuesDoc = new CouchbaseDocument(); + mapOfValuesDoc.put("val1", valueStr); + mapOfValuesDoc.put("val2", value2Str); + source.put("mapOfValues", mapOfValuesDoc); + assertEquals(source.export().toString(), converted.export().toString()); + + CustomEntity readConverted = converter.read(CustomEntity.class, source); + assertEquals(value, readConverted.value); + assertEquals(listOfValues.get(0), readConverted.listOfValues.get(0)); + assertEquals(listOfValues.get(1), readConverted.listOfValues.get(1)); + assertEquals(mapOfValues.get("val1"), readConverted.mapOfValues.get("val1")); + assertEquals(mapOfValues.get("val2"), readConverted.mapOfValues.get("val2")); + } + + @Test + public void writesAndReadsClassContainingCustomConvertedObjects() { + List converters = new ArrayList(); + converters.add(BigDecimalToStringConverter.INSTANCE); + converters.add(StringToBigDecimalConverter.INSTANCE); + converter.setCustomConversions(new CustomConversions(converters)); + converter.afterPropertiesSet(); + + CouchbaseDocument converted = new CouchbaseDocument(); + + final String weightStr = "12.34"; + final BigDecimal weight = new BigDecimal(weightStr); + final CustomObject addy = new CustomObject(weight); + List listOfObjects = new ArrayList(); + listOfObjects.add(addy); + Map mapOfObjects = new HashMap(); + mapOfObjects.put("obj0", addy); + mapOfObjects.put("obj1", addy); + + CustomObjectEntity entity = new CustomObjectEntity(addy, listOfObjects, mapOfObjects); + converter.write(entity, converted); + + CouchbaseDocument source = new CouchbaseDocument(); + source.put("_class", CustomObjectEntity.class.getName()); + CouchbaseDocument objectDoc = new CouchbaseDocument(); + objectDoc.put("weight", weightStr); + source.put("object", objectDoc); + CouchbaseList listOfObjectsDoc = new CouchbaseList(); + listOfObjectsDoc.put(objectDoc); + source.put("listOfObjects", listOfObjectsDoc); + CouchbaseDocument mapOfObjectsDoc = new CouchbaseDocument(); + mapOfObjectsDoc.put("obj0", objectDoc); + mapOfObjectsDoc.put("obj1", objectDoc); + source.put("mapOfObjects", mapOfObjectsDoc); + assertEquals(source.export().toString(), converted.export().toString()); + + CustomObjectEntity readConverted = converter.read(CustomObjectEntity.class, source); + assertEquals(addy.weight, readConverted.object.weight); + assertEquals(listOfObjects.get(0).weight, readConverted.listOfObjects.get(0).weight); + assertEquals(mapOfObjects.get("obj0").weight, readConverted.mapOfObjects.get("obj0").weight); + assertEquals(mapOfObjects.get("obj1").weight, readConverted.mapOfObjects.get("obj1").weight); + } + @Test public void writesAndReadsDates() { Date created = new Date(); @@ -496,6 +589,57 @@ public class MappingCouchbaseConverterTests { } } + static class CustomEntity extends BaseEntity { + private BigDecimal value; + private List listOfValues; + private Map mapOfValues; + + public CustomEntity(BigDecimal value, List listOfValues, Map mapOfValues) { + this.value = value; + this.listOfValues = listOfValues; + this.mapOfValues = mapOfValues; + } + } + + static class CustomObjectEntity extends BaseEntity { + private CustomObject object; + private List listOfObjects; + private Map mapOfObjects; + + public CustomObjectEntity(CustomObject object, List listOfObjects, Map mapOfObjects) { + this.object = object; + this.listOfObjects = listOfObjects; + this.mapOfObjects = mapOfObjects; + } + } + + static class CustomObject { + private BigDecimal weight; + public CustomObject(BigDecimal weight) { + this.weight = weight; + } + } + + @WritingConverter + public static enum BigDecimalToStringConverter implements Converter { + INSTANCE; + + @Override + public String convert(BigDecimal source) { + return source.toPlainString(); + } + } + + @ReadingConverter + public static enum StringToBigDecimalConverter implements Converter { + INSTANCE; + + @Override + public BigDecimal convert(String source) { + return new BigDecimal(source); + } + } + static class DateEntity extends BaseEntity { private Date created; private Calendar modified;