1 package com.atlassian.plugins.rest.module.servlet;
2
3 import com.atlassian.plugin.servlet.ServletModuleManager;
4 import com.atlassian.plugin.servlet.descriptors.ServletFilterModuleDescriptor;
5 import com.atlassian.plugin.servlet.descriptors.ServletModuleDescriptor;
6 import com.atlassian.plugin.servlet.filter.FilterLocation;
7 import com.atlassian.plugin.servlet.util.PathMapper;
8 import com.atlassian.plugins.rest.module.ApiVersion;
9 import com.atlassian.plugins.rest.module.RestServletFilterModuleDescriptor;
10 import org.junit.Before;
11 import org.junit.Test;
12
13 import static org.mockito.Mockito.*;
14
15 import javax.servlet.FilterConfig;
16 import javax.servlet.ServletConfig;
17 import java.util.Collections;
18
19 public class DefaultRestServletModuleManagerTest {
20 private ServletModuleManager servletModuleManagerDelegate;
21 private PathMapper pathMapper;
22
23 private DefaultRestServletModuleManager servletModuleManager;
24
25 @Before
26 public void setUp() {
27 servletModuleManagerDelegate = mock(ServletModuleManager.class);
28 pathMapper = mock(PathMapper.class);
29
30 servletModuleManager = new DefaultRestServletModuleManager(servletModuleManagerDelegate, pathMapper, "/rest");
31 }
32
33 @Test
34 public void testAddServletModule() {
35 final ServletModuleDescriptor moduleDescriptor = mock(ServletModuleDescriptor.class);
36 servletModuleManager.addServletModule(moduleDescriptor);
37
38 verify(servletModuleManagerDelegate).addServletModule(moduleDescriptor);
39 verifyNoMoreInteractions(servletModuleManagerDelegate);
40 verifyZeroInteractions(pathMapper);
41 }
42
43 @Test
44 public void testGetServlet() throws Exception {
45 final String path = "path";
46 final ServletConfig servletConfig = mock(ServletConfig.class);
47 servletModuleManager.getServlet(path, servletConfig);
48
49 verify(servletModuleManagerDelegate).getServlet(path, servletConfig);
50 verifyNoMoreInteractions(servletModuleManagerDelegate);
51 verifyZeroInteractions(pathMapper);
52 }
53
54 @Test
55 public void testRemoveServletModule() {
56 final ServletModuleDescriptor moduleDescriptor = mock(ServletModuleDescriptor.class);
57 servletModuleManager.removeServletModule(moduleDescriptor);
58
59 verify(servletModuleManagerDelegate).removeServletModule(moduleDescriptor);
60 verifyNoMoreInteractions(servletModuleManagerDelegate);
61 verifyZeroInteractions(pathMapper);
62 }
63
64 @Test
65 public void testGetFilters() throws Exception {
66 final FilterLocation filterLocation = FilterLocation.AFTER_ENCODING;
67 final String pathInfo = "pathInfo";
68 final FilterConfig filterConfig = mock(FilterConfig.class);
69 servletModuleManager.getFilters(filterLocation, pathInfo, filterConfig);
70
71 verify(servletModuleManagerDelegate).getFilters(filterLocation, pathInfo, filterConfig);
72 verifyNoMoreInteractions(servletModuleManagerDelegate);
73 verifyZeroInteractions(pathMapper);
74 }
75
76 @Test
77 public void testAddFilterModuleWithNonRestServletFilterModuleDescriptor() {
78 final ServletFilterModuleDescriptor servletFilterModuleDescriptor = mock(ServletFilterModuleDescriptor.class);
79 servletModuleManager.addFilterModule(servletFilterModuleDescriptor);
80
81 verify(servletModuleManagerDelegate).addFilterModule(servletFilterModuleDescriptor);
82 verifyNoMoreInteractions(servletModuleManagerDelegate);
83 verifyZeroInteractions(pathMapper);
84 }
85
86 @Test
87 public void testAddFilterModuleWithRestServletFilterModuleDescriptor() {
88 final String key1 = "completekey1";
89 final String basePath = "/basepath";
90 final String path1 = "/basepath/1";
91 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor1 = getMockRestServletModuleDescriptor(key1, basePath, "1");
92 when(servletFilterModuleDescriptor1.getPaths()).thenReturn(Collections.singletonList(path1));
93
94
95 servletModuleManager.addFilterModule(servletFilterModuleDescriptor1);
96
97 verify(pathMapper).put(key1, servletModuleManager.getPathPattern(basePath));
98 verify(servletModuleManagerDelegate).addFilterModule(servletFilterModuleDescriptor1);
99
100 final String key2 = "completekey2";
101 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor2 = getMockRestServletModuleDescriptor(key2, basePath, "2");
102
103
104 servletModuleManager.addFilterModule(servletFilterModuleDescriptor2);
105
106
107 verify(pathMapper).put(key1, null);
108 verify(pathMapper).put(key1, path1);
109
110 verify(pathMapper).put(key2, servletModuleManager.getPathPattern(basePath));
111 verify(servletModuleManagerDelegate).addFilterModule(servletFilterModuleDescriptor2);
112
113 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor3 = getMockRestServletModuleDescriptor("completekey3", basePath, "1.2");
114
115
116 servletModuleManager.addFilterModule(servletFilterModuleDescriptor3);
117
118 verifyZeroInteractions(pathMapper);
119 verify(servletModuleManagerDelegate).addFilterModule(servletFilterModuleDescriptor3);
120 }
121
122 @Test
123 public void testRemoveFilterModuleWithRestServletFilterModuleDescriptorWithNoExistingLatest() {
124 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor1 = getMockRestServletModuleDescriptor("completekey1", "/basepath", "1");
125
126
127 servletModuleManager.removeFilterModule(servletFilterModuleDescriptor1);
128
129 verify(servletModuleManagerDelegate).removeFilterModule(servletFilterModuleDescriptor1);
130 verifyZeroInteractions(pathMapper);
131 }
132
133 @Test
134 public void testRemoveFilterModuleWithRestServletFilterModuleDescriptorWhenRemovingNonLatest() {
135 final String key1 = "completekey1";
136 final String key2 = "completekey2";
137 final String basePath = "/basepath";
138 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor1 = getMockRestServletModuleDescriptor(key1, basePath, "1");
139 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor2 = getMockRestServletModuleDescriptor(key2, basePath, "2");
140
141
142 servletModuleManager.addFilterModule(servletFilterModuleDescriptor1);
143 servletModuleManager.addFilterModule(servletFilterModuleDescriptor2);
144
145
146 servletModuleManager.removeFilterModule(servletFilterModuleDescriptor1);
147
148 verify(servletModuleManagerDelegate).removeFilterModule(servletFilterModuleDescriptor1);
149 verify(pathMapper).put(key1, servletModuleManager.getPathPattern(basePath));
150 verify(pathMapper).put(key1, null);
151 verify(pathMapper).put(key2, servletModuleManager.getPathPattern(basePath));
152 verifyNoMoreInteractions(pathMapper);
153 }
154
155 @Test
156 public void testRemoveFilterModuleWithRestServletFilterModuleDescriptorWhenRemovingLatest() {
157 final String key1 = "completekey1";
158 final String key2 = "completekey2";
159 final String basePath = "/basepath";
160 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor1 = getMockRestServletModuleDescriptor(key1, basePath, "1");
161 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor2 = getMockRestServletModuleDescriptor(key2, basePath, "2");
162
163 servletModuleManager.addFilterModule(servletFilterModuleDescriptor2);
164 servletModuleManager.addFilterModule(servletFilterModuleDescriptor1);
165
166 verify(pathMapper).put(key2, servletModuleManager.getPathPattern(basePath));
167 verifyNoMoreInteractions(pathMapper);
168
169 servletModuleManager.removeFilterModule(servletFilterModuleDescriptor2);
170
171 verify(servletModuleManagerDelegate).removeFilterModule(servletFilterModuleDescriptor2);
172 verify(pathMapper).put(key1, servletModuleManager.getPathPattern(basePath));
173 verifyNoMoreInteractions(pathMapper);
174 }
175
176 @Test
177 public void testRemoveFilterModuleWithNonRestServletFilterModuleDescriptor() {
178 final ServletFilterModuleDescriptor servletFilterModuleDescriptor = mock(ServletFilterModuleDescriptor.class);
179 servletModuleManager.removeFilterModule(servletFilterModuleDescriptor);
180
181 verify(servletModuleManagerDelegate).removeFilterModule(servletFilterModuleDescriptor);
182 verifyNoMoreInteractions(servletModuleManagerDelegate);
183 verifyZeroInteractions(pathMapper);
184 }
185
186 private RestServletFilterModuleDescriptor getMockRestServletModuleDescriptor(String key, String path, String version) {
187 final RestServletFilterModuleDescriptor servletFilterModuleDescriptor1 = mock(RestServletFilterModuleDescriptor.class);
188 when(servletFilterModuleDescriptor1.getCompleteKey()).thenReturn(key);
189 when(servletFilterModuleDescriptor1.getBasePath()).thenReturn(path);
190 when(servletFilterModuleDescriptor1.getVersion()).thenReturn(new ApiVersion(version));
191 return servletFilterModuleDescriptor1;
192 }
193 }