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
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 }