1 package com.atlassian.plugins.rest.doclet.generators.resourcedoc;
2
3 import com.atlassian.plugins.rest.doclet.generators.resourcedoc.resource.ExampleResource;
4 import com.atlassian.plugins.rest.doclet.generators.schema.RichClass;
5 import com.atlassian.plugins.rest.doclet.generators.schema.beans.artificial.ArrayBean;
6 import com.atlassian.plugins.rest.doclet.generators.schema.beans.artificial.SimpleBean;
7 import com.atlassian.plugins.rest.doclet.generators.schema.beans.artificial.SimpleListBean;
8 import org.junit.Test;
9
10 import java.lang.reflect.Method;
11 import java.util.Optional;
12
13 import static com.atlassian.plugins.rest.doclet.generators.resourcedoc.RestMethod.restMethod;
14 import static org.hamcrest.Matchers.contains;
15 import static org.hamcrest.Matchers.equalTo;
16 import static org.hamcrest.Matchers.hasSize;
17 import static org.junit.Assert.assertThat;
18
19 public class RestMethodTest {
20 private final Class<?> resourceClass = ExampleResource.class;
21 private final Method createSimple = method("createSimple", String.class, ArrayBean.class);
22 private final Method createSimpleWithAutoRequestType = method("createSimpleWithAutoRequestType", String.class, String.class, SimpleBean.class, String.class);
23 private final Method methodWithActualReturnType = method("methodWithActualReturnType");
24 private final Method methodWithResponseReturnType = method("methodWithResponseReturnType");
25 private final Method voidResponseTypeAnnotated = method("voidResponseTypeAnnotated");
26 private final Method voidActualReturnType = method("voidActualReturnType");
27
28 @Test
29 public void responseTypeFromAnnotationOverridesActualMethodReturnType() {
30 assertThat(restMethod(resourceClass, createSimple).responseTypesFor(200), contains(RichClass.of(ArrayBean.class)));
31 }
32
33 @Test
34 public void requestTypeFromAnnotationOverridesActualParameterFromMethodArgument() {
35 assertThat(restMethod(resourceClass, createSimple).getRequestType(), equalTo(Optional.of(RichClass.of(SimpleBean.class))));
36 }
37
38 @Test
39 public void responseTypeForSuccessCanBeTakenFromReturnType() {
40 assertThat(restMethod(resourceClass, methodWithActualReturnType).responseTypesFor(200), contains(RichClass.of(SimpleBean.class)));
41 }
42
43 @Test
44 public void responseTypeIsNotTakenFromReturnTypeIsResponse() {
45 assertThat(restMethod(resourceClass, methodWithResponseReturnType).responseTypesFor(200), hasSize(0));
46 }
47
48 @Test
49 public void requestTypeCanBeTakenFromParameters() {
50 assertThat(restMethod(resourceClass, createSimpleWithAutoRequestType).getRequestType(), equalTo(Optional.of(RichClass.of(SimpleBean.class))));
51 }
52
53 @Test
54 public void voidResourceDoesNotHaveAnyReturnType() {
55 assertThat(restMethod(resourceClass, voidResponseTypeAnnotated).responseTypesFor(200), hasSize(0));
56 assertThat(restMethod(resourceClass, voidActualReturnType).responseTypesFor(200), hasSize(0));
57 }
58
59 @Test
60 public void responseTypeForErrorsCanBeAnnotatedOnClass() {
61 assertThat(restMethod(resourceClass, createSimple).responseTypesFor(401), contains(RichClass.of(SimpleListBean.class)));
62 }
63
64 private Method method(String methodName, Class<?>... parameterTypes) {
65 try {
66 return resourceClass.getDeclaredMethod(methodName, parameterTypes);
67 } catch (NoSuchMethodException e) {
68 throw new RuntimeException(e);
69 }
70 }
71 }