package io.katharsis.resource.field; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.katharsis.resource.exception.ResourceException; import io.katharsis.resource.exception.init.InvalidResourceException; import io.katharsis.resource.mock.models.Task; import org.junit.Test; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.MapEntry.entry; public class ResourceAttributesBridgeTest { private ObjectMapper objectMapper = new ObjectMapper(); @Test public void onValidClassShouldInitializeResourceAttributesBridge() throws Exception { // WHEN new ResourceAttributesBridge<>(Collections.<ResourceField>emptySet(), DynamicResource.class); } @Test(expected = InvalidResourceException.class) public void onClassWithoutAnyGetterShouldThrowException() throws Exception { // WHEN new ResourceAttributesBridge<>(Collections.<ResourceField>emptySet(), ClassWithoutAnyGetter.class); } @Test(expected = InvalidResourceException.class) public void onClassWithoutAnySetterShouldThrowException() throws Exception { // WHEN new ResourceAttributesBridge<>(Collections.<ResourceField>emptySet(), ClassWithoutAnySetter.class); } @Test public void onSimpleAttributesShouldPutInstanceValues() throws Exception { // GIVEN ResourceField field = new ResourceField("name", "name", String.class, String.class); ResourceAttributesBridge<Task> sut = new ResourceAttributesBridge<>(Collections.singleton(field), Task.class); JsonNode attributes = objectMapper.createObjectNode() .put("name", "value"); Task task = new Task(); // WHEN sut.setProperties(objectMapper, task, attributes); // THEN assertThat(task.getName()).isEqualTo("value"); } @Test public void onDynamicAttributesShouldPutInstanceValues() throws Exception { // GIVEN ResourceAttributesBridge<DynamicResource> sut = new ResourceAttributesBridge<>(Collections.<ResourceField>emptySet(), DynamicResource.class); JsonNode attributes = objectMapper.createObjectNode() .put("name", "value"); DynamicResource resource = new DynamicResource(); // WHEN sut.setProperties(objectMapper, resource, attributes); // THEN assertThat(resource.anyGetter()) .containsOnly(entry("name", "value")); } @Test(expected = ResourceException.class) public void onDynamicAttributesReadingShouldThrowException() throws Exception { // GIVEN ResourceAttributesBridge<DynamicResourceWithSetterException> sut = new ResourceAttributesBridge<>(Collections.<ResourceField>emptySet(), DynamicResourceWithSetterException.class); JsonNode attributes = objectMapper.createObjectNode() .put("name", "value"); // WHEN sut.setProperties(objectMapper, new DynamicResourceWithSetterException(), attributes); } @Test(expected = ResourceException.class) public void onDynamicAttributesWritingShouldThrowException() throws Exception { // GIVEN ResourceAttributesBridge<DynamicResourceWithGetterException> sut = new ResourceAttributesBridge<>(Collections.<ResourceField>emptySet(), DynamicResourceWithGetterException.class); JsonNode attributes = objectMapper.createObjectNode() .put("name", "value"); // WHEN sut.setProperties(objectMapper, new DynamicResourceWithGetterException(), attributes); } public static class DynamicResource { private Map<String, Object> values = new HashMap<>(1); @JsonAnyGetter public Map<String, Object> anyGetter() { return values; } @JsonAnySetter public void anySetter(String name, Object value) { values.put(name, value); } } public static class DynamicResourceWithSetterException { @JsonAnyGetter public Map<String, Object> anyGetter() { return Collections.emptyMap(); } @JsonAnySetter public void anySetter(String name, Object value) { throw new IllegalStateException(); } } public static class DynamicResourceWithGetterException { @JsonAnyGetter public Map<String, Object> anyGetter() { throw new IllegalStateException(); } @JsonAnySetter public void anySetter(String name, Object value) { } } private static class ClassWithoutAnyGetter { @JsonAnySetter public void anySetter(String name, Object value) { } } private static class ClassWithoutAnySetter { @JsonAnyGetter public Map<String, Object> anyGetter() { return Collections.emptyMap(); } } }