View Javadoc

1   package com.atlassian.plugins.rest.common.sal.websudo;
2   
3   import static org.junit.Assert.assertNotNull;
4   import static org.junit.Assert.fail;
5   import static org.mockito.Mockito.when;
6   import static org.mockito.MockitoAnnotations.initMocks;
7   
8   import com.atlassian.plugins.rest.common.sal.websudo.nopackageprotection.ClassNoAnnotation;
9   import com.atlassian.plugins.rest.common.sal.websudo.nopackageprotection.ClassProtectedByClassAnnotation;
10  import com.atlassian.plugins.rest.common.sal.websudo.nopackageprotection.MethodProtectedByMethodAnnotation;
11  import com.atlassian.plugins.rest.common.sal.websudo.packageannotationnotrequired.MethodOverridesPackage;
12  import com.atlassian.plugins.rest.common.sal.websudo.packageannotationrequired.ClassProtectedByPackageAnnotation;
13  import com.atlassian.plugins.rest.common.sal.websudo.packageannotationrequired.ClassWebSudoNotRequiredAnnotation;
14  import com.atlassian.plugins.rest.common.sal.websudo.packageannotationrequired.MethodWebSudoNotRequiredAnnotation;
15  import com.sun.jersey.api.model.AbstractMethod;
16  import com.sun.jersey.api.model.AbstractResource;
17  import com.sun.jersey.api.model.AbstractResourceMethod;
18  import com.sun.jersey.api.model.PathValue;
19  import com.sun.jersey.spi.container.ContainerRequest;
20  import org.junit.After;
21  import org.junit.Before;
22  import org.junit.Test;
23  import org.mockito.Mock;
24  
25  import java.lang.annotation.Annotation;
26  
27  /*
28   * Test the WebSudoResourceFilter
29   * <p>
30   *
31   * Annotations on more specific types override annotations on less specific element types.
32   *
33   *      Package > Class > Method
34   *
35   * E.g. A method with a @WebSudoNotRequired annotation vetoes the @WebSudoRequired annotation on a class
36   */
37  public final class TestWebSudoResourceFilter {
38      private static final String METHOD_ONE = "aMethod";
39      private static final String METHOD_TWO = "bMethod";
40  
41      private WebSudoResourceFilter webSudoResourceFilter;
42  
43      @Mock
44      private WebSudoResourceContext webSudoResourceContext;
45  
46      @Mock
47      private ContainerRequest containerRequest;
48  
49      @Before
50      public void setUp() {
51          initMocks(this);
52  
53          when(webSudoResourceContext.shouldEnforceWebSudoProtection()).thenReturn(true);
54      }
55  
56      @After
57      public void teardown() {
58          webSudoResourceFilter = null;
59          webSudoResourceContext = null;
60          containerRequest = null;
61      }
62  
63      @Test
64      public void filterPassesWithWebSudoProtectionOn() {
65          setupResourceFilter(ClassProtectedByPackageAnnotation.class, METHOD_ONE);
66          when(webSudoResourceContext.shouldEnforceWebSudoProtection()).thenReturn(false);
67          assertNotNull(webSudoResourceFilter.filter(containerRequest));
68      }
69  
70      @Test
71      public void filterPassesWithWebSudoProtectionOnNoAnnotations() {
72          setupResourceFilter(ClassNoAnnotation.class, METHOD_ONE);
73          when(webSudoResourceContext.shouldEnforceWebSudoProtection()).thenReturn(false);
74          assertNotNull(webSudoResourceFilter.filter(containerRequest));
75      }
76  
77      @Test
78      public void filterPasses() {
79          setupResourceFilter(MethodProtectedByMethodAnnotation.class, METHOD_ONE);
80          webSudoResourceFilter.filter(containerRequest);
81      }
82  
83      @Test
84      public void filterPassesWithWebSudoNotRequiredClassAnnotation() {
85          setupResourceFilter(ClassWebSudoNotRequiredAnnotation.class, METHOD_ONE);
86          webSudoResourceFilter.filter(containerRequest);
87      }
88  
89      @Test
90      public void filterPassesWithWebSudoNotRequiredMethodAnnotation() {
91          setupResourceFilter(MethodWebSudoNotRequiredAnnotation.class, METHOD_ONE);
92          webSudoResourceFilter.filter(containerRequest);
93      }
94  
95      @Test(expected = WebSudoRequiredException.class)
96      public void filterRejectedWithPackageAnnotation() {
97          setupResourceFilter(ClassProtectedByPackageAnnotation.class, METHOD_ONE);
98          webSudoResourceFilter.filter(containerRequest);
99      }
100 
101     @Test(expected = WebSudoRequiredException.class)
102     public void filterRejectedWithClassAnnotation() {
103         setupResourceFilter(ClassProtectedByClassAnnotation.class, METHOD_ONE);
104         assertNotNull(webSudoResourceFilter.filter(containerRequest));
105     }
106 
107     @Test(expected = WebSudoRequiredException.class)
108     public void filterRejectedWithMethodAnnotation() {
109         setupResourceFilter(MethodProtectedByMethodAnnotation.class, METHOD_TWO);
110         webSudoResourceFilter.filter(containerRequest);
111     }
112 
113     @Test(expected = WebSudoRequiredException.class)
114     public void filterRejectedMethodAnnotationOverridesClassAnnotation() {
115         setupResourceFilter(ClassWebSudoNotRequiredAnnotation.class, METHOD_TWO);
116         webSudoResourceFilter.filter(containerRequest);
117     }
118 
119     @Test(expected = WebSudoRequiredException.class)
120     public void filterRejectedMethodAnnotationOverridesPackageAnnotation() {
121         setupResourceFilter(MethodOverridesPackage.class, METHOD_ONE);
122         webSudoResourceFilter.filter(containerRequest);
123     }
124 
125     private void setupResourceFilter(final Class clazz, final String methodName, final Annotation... annotations) {
126         try {
127             AbstractMethod m = new AbstractResourceMethod(new AbstractResource(clazz, new PathValue("/")),
128                     clazz.getMethod(methodName), clazz, clazz, "test", annotations);
129             webSudoResourceFilter = new WebSudoResourceFilter(m, webSudoResourceContext);
130         } catch (NoSuchMethodException nsme) {
131             fail("Test setup failed due to " + nsme.getMessage());
132         }
133     }
134 }