1 package com.atlassian.plugins.rest.module.scope;
2
3
4 import com.atlassian.plugin.PluginAccessor;
5 import com.atlassian.plugin.event.PluginEventManager;
6 import com.atlassian.plugin.module.ModuleFactory;
7 import com.atlassian.plugin.osgi.factory.OsgiPlugin;
8 import com.atlassian.plugin.scope.ScopeManager;
9 import com.atlassian.plugins.rest.module.RestModuleDescriptor;
10 import com.atlassian.plugins.rest.module.servlet.RestServletModuleManager;
11 import com.google.common.collect.ImmutableList;
12 import com.google.common.collect.ImmutableSet;
13 import com.sun.jersey.api.core.DefaultResourceConfig;
14 import com.sun.jersey.api.model.AbstractMethod;
15 import com.sun.jersey.api.model.AbstractResource;
16 import com.sun.jersey.api.model.AbstractResourceMethod;
17 import com.sun.jersey.api.model.PathValue;
18 import com.sun.jersey.spi.container.ResourceFilter;
19 import org.dom4j.Element;
20 import org.hamcrest.CoreMatchers;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mock;
25 import org.mockito.runners.MockitoJUnitRunner;
26
27 import javax.ws.rs.HttpMethod;
28 import java.lang.annotation.Annotation;
29 import java.lang.reflect.Method;
30 import java.util.List;
31
32 import static org.junit.Assert.assertThat;
33 import static org.junit.Assert.assertTrue;
34 import static org.mockito.Mockito.when;
35
36 @RunWith(MockitoJUnitRunner.class)
37 public class ScopeResourceFilterFactoryTest {
38
39 @Mock
40 PluginAccessor pluginAccessor;
41
42 @Mock
43 PluginEventManager pluginEventManager;
44
45 @Mock
46 ScopeManager scopeManager;
47
48 @Mock
49 ModuleFactory moduleFactory;
50
51 @Mock
52 RestServletModuleManager restServletModuleManager;
53
54 @Mock
55 OsgiPlugin plugin;
56
57 @Mock
58 Element element;
59
60 static class MappedClass {
61 public void get() {
62 }
63
64 static Method getMethod() {
65 try {
66 return MappedClass.class.getMethod("get");
67 } catch (NoSuchMethodException e) {
68 throw new RuntimeException(e);
69 }
70 }
71 }
72
73 static class UnmappedClass {
74 }
75
76
77 final AbstractMethod httpMethod = new AbstractResourceMethod(
78 new AbstractResource(MappedClass.class, new PathValue("/")),
79 MappedClass.getMethod(),
80 Void.class,
81 Void.class,
82 HttpMethod.GET,
83 new Annotation[]{});
84
85 @Before
86 public void setUp() {
87 when(element.attributeValue("path")).thenReturn("/rest");
88 when(element.attributeValue("version")).thenReturn("1.0");
89 when(element.elements("package")).thenReturn(ImmutableList.of());
90 }
91
92 @Test
93 public void verifyEmptyFilterIfRestApiNotInitialized() throws Exception {
94 final RestModuleDescriptor descriptor = new RestModuleDescriptor(moduleFactory, restServletModuleManager, "/rest");
95 descriptor.init(plugin, element);
96
97 when(pluginAccessor.getEnabledModuleDescriptorsByClass(RestModuleDescriptor.class)).thenReturn(ImmutableList.of(descriptor));
98
99 final ScopeResourceFilterFactory factory = new ScopeResourceFilterFactory(pluginAccessor, pluginEventManager, scopeManager);
100
101 final List<ResourceFilter> filters = factory.create(httpMethod);
102
103 assertTrue(filters.isEmpty());
104 }
105
106 @Test
107 public void verifyEmptyFilterIfNoClassMatch() throws Exception {
108 final RestModuleDescriptor descriptor = new RestModuleDescriptor(moduleFactory, restServletModuleManager, "/rest");
109 when(pluginAccessor.getEnabledModuleDescriptorsByClass(RestModuleDescriptor.class)).thenReturn(ImmutableList.of(descriptor));
110 descriptor.init(plugin, element);
111
112 final DefaultResourceConfig config = new DefaultResourceConfig(ImmutableSet.of(UnmappedClass.class));
113
114 descriptor.getRestApiContext().setConfig(config);
115
116 final ScopeResourceFilterFactory factory = new ScopeResourceFilterFactory(pluginAccessor, pluginEventManager, scopeManager);
117
118 final List<ResourceFilter> filters = factory.create(httpMethod);
119
120 assertTrue(filters.isEmpty());
121 }
122
123 @Test
124 public void verifyNonEmptyFilterIfRestApiInitializedAndClassMatch() throws Exception {
125 final RestModuleDescriptor descriptor = new RestModuleDescriptor(moduleFactory, restServletModuleManager, "/rest");
126 when(pluginAccessor.getEnabledModuleDescriptorsByClass(RestModuleDescriptor.class)).thenReturn(ImmutableList.of(descriptor));
127 descriptor.init(plugin, element);
128
129 final DefaultResourceConfig config = new DefaultResourceConfig(ImmutableSet.of(MappedClass.class));
130
131 descriptor.getRestApiContext().setConfig(config);
132
133 final ScopeResourceFilterFactory factory = new ScopeResourceFilterFactory(pluginAccessor, pluginEventManager, scopeManager);
134
135 final List<ResourceFilter> filters = factory.create(httpMethod);
136
137 assertThat(filters, CoreMatchers.hasItems(CoreMatchers.instanceOf(ScopeResourceFilter.class)));
138 }
139 }