1   package com.atlassian.plugins.codegen.annotations.asm;
2   
3   import java.util.List;
4   import java.util.Map;
5   
6   import com.atlassian.plugins.codegen.PluginModuleCreatorRegistryImpl;
7   import com.atlassian.plugins.codegen.annotations.DependencyDescriptor;
8   import com.atlassian.plugins.codegen.modules.PluginModuleCreator;
9   import com.atlassian.plugins.codegen.modules.PluginModuleCreatorRegistry;
10  
11  import org.junit.Before;
12  import org.junit.Test;
13  
14  import fake.annotation.parser.modules.InheritedValidJira;
15  import fake.annotation.parser.modules.JiraAndConfluenceCreator;
16  import fake.annotation.parser.modules.JiraAnnotatedWithoutInterface;
17  import fake.annotation.parser.modules.ValidJiraModuleCreator;
18  import fake.annotation.parser.modules.dependencies.ValidJiraWithDependencies;
19  import fake.annotation.parser.modules.dependencies.ValidJiraWithMissingNestedDependency;
20  import fake.annotation.parser.modules.dependencies.ValidJiraWithMissingScopeDependency;
21  import fake.annotation.parser.modules.nested.NestedValidJira;
22  
23  import static org.junit.Assert.assertNotNull;
24  import static org.junit.Assert.assertTrue;
25  
26  /**
27   * @since 3.6
28   */
29  public class AnnotationParserTest
30  {
31  
32      private static final String MODULES_PACKAGE = "fake.annotation.parser.modules";
33  
34      private PluginModuleCreatorRegistry registry;
35      private ModuleCreatorAnnotationParser parser;
36  
37      @Before
38      public void setup()
39      {
40          registry = new PluginModuleCreatorRegistryImpl();
41          parser = new ModuleCreatorAnnotationParser(registry);
42      }
43  
44      @Test
45      public void hasJiraModule() throws Exception
46      {
47  
48          parser.parse(MODULES_PACKAGE);
49  
50          Map<Class, PluginModuleCreator> modules = registry.getModuleCreatorsForProduct(PluginModuleCreatorRegistry.JIRA);
51          assertNotNull("module map is null", modules);
52          assertTrue("no testmodules registered", modules.size() > 0);
53          assertTrue("jira module not found", modules.containsKey(ValidJiraModuleCreator.class));
54      }
55  
56      @Test
57      public void annotatedWithoutInterfaceIsNotRegistered() throws Exception
58      {
59          parser.parse(MODULES_PACKAGE);
60  
61          Map<Class, PluginModuleCreator> modules = registry.getModuleCreatorsForProduct(PluginModuleCreatorRegistry.JIRA);
62          assertNotNull("module map is null", modules);
63          assertTrue("no testmodules registered", modules.size() > 0);
64          assertTrue("non-module found", !modules.containsKey(JiraAnnotatedWithoutInterface.class));
65      }
66  
67      @Test
68      public void nestedCreatorsAreRegistered() throws Exception
69      {
70          parser.parse(MODULES_PACKAGE);
71  
72          Map<Class, PluginModuleCreator> modules = registry.getModuleCreatorsForProduct(PluginModuleCreatorRegistry.JIRA);
73          assertNotNull("module map is null", modules);
74          assertTrue("no testmodules registered", modules.size() > 0);
75          assertTrue("nested jira module not found", modules.containsKey(NestedValidJira.class));
76      }
77  
78      @Test
79      public void inheritedCreatorsAreRegistered() throws Exception
80      {
81          parser.parse(MODULES_PACKAGE);
82  
83          Map<Class, PluginModuleCreator> modules = registry.getModuleCreatorsForProduct(PluginModuleCreatorRegistry.JIRA);
84          assertNotNull("module map is null", modules);
85          assertTrue("no testmodules registered", modules.size() > 0);
86          assertTrue("inherited jira module not found", modules.containsKey(InheritedValidJira.class));
87      }
88  
89      @Test
90      public void muiltipleProductsHaveSameCreator() throws Exception
91      {
92          parser.parse(MODULES_PACKAGE);
93  
94          Map<Class, PluginModuleCreator> jiraModules = registry.getModuleCreatorsForProduct(PluginModuleCreatorRegistry.JIRA);
95          Map<Class, PluginModuleCreator> confluenceModules = registry.getModuleCreatorsForProduct(PluginModuleCreatorRegistry.CONFLUENCE);
96  
97          assertTrue("jiraAndConfluence not found for jira", jiraModules.containsKey(JiraAndConfluenceCreator.class));
98          assertTrue("jiraAndConfluence not found for confluence", confluenceModules.containsKey(JiraAndConfluenceCreator.class));
99      }
100 
101     @Test
102     public void noDependenciesReturnsEmptyList() throws Exception
103     {
104         parser.parse(MODULES_PACKAGE);
105         List<DependencyDescriptor> dependencies = registry.getDependenciesForCreatorClass(ValidJiraModuleCreator.class);
106 
107         assertTrue("expected empty dependency list", dependencies.isEmpty());
108     }
109 
110     @Test
111     public void validDependenciesAreRegistered() throws Exception
112     {
113         parser.parse(MODULES_PACKAGE);
114 
115         DependencyDescriptor expectedServlet = new DependencyDescriptor();
116         expectedServlet.setGroupId("javax.servlet");
117         expectedServlet.setArtifactId("servlet-api");
118         expectedServlet.setVersion("2.4");
119         expectedServlet.setScope("provided");
120 
121         DependencyDescriptor expectedMockito = new DependencyDescriptor();
122         expectedMockito.setGroupId("org.mockito");
123         expectedMockito.setArtifactId("mockito-all");
124         expectedMockito.setVersion("1.8.5");
125         expectedMockito.setScope("test");
126 
127         List<DependencyDescriptor> dependencies = registry.getDependenciesForCreatorClass(ValidJiraWithDependencies.class);
128         assertTrue("dependency list is empty", !dependencies.isEmpty());
129         assertTrue("servlet-api dependency not found", dependencies.contains(expectedServlet));
130         assertTrue("mockito dependency not found", dependencies.contains(expectedMockito));
131     }
132 
133     @Test
134     public void validDependencyWithMissingScopeIsRegistered() throws Exception
135     {
136         parser.parse(MODULES_PACKAGE);
137 
138         DependencyDescriptor expectedServlet = new DependencyDescriptor();
139         expectedServlet.setGroupId("javax.servlet");
140         expectedServlet.setArtifactId("servlet-api");
141         expectedServlet.setVersion("2.4");
142 
143         List<DependencyDescriptor> dependencies = registry.getDependenciesForCreatorClass(ValidJiraWithMissingScopeDependency.class);
144         assertTrue("dependency list is empty", !dependencies.isEmpty());
145         assertTrue("servlet-api dependency not found", dependencies.contains(expectedServlet));
146     }
147 
148     @Test
149     public void depedenciesWithoutNestedAnnotationIsNotRegistered() throws Exception
150     {
151         parser.parse(MODULES_PACKAGE);
152         List<DependencyDescriptor> dependencies = registry.getDependenciesForCreatorClass(ValidJiraWithMissingNestedDependency.class);
153         assertTrue("dependency list is empty for missing nested annotation", dependencies.isEmpty());
154     }
155 }