View Javadoc
1   package com.atlassian.plugin.metadata;
2   
3   import com.atlassian.plugin.MockModuleDescriptor;
4   import com.atlassian.plugin.ModuleDescriptor;
5   import com.atlassian.plugin.Plugin;
6   import com.atlassian.plugin.descriptors.CannotDisable;
7   import org.junit.Test;
8   
9   import static org.junit.Assert.assertFalse;
10  import static org.junit.Assert.assertTrue;
11  
12  public class TestDefaultPluginMetadataManager {
13  
14      @Test
15      public void testIsUserInstalledPlugin() {
16          final Plugin plugin = new MockPlugin("my.plugin");
17          assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(plugin));
18      }
19  
20      @Test
21      public void testIsNotUserInstalledPluginIfApplicationSupplied() {
22          final Plugin plugin = new MockPlugin("my.plugin");
23          assertFalse(new DefaultPluginMetadataManager(new ApplicationPluginMetadata()).isUserInstalled(plugin));
24      }
25  
26      @Test
27      public void testPluginIsNotUserInstalledBecauseItIsBundled() {
28          final Plugin plugin = new MockBundledPlugin("my.plugin");
29          assertFalse(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(plugin));
30      }
31  
32      @Test
33      public void testPluginIsRequired() {
34          final Plugin plugin = new MockPlugin("my.plugin");
35          assertFalse(new DefaultPluginMetadataManager(new RequiredPluginMetadata()).isOptional(plugin));
36      }
37  
38      @Test
39      public void testPluginIsOptional() {
40          final Plugin plugin = new MockPlugin("my.plugin");
41          assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(plugin));
42      }
43  
44      @Test
45      public void testPluginWithModulesIsOptional() {
46          final Plugin plugin = new MockPlugin("my.plugin");
47          final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
48          plugin.addModuleDescriptor(moduleDescriptor);
49          assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(plugin));
50      }
51  
52      @Test
53      public void testPluginIsRequiredBecauseOfRequiredModule() {
54          final Plugin plugin = new MockPlugin("my.plugin");
55          final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
56          plugin.addModuleDescriptor(moduleDescriptor);
57          assertFalse(new DefaultPluginMetadataManager(new ModuleRequiredPluginMetadata()).isOptional(plugin));
58      }
59  
60      @Test
61      public void testModuleIsRequired() {
62          final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(null, "my.plugin.c-mod3", null);
63          assertFalse(new DefaultPluginMetadataManager(new ModuleRequiredPluginMetadata()).isOptional(moduleDescriptor));
64      }
65  
66      @Test
67      public void testModuleIsRequiredBecauseParentPluginIsRequired() {
68          final Plugin plugin = new MockPlugin("my.plugin");
69          final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
70          plugin.addModuleDescriptor(moduleDescriptor);
71          assertFalse(new DefaultPluginMetadataManager(new RequiredPluginMetadata()).isOptional(moduleDescriptor));
72      }
73  
74      @Test
75      public void testModuleIsNotMadeRequiredBecauseSiblingModuleIsRequired() {
76          final Plugin plugin = new MockPlugin("my.plugin");
77          final MockModuleDescriptor<Object> required = new MockModuleDescriptor<>(plugin, "required", null);
78          plugin.addModuleDescriptor(required);
79          final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "not-required", null);
80          plugin.addModuleDescriptor(moduleDescriptor);
81          assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata() {
82              @Override
83              public boolean required(final ModuleDescriptor<?> descriptor) {
84                  return descriptor == required;
85              }
86          }).isOptional(moduleDescriptor));
87      }
88  
89      @Test
90      public void testModuleIsRequiredTypeMarkedByAnnotation() {
91          final Plugin plugin = new MockPlugin("my.plugin");
92          // Looked a bit, do not think mockito can create a mock such that it has a class-level annotation
93          final ModuleDescriptor<?> moduleDescriptor = new CannotDisableModuleDescriptorType(plugin, "my.plugin.c-mod3");
94  
95          assertFalse(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(moduleDescriptor));
96      }
97  
98      @Test
99      public void testModuleIsOptional() {
100         final Plugin plugin = new MockPlugin("my.plugin");
101         final ModuleDescriptor<?> moduleDescriptor = new MockModuleDescriptor<>(plugin, "my.plugin.c-mod3", null);
102         plugin.addModuleDescriptor(moduleDescriptor);
103         assertTrue(new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional(moduleDescriptor));
104     }
105 
106     @Test(expected = NullPointerException.class)
107     public void testIsOptionalPluginNullPlugin() {
108         new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional((Plugin) null);
109     }
110 
111     @Test(expected = NullPointerException.class)
112     public void testIsOptionalModuleNullModule() {
113         new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isOptional((ModuleDescriptor<?>) null);
114     }
115 
116     @Test(expected = NullPointerException.class)
117     public void testIsUserInstalledPluginNullPlugin() {
118         new DefaultPluginMetadataManager(new EmptyPluginMetadata()).isUserInstalled(null);
119     }
120 
121     class MockPlugin extends com.atlassian.plugin.MockPlugin {
122         MockPlugin(final String key) {
123             super(key, TestDefaultPluginMetadataManager.this.getClass().getClassLoader());
124         }
125     }
126 
127     class MockBundledPlugin extends MockPlugin {
128         MockBundledPlugin(final String key) {
129             super(key);
130         }
131 
132         @Override
133         public boolean isBundledPlugin() {
134             return true;
135         }
136     }
137 
138     @CannotDisable
139     class CannotDisableModuleDescriptorType extends MockModuleDescriptor<Object> implements ModuleDescriptor<Object> {
140         CannotDisableModuleDescriptorType(final Plugin plugin, final String completeKey) {
141             super(plugin, completeKey, null);
142         }
143     }
144 
145     class EmptyPluginMetadata implements PluginMetadata {
146         public boolean applicationProvided(final Plugin plugin) {
147             return false;
148         }
149 
150         public boolean required(final Plugin plugin) {
151             return false;
152         }
153 
154         public boolean required(final ModuleDescriptor<?> descriptor) {
155             return false;
156         }
157     }
158 
159     class ApplicationPluginMetadata extends EmptyPluginMetadata {
160         @Override
161         public boolean applicationProvided(final Plugin plugin) {
162             return true;
163         }
164     }
165 
166     class RequiredPluginMetadata extends EmptyPluginMetadata {
167         @Override
168         public boolean required(final Plugin plugin) {
169             return true;
170         }
171     }
172 
173     class ModuleRequiredPluginMetadata extends EmptyPluginMetadata {
174         @Override
175         public boolean required(final ModuleDescriptor<?> descriptor) {
176             return true;
177         }
178     }
179 }