1 package com.atlassian.plugins.rest.common.security.jersey;
2
3 import java.lang.annotation.Annotation;
4 import java.util.List;
5
6 import com.atlassian.plugin.PluginAccessor;
7 import com.atlassian.plugin.event.PluginEventManager;
8 import com.atlassian.plugins.rest.common.security.CorsAllowed;
9 import com.atlassian.plugins.rest.common.security.jersey.test.ResourceClassWithCorsAllowed;
10 import com.atlassian.plugins.rest.common.security.jersey.test.ResourceClassWithoutCorsAllowed;
11
12 import com.sun.jersey.api.model.AbstractMethod;
13 import com.sun.jersey.api.model.AbstractResource;
14 import com.sun.jersey.spi.container.ResourceFilter;
15
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.Mock;
20 import org.mockito.runners.MockitoJUnitRunner;
21
22 import static org.hamcrest.Matchers.empty;
23 import static org.hamcrest.Matchers.instanceOf;
24 import static org.hamcrest.Matchers.is;
25 import static org.junit.Assert.assertThat;
26 import static org.mockito.Mockito.when;
27
28 @RunWith(MockitoJUnitRunner.class)
29 public class TestCorsResourceFilterFactory {
30 @Mock
31 private PluginEventManager pluginEventManager;
32
33 @Mock
34 private PluginAccessor pluginAccessor;
35
36 @Mock
37 private AbstractMethod jerseyMethod;
38
39 private CorsResourceFilterFactory corsResourceFilterFactory;
40
41 private static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];
42
43 @Before
44 public void setup() {
45 corsResourceFilterFactory = new CorsResourceFilterFactory(pluginAccessor, pluginEventManager);
46 }
47
48 @Test
49 public void testThatCorsAllowedIsDetectedOnMethod() {
50 when(jerseyMethod.isAnnotationPresent(CorsAllowed.class)).thenReturn(true);
51 when(jerseyMethod.getAnnotations()).thenReturn(EMPTY_ANNOTATIONS_ARRAY);
52
53 List<ResourceFilter> resourceFilters = corsResourceFilterFactory.create(jerseyMethod);
54
55 assertContainsASingleCorsResourceFilter(resourceFilters);
56 }
57
58 @Test
59 public void testThatCorsAllowedIsDetectedOnJerseyResource() {
60 when(jerseyMethod.getResource()).thenReturn(new AbstractResource(ResourceClassWithCorsAllowed.class));
61 when(jerseyMethod.getAnnotations()).thenReturn(EMPTY_ANNOTATIONS_ARRAY);
62
63 List<ResourceFilter> resourceFilters = corsResourceFilterFactory.create(jerseyMethod);
64
65 assertContainsASingleCorsResourceFilter(resourceFilters);
66 }
67
68 @Test
69 public void testThatCorsAllowedIsDetectedOnResourcePackage() throws ClassNotFoundException {
70 when(jerseyMethod.getResource()).thenReturn(new AbstractResource(ResourceClassWithoutCorsAllowed.class));
71 when(jerseyMethod.getAnnotations()).thenReturn(EMPTY_ANNOTATIONS_ARRAY);
72
73 List<ResourceFilter> resourceFilters = corsResourceFilterFactory.create(jerseyMethod);
74
75 assertContainsASingleCorsResourceFilter(resourceFilters);
76 }
77
78 @Test
79 public void testThatNoCorsAllowedAnnotationsResultsInEmptyFilters() throws ClassNotFoundException {
80 when(jerseyMethod.getResource()).thenReturn(new AbstractResource(this.getClass()));
81
82 List<ResourceFilter> resourceFilters = corsResourceFilterFactory.create(jerseyMethod);
83 assertThat(resourceFilters, is(empty()));
84 }
85
86 @Test
87 public void testThatResourceInDefaultPackageIsTolerated() throws ClassNotFoundException {
88 when(jerseyMethod.getResource()).thenReturn(new AbstractResource(Class.forName("ClassInDefaultPackageForTesting")));
89
90 List<ResourceFilter> resourceFilters = corsResourceFilterFactory.create(jerseyMethod);
91 assertThat(resourceFilters.size(), is(0));
92 }
93
94 private static void assertContainsASingleCorsResourceFilter(List<ResourceFilter> resourceFilters) {
95 assertThat(resourceFilters.size(), is(1));
96 assertThat(resourceFilters.get(0), is(instanceOf(CorsResourceFilter.class)));
97 }
98 }