package io.katharsis.resource.field;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import static org.assertj.core.api.Assertions.assertThat;
public class ResourceFieldNameTransformerTest {
private ObjectMapper objectMapper;
private ResourceFieldNameTransformer sut;
@Before
public void setUp() throws Exception {
objectMapper = new ObjectMapper();
sut = new ResourceFieldNameTransformer(objectMapper.getSerializationConfig());
}
@Test
public void onFieldWithoutJsonPropertyShouldReturnBaseName() throws Exception {
// GIVEN
Field field = TestClass.class.getDeclaredField("field");
// WHEN
String name = sut.getName(field);
// THEN
assertThat(name).isEqualTo("field");
}
@Test
public void onFieldWithJsonPropertyShouldReturnCustomName() throws Exception {
// GIVEN
Field field = TestClass.class.getDeclaredField("fieldWithJsonProperty");
// WHEN
String name = sut.getName(field);
// THEN
assertThat(name).isEqualTo("customName");
}
@Test
public void onFieldWithDefaultJsonPropertyShouldReturnBaseName() throws Exception {
// GIVEN
Field field = TestClass.class.getDeclaredField("fieldWithDefaultJsonProperty");
// WHEN
String name = sut.getName(field);
// THEN
assertThat(name).isEqualTo("fieldWithDefaultJsonProperty");
}
@Test
public void onWrappedBooleanFieldShouldReturnFieldNameBasedOnGetter() throws Exception {
// GIVEN
Method method = TestClass.class.getDeclaredMethod("getAccessorField");
// WHEN
String name = sut.getName(method);
// THEN
assertThat(name).isEqualTo("accessorField");
}
@Test
public void onWrappedFieldShouldReturnFieldNameBasedOnGetter() throws Exception {
// GIVEN
Method method = TestClass.class.getDeclaredMethod("isBooleanProperty");
// WHEN
String name = sut.getName(method);
// THEN
assertThat(name).isEqualTo("booleanProperty");
}
@Test
public void onAnnotatedWrappedFieldShouldReturnFieldNameBasedOnAnnotation() throws Exception {
// GIVEN
Method method = TestClass.class.getDeclaredMethod("getAccessorFieldWithAnnotation");
// WHEN
String name = sut.getName(method);
// THEN
assertThat(name).isEqualTo("wrappedCustomName");
}
@Test
public void onNoSerializationConfigShouldSerializeField() throws Exception {
// GIVEN
sut = new ResourceFieldNameTransformer();
Field field = TestClass.class.getDeclaredField("namingStrategyTest");
// WHEN
String name = sut.getName(field);
// THEN
assertThat(name).isEqualTo("namingStrategyTest");
}
@Test
public void onNoSerializationConfigShouldSerializeMethod() throws Exception {
// GIVEN
sut = new ResourceFieldNameTransformer();
Method method = TestClass.class.getDeclaredMethod("getAccessorField");
// WHEN
String name = sut.getName(method);
// THEN
assertThat(name).isEqualTo("accessorField");
}
@Test
public void onMethodNameWithNamingStrategyShouldReturnModifiedName() throws Exception {
// GIVEN
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
sut = new ResourceFieldNameTransformer(objectMapper.getSerializationConfig());
Method method = TestClass.class.getDeclaredMethod("getAccessorField");
// WHEN
String name = sut.getName(method);
// THEN
assertThat(name).isEqualTo("accessor_field");
}
@Test
public void onFieldNameWithNamingStrategyShouldReturnModifiedName() throws Exception {
// GIVEN
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
sut = new ResourceFieldNameTransformer(objectMapper.getSerializationConfig());
Field field = TestClass.class.getDeclaredField("namingStrategyTest");
// WHEN
String name = sut.getName(field);
// THEN
assertThat(name).isEqualTo("naming_strategy_test");
}
private static class TestClass {
private String field;
private String namingStrategyTest;
public String getAccessorField() {
return null;
}
@JsonProperty("wrappedCustomName")
public String getAccessorFieldWithAnnotation() {
return null;
}
@JsonProperty("customName")
private String fieldWithJsonProperty;
@JsonProperty
private String fieldWithDefaultJsonProperty;
private boolean isBooleanProperty() {
return false;
}
}
}