1 package com.atlassian.plugins.rest.common.expand;
2
3 import com.atlassian.plugins.rest.common.expand.parameter.DefaultExpandParameter;
4 import com.atlassian.plugins.rest.common.expand.parameter.ExpandParameter;
5 import com.atlassian.plugins.rest.common.expand.resolver.EntityExpanderResolver;
6 import com.google.common.collect.Lists;
7 import com.google.common.collect.Sets;
8
9 import static org.hamcrest.Matchers.contains;
10 import static org.junit.Assert.*;
11
12 import org.junit.Before;
13 import org.junit.Test;
14
15 import javax.xml.bind.annotation.XmlAttribute;
16 import javax.xml.bind.annotation.XmlElement;
17 import java.lang.reflect.Field;
18 import java.util.Arrays;
19 import java.util.Collections;
20 import java.util.List;
21 import java.util.Set;
22
23
24
25
26 public class EntityCrawlerTest {
27 private EntityCrawler entityCrawler;
28
29 @Before
30 public void setUp() {
31 entityCrawler = new EntityCrawler(Collections.singleton(new SomeExpandsProvider()));
32 }
33
34 @Test
35 public void testGetExpandableWithNullField() {
36 assertNull(entityCrawler.getExpandable(null));
37 }
38
39 @Test
40 public void testGetExpandableWithNoExpandableAnnotation() throws Exception {
41 final Field field = SomeClass.class.getField("field1");
42 assertNull(entityCrawler.getExpandable(field));
43 }
44
45 @Test
46 public void testGetExpandableWithValuedExpandable() throws Exception {
47 final Field field = SomeClass.class.getField("field2");
48 assertEquals("field2Value", entityCrawler.getExpandable(field).value());
49 }
50
51 @Test
52 public void testGetExpandableWithNamedXmlElement() throws Exception {
53 final Field field = SomeClass.class.getField("field3");
54 assertEquals("field3Value", entityCrawler.getExpandable(field).value());
55 }
56
57 @Test
58 public void testGetExpandableWithUnNamedXmlElement() throws Exception {
59 final Field field = SomeClass.class.getField("field4");
60 assertEquals("field4", entityCrawler.getExpandable(field).value());
61 }
62
63 @Test
64 public void testGetExpandableWithNoXmlElement() throws Exception {
65 final Field field = SomeClass.class.getField("field5");
66 assertEquals("field5", entityCrawler.getExpandable(field).value());
67 }
68
69 @Test
70 public void testGetPossibleExpands() throws Exception {
71 SomeDerivedClass object = new SomeDerivedClass();
72 entityCrawler.crawl(object, new DefaultExpandParameter(Collections.emptyList()), null);
73 List<String> newExpands = Arrays.asList(object.expand.split(","));
74
75 assertThat(newExpands, contains("field2Value","field3Value","field4","field5","someAdditionalExpand"));
76 }
77
78 @Test
79 public void testCrawlGetsFieldsFromSuperClass() throws Exception {
80 final Set<String> expectedFields = Sets.newHashSet("field2Value", "field3Value", "field4", "field5");
81
82 entityCrawler.crawl(new SomeDerivedClass(), new DefaultExpandParameter(Lists.newArrayList("*")),
83 new EntityExpanderResolver() {
84 public boolean hasExpander(Class<?> type) {
85 return true;
86 }
87
88 public <T> EntityExpander<T> getExpander(Class<? extends T> type) {
89 return new EntityExpander<T>() {
90 public T expand(ExpandContext<T> tExpandContext, EntityExpanderResolver expanderResolver, EntityCrawler entityCrawler) {
91 assertTrue(expectedFields.remove(tExpandContext.getExpandable().value()));
92 return null;
93 }
94 };
95 }
96 });
97
98 assertTrue(expectedFields.isEmpty());
99 }
100
101 private static class SomeClass {
102 public Object field1 = new Object();
103
104 @Expandable("field2Value")
105 public Object field2 = new Object();
106
107 @Expandable
108 @XmlElement(name = "field3Value")
109 public Object field3 = new Object();
110
111 @Expandable
112 @XmlElement
113 public Object field4 = new Object();
114
115 @Expandable
116 public Object field5 = new Object();
117
118 @Expandable
119 public Object ignoredField;
120 }
121
122 private static class SomeDerivedClass extends SomeClass {
123 @XmlAttribute
124 private String expand;
125 }
126
127 private static class SomeExpandsProvider implements AdditionalExpandsProvider<SomeDerivedClass> {
128 @Override
129 public List<String> getAdditionalExpands(SomeDerivedClass entity) {
130 return Collections.singletonList("someAdditionalExpand");
131 }
132
133 @Override
134 public Class<SomeDerivedClass> getSupportedType() {
135 return SomeDerivedClass.class;
136 }
137 }
138 }