View Javadoc

1   package com.atlassian.plugins.rest.common.filter;
2   
3   import com.sun.jersey.core.util.MultivaluedMapImpl;
4   import com.sun.jersey.spi.container.ContainerRequest;
5   
6   import static org.junit.Assert.*;
7   
8   import org.junit.Before;
9   import org.junit.Test;
10  import org.mockito.ArgumentMatcher;
11  import org.mockito.Matchers;
12  import org.mockito.Mock;
13  
14  import static org.mockito.Mockito.*;
15  
16  import org.mockito.MockitoAnnotations;
17  
18  import javax.ws.rs.core.MediaType;
19  import javax.ws.rs.core.MultivaluedMap;
20  import java.net.URI;
21  import java.util.Collections;
22  import java.util.List;
23  import java.util.Map;
24  
25  
26  public class ExtensionJerseyFilterTest {
27      private static final String ACCEPT_HEADER = "Accept";
28  
29      @Mock
30      private ContainerRequest containerRequest;
31  
32      private ExtensionJerseyFilter jerseyFilter;
33  
34      @Before
35      public void setUp() {
36          MockitoAnnotations.initMocks(this);
37          jerseyFilter = new ExtensionJerseyFilter(Collections.singletonList("/excluded.*"));
38      }
39  
40      @Test
41      public void testDefaultConstructor() throws Exception {
42          jerseyFilter = new ExtensionJerseyFilter();
43          final MultivaluedMap<String, String> parameters = new MultivaluedMapImpl();
44          parameters.add("param1", "value1");
45          parameters.add("param2", "value2.1");
46          parameters.add("param2", "value2.2");
47          testFilter(parameters);
48      }
49  
50      @Test
51      public void testFilterWithoutQueryParameters() throws Exception {
52          testFilter(new MultivaluedMapImpl());
53      }
54  
55      @Test
56      public void testFilterWithQueryParameters() throws Exception {
57          final MultivaluedMap<String, String> parameters = new MultivaluedMapImpl();
58          parameters.add("param1", "value1");
59          parameters.add("param2", "value2.1");
60          parameters.add("param2", "value2.2");
61          testFilter(parameters);
62      }
63  
64      @Test
65      public void testDoNotFilterWhenExtensionNotMatched() throws Exception {
66          testDoNotFilter("resource.myextension");
67      }
68  
69      @Test
70      public void testDoNotFilterWhenNoExtension() throws Exception {
71          testDoNotFilter("resource");
72      }
73  
74      @Test
75      public void testDoNotFilterWhenExcluded() throws Exception {
76          testDoNotFilter("excluded/resource.json");
77      }
78  
79      private void testFilter(MultivaluedMap<String, String> queryParameters) throws Exception {
80          final MultivaluedMapImpl headers = new MultivaluedMapImpl();
81          final URI baseUri = new URI("http://localhost:8080/rest");
82  
83          when(containerRequest.getAbsolutePath()).thenReturn(new URI("http://localhost:8080/rest/application.json"));
84          when(containerRequest.getBaseUri()).thenReturn(baseUri);
85          when(containerRequest.getRequestHeaders()).thenReturn(headers);
86          when(containerRequest.getQueryParameters()).thenReturn(queryParameters);
87  
88          jerseyFilter.filter(containerRequest);
89  
90          final List<String> acceptHeader = headers.get(ACCEPT_HEADER);
91          assertEquals(1, acceptHeader.size());
92          assertEquals(MediaType.APPLICATION_JSON, acceptHeader.get(0));
93  
94          verify(containerRequest).setUris(eq(baseUri), argThat(new UriMatcher(new URI("http://localhost:8080/rest/application"), queryParameters)));
95      }
96  
97      private void testDoNotFilter(String resourceName) throws Exception {
98          final String baseUri = "http://localhost:8080/rest/";
99  
100         when(containerRequest.getBaseUri()).thenReturn(new URI(baseUri));
101         when(containerRequest.getAbsolutePath()).thenReturn(new URI(baseUri + resourceName));
102 
103         jerseyFilter.filter(containerRequest);
104 
105         verify(containerRequest, never()).getRequestHeaders();
106         verify(containerRequest, never()).setUris(Matchers.<URI>anyObject(), Matchers.<URI>anyObject());
107     }
108 
109     private static class UriMatcher extends ArgumentMatcher<URI> {
110         private final URI requestUri;
111         private final MultivaluedMap<String, String> parameters;
112 
113         UriMatcher(URI requestUri, MultivaluedMap<String, String> parameters) {
114             this.requestUri = requestUri;
115             this.parameters = parameters;
116         }
117 
118         public boolean matches(Object actual) {
119             final URI uri = (URI) actual;
120 
121             if (!actual.toString().startsWith(requestUri.toString())) {
122                 return false;
123             }
124 
125             // check query parameters
126             final String queryParametersString = '&' + uri.getQuery() + '&';
127             for (Map.Entry<String, List<String>> queryParameter : parameters.entrySet()) {
128                 for (String value : queryParameter.getValue()) {
129                     if (!queryParametersString.contains('&' + queryParameter.getKey() + '=' + value + '&')) {
130                         return false;
131                     }
132                 }
133             }
134             return true;
135         }
136     }
137 }