View Javadoc

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   * Testing {@link EntityCrawler}
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 }