package io.katharsis.utils; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import io.katharsis.resource.annotations.JsonApiResource; import io.katharsis.resource.exception.ResourceException; import io.katharsis.utils.java.Optional; import org.junit.Test; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class ClassUtilsTest { @Test public void onClassInheritanceShouldReturnInheritedClasses() throws Exception { // WHEN List<Field> result = ClassUtils.getClassFields(ChildClass.class); // THEN assertThat(result).hasSize(2); } @Test public void onClassInheritanceShouldReturnInheritedField() throws Exception { // WHEN Field result = ClassUtils.findClassField(ChildClass.class, "parentField"); // THEN assertThat(result).isNotNull(); assertThat(result.getName()).isEqualTo("parentField"); assertThat(result.getDeclaringClass()).isEqualTo(ParentClass.class); } @Test public void onGetGettersShouldReturnMethodsStartingWithGet() throws Exception { // WHEN List<Method> result = ClassUtils.getClassGetters(ParentClass.class); // THEN assertThat(result).doesNotContain(ParentClass.class.getDeclaredMethod("aetParentField")); } @Test public void onGetGettersShouldReturnMethodsThatNotTakeParams() throws Exception { // WHEN List<Method> result = ClassUtils.getClassGetters(ParentClass.class); // THEN assertThat(result).doesNotContain(ParentClass.class.getDeclaredMethod("getParentFieldWithParameter", String.class)); } @Test public void onGetGettersShouldReturnMethodsThatReturnValue() throws Exception { // WHEN List<Method> result = ClassUtils.getClassGetters(ParentClass.class); // THEN assertThat(result).doesNotContain(ParentClass.class.getDeclaredMethod("getParentFieldReturningVoid")); } @Test public void onGetGettersShouldReturnBooleanGettersThatHaveName() throws Exception { // WHEN List<Method> result = ClassUtils.getClassGetters(ParentClass.class); // THEN assertThat(result).doesNotContain(ParentClass.class.getDeclaredMethod("is")); } @Test public void onGetGettersShouldReturnNonBooleanGettersThatHaveName() throws Exception { // WHEN List<Method> result = ClassUtils.getClassGetters(ParentClass.class); // THEN assertThat(result).doesNotContain(ParentClass.class.getDeclaredMethod("get")); } @Test public void onClassInheritanceShouldReturnInheritedGetters() throws Exception { // WHEN List<Method> result = ClassUtils.getClassGetters(ChildClass.class); // THEN assertThat(result).hasSize(4); } @Test public void onGetSettersShouldReturnMethodsThatSetValue() throws Exception { // WHEN List<Method> result = ClassUtils.getClassSetters(ParentClass.class); // THEN assertThat(result).containsOnly(ParentClass.class.getDeclaredMethod("setValue", String.class)); } @Test public void onClassInheritanceShouldReturnInheritedSetters() throws Exception { // WHEN List<Method> result = ClassUtils.getClassSetters(ChildClass.class); // THEN assertThat(result).hasSize(1); } @Test public void onGetJsonApiResourceClassReturnCorrectClass() { // WHEN Class<? super ResourceClass$Proxy> clazz = ClassUtils.getJsonApiResourceClass(ResourceClass$Proxy.class); // THEN assertThat(clazz).isNotNull(); assertThat(clazz).hasAnnotation(JsonApiResource.class); assertThat(clazz).isEqualTo(ResourceClass.class); } @Test public void onGetJsonApiResourceClassReturnCorrectInstanceClass() { ResourceClass$Proxy resource = new ResourceClass$Proxy(); // WHEN Class<? super ResourceClass$Proxy> clazz = ClassUtils.getJsonApiResourceClass(resource); // THEN assertThat(clazz).isEqualTo(ResourceClass.class); } @Test public void onGetJsonApiResourceClassReturnNoInstanceClass() { ParentClass resource = new ParentClass(); // WHEN Class<? super ParentClass> clazz = ClassUtils.getJsonApiResourceClass(resource); // THEN assertThat(clazz).isNull(); } @Test public void onGetAnnotationShouldReturnAnnotation() { // WHEN Optional<JsonApiResource> result = ClassUtils.getAnnotation(ResourceClass.class, JsonApiResource.class); // THEN assertThat(result.get()).isInstanceOf(JsonApiResource.class); } @Test public void onGetAnnotationShouldReturnParentAnnotation() { // WHEN Optional<JsonPropertyOrder> result = ClassUtils.getAnnotation(ChildClass.class, JsonPropertyOrder.class); // THEN assertThat(result.get()).isInstanceOf(JsonPropertyOrder.class); } @Test public void onNonExistingAnnotationShouldReturnEmptyResult() { // WHEN Optional<JsonIgnore> result = ClassUtils.getAnnotation(ResourceClass.class, JsonIgnore.class); // THEN assertThat(result.isPresent()).isFalse(); } @Test public void onValidClassShouldCreateNewInstance() throws Exception { // WHEN ResourceClass result = ClassUtils.newInstance(ResourceClass.class); // THEN assertThat(result).isInstanceOf(ResourceClass.class); } @Test(expected = IllegalStateException.class) public void onClassWithCrushingConstructorShouldThrowException() throws Exception { // WHEN ClassUtils.newInstance(ClassWithCrashingConstructor.class); } @Test(expected = ResourceException.class) public void onClassWithoutDefaultConstructorShouldThrowException() throws Exception { // WHEN ClassUtils.newInstance(ClassWithoutDefaultConstructor.class); } @JsonPropertyOrder(alphabetic = true) public static class ParentClass { private String parentField; public String getParentField() { return parentField; } public String aetParentField() { return parentField; } public String getParentFieldWithParameter(String parameter) { return parentField; } public void getParentFieldReturningVoid() { } public void setValue(String value) { } public void setValueWithoutParameter() { } public boolean isPrimitiveBooleanProperty() { return true; } public Boolean isBooleanProperty() { return true; } public boolean is() { return true; } public String get() { return "value"; } public void set(String value) { } } public static class ChildClass extends ParentClass { private String childField; public String getChildField() { return childField; } } @JsonApiResource(type = "resource") public static class ResourceClass { } public static class ClassWithCrashingConstructor { public ClassWithCrashingConstructor() { throw new IllegalStateException(); } } public static class ClassWithoutDefaultConstructor { public ClassWithoutDefaultConstructor(String value) { } } public static class ResourceClass$Proxy extends ResourceClass{ } }