package org.constretto.internal.store; import org.constretto.ConstrettoBuilder; import org.constretto.ConstrettoConfiguration; import org.constretto.GenericConverter; import org.constretto.exception.ConstrettoConversionException; import org.constretto.model.CObject; import org.constretto.model.CPrimitive; import org.constretto.model.CValue; import org.constretto.model.Resource; import org.junit.Test; import java.util.Map; import static org.constretto.internal.converter.ValueConverterRegistry.convertPrimitive; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; public class JsonStoreTest { @Test public void jsonShouldParseCorrectly() { ConstrettoConfiguration conf = new ConstrettoBuilder() .createJsonConfigurationStore() .addResource(Resource.create("classpath:jsonTest.json"), "person") .done() .getConfiguration(); Person person = conf.evaluateWith(new PersonJsonConverter(), "person"); assertEquals(new Person("Kaare", 29), person); } @Test public void jsonShouldAllowNonExistingResources() { ConstrettoConfiguration conf = new ConstrettoBuilder() .createJsonConfigurationStore() .addResource(Resource.create("classpath:nonExisiting.json"), "person") .addResource(Resource.create("file:/nonExisiting.json"), "person") .addResource(Resource.create("http:/nonExisiting.com"), "person") .done() .getConfiguration(); assertFalse(conf.hasValue("person")); } private class PersonJsonConverter implements GenericConverter<Person> { public Person fromValue(CValue value) throws ConstrettoConversionException { if (value instanceof CObject) { Map<String, CValue> data = ((CObject) value).data(); String name = convertPrimitive(String.class, (CPrimitive) data.get("name")); Integer age = convertPrimitive(Integer.class, (CPrimitive) data.get("age")); return new Person(name, age); } else { throw new ConstrettoConversionException(value.toString(), Person.class, "Exptected Json Object but found: " + value.getClass().getSimpleName()); } } } private class Person { public final String name; public final Integer age; private Person(String name, Integer age) { this.age = age; this.name = name; } public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != null ? !age.equals(person.age) : person.age != null) return false; if (name != null ? !name.equals(person.name) : person.name != null) return false; return true; } public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (age != null ? age.hashCode() : 0); return result; } public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } }