1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
package org.xwiki.webjars; |
21 |
|
|
22 |
|
import java.io.ByteArrayInputStream; |
23 |
|
import java.io.ByteArrayOutputStream; |
24 |
|
import java.io.Reader; |
25 |
|
import java.io.StringWriter; |
26 |
|
import java.util.Arrays; |
27 |
|
import java.util.Date; |
28 |
|
|
29 |
|
import javax.servlet.http.HttpServletRequest; |
30 |
|
import javax.servlet.http.HttpServletResponse; |
31 |
|
|
32 |
|
import org.apache.velocity.exception.VelocityException; |
33 |
|
import org.junit.Before; |
34 |
|
import org.junit.Rule; |
35 |
|
import org.junit.Test; |
36 |
|
import org.mockito.ArgumentCaptor; |
37 |
|
import org.mockito.invocation.InvocationOnMock; |
38 |
|
import org.mockito.stubbing.Answer; |
39 |
|
import org.xwiki.classloader.ClassLoaderManager; |
40 |
|
import org.xwiki.classloader.NamespaceURLClassLoader; |
41 |
|
import org.xwiki.container.Container; |
42 |
|
import org.xwiki.container.servlet.ServletRequest; |
43 |
|
import org.xwiki.container.servlet.ServletResponse; |
44 |
|
import org.xwiki.resource.ResourceReferenceHandlerChain; |
45 |
|
import org.xwiki.resource.ResourceReferenceHandlerException; |
46 |
|
import org.xwiki.test.mockito.MockitoComponentMockingRule; |
47 |
|
import org.xwiki.velocity.VelocityEngine; |
48 |
|
import org.xwiki.velocity.VelocityManager; |
49 |
|
import org.xwiki.webjars.internal.WebJarsResourceReference; |
50 |
|
import org.xwiki.webjars.internal.WebJarsResourceReferenceHandler; |
51 |
|
|
52 |
|
import static org.junit.Assert.assertEquals; |
53 |
|
import static org.junit.Assert.assertTrue; |
54 |
|
import static org.mockito.ArgumentMatchers.any; |
55 |
|
import static org.mockito.ArgumentMatchers.anyLong; |
56 |
|
import static org.mockito.ArgumentMatchers.eq; |
57 |
|
import static org.mockito.Mockito.doAnswer; |
58 |
|
import static org.mockito.Mockito.mock; |
59 |
|
import static org.mockito.Mockito.never; |
60 |
|
import static org.mockito.Mockito.verify; |
61 |
|
import static org.mockito.Mockito.when; |
62 |
|
|
63 |
|
|
64 |
|
@link |
65 |
|
|
66 |
|
@version |
67 |
|
@since |
68 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (72) |
Complexity: 7 |
Complexity Density: 0.11 |
|
69 |
|
public class WebJarsResourceReferenceHandlerTest |
70 |
|
{ |
71 |
|
@Rule |
72 |
|
public MockitoComponentMockingRule<WebJarsResourceReferenceHandler> componentManager = |
73 |
|
new MockitoComponentMockingRule<>(WebJarsResourceReferenceHandler.class); |
74 |
|
|
75 |
|
private ServletRequest request; |
76 |
|
|
77 |
|
private ServletResponse response; |
78 |
|
|
79 |
|
private ResourceReferenceHandlerChain chain = mock(ResourceReferenceHandlerChain.class); |
80 |
|
|
81 |
|
private WebJarsResourceReferenceHandler handler; |
82 |
|
|
83 |
|
private NamespaceURLClassLoader classLoader; |
84 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (15) |
Complexity: 1 |
Complexity Density: 0.07 |
|
85 |
5 |
@Before... |
86 |
|
public void configure() throws Exception |
87 |
|
{ |
88 |
5 |
Container container = this.componentManager.getInstance(Container.class); |
89 |
|
|
90 |
5 |
this.response = mock(ServletResponse.class); |
91 |
5 |
ByteArrayOutputStream responseOutputStream = new ByteArrayOutputStream(); |
92 |
5 |
when(this.response.getOutputStream()).thenReturn(responseOutputStream); |
93 |
|
|
94 |
5 |
HttpServletResponse httpResponse = mock(HttpServletResponse.class); |
95 |
5 |
when(this.response.getHttpServletResponse()).thenReturn(httpResponse); |
96 |
5 |
when(container.getResponse()).thenReturn(this.response); |
97 |
|
|
98 |
5 |
this.request = mock(ServletRequest.class); |
99 |
5 |
HttpServletRequest httpRequest = mock(HttpServletRequest.class); |
100 |
5 |
when(this.request.getHttpServletRequest()).thenReturn(httpRequest); |
101 |
5 |
when(container.getRequest()).thenReturn(this.request); |
102 |
|
|
103 |
5 |
this.handler = this.componentManager.getComponentUnderTest(); |
104 |
|
|
105 |
5 |
this.classLoader = mock(NamespaceURLClassLoader.class); |
106 |
5 |
ClassLoaderManager clm = this.componentManager.getInstance(ClassLoaderManager.class); |
107 |
5 |
when(clm.getURLClassLoader("wiki:wiki", true)).thenReturn(this.classLoader); |
108 |
|
} |
109 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0.2 |
1PASS
|
|
110 |
1 |
@Test... |
111 |
|
public void executeWhenResourceDoesntExist() throws Exception |
112 |
|
{ |
113 |
1 |
WebJarsResourceReference reference = |
114 |
|
new WebJarsResourceReference("wiki:wiki", Arrays.asList("angular", "2.1.11", "angular.js")); |
115 |
|
|
116 |
1 |
this.handler.handle(reference, this.chain); |
117 |
|
|
118 |
1 |
verify(this.classLoader).getResourceAsStream("META-INF/resources/webjars/angular/2.1.11/angular.js"); |
119 |
1 |
verify(this.response.getHttpServletResponse()) |
120 |
|
.sendError(404, "Resource not found [angular/2.1.11/angular.js]."); |
121 |
1 |
verify(this.chain).handleNext(reference); |
122 |
|
} |
123 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (13) |
Complexity: 1 |
Complexity Density: 0.08 |
1PASS
|
|
124 |
1 |
@Test... |
125 |
|
public void executeWhenResourceExists() throws Exception |
126 |
|
{ |
127 |
1 |
WebJarsResourceReference reference = |
128 |
|
new WebJarsResourceReference("wiki:wiki", Arrays.asList("angular", "2.1.11", "angular.js")); |
129 |
|
|
130 |
1 |
ByteArrayInputStream resourceStream = new ByteArrayInputStream("content".getBytes()); |
131 |
1 |
when(this.classLoader.getResourceAsStream("META-INF/resources/webjars/angular/2.1.11/angular.js")).thenReturn( |
132 |
|
resourceStream); |
133 |
|
|
134 |
1 |
Long now = new Date().getTime(); |
135 |
1 |
this.handler.handle(reference, this.chain); |
136 |
|
|
137 |
|
|
138 |
1 |
assertEquals("content", this.response.getOutputStream().toString()); |
139 |
|
|
140 |
1 |
verify(this.response).setContentType("application/javascript"); |
141 |
|
|
142 |
|
|
143 |
1 |
verify(this.response.getHttpServletResponse()).setHeader("Cache-Control", "public"); |
144 |
1 |
ArgumentCaptor<Long> expireDate = ArgumentCaptor.forClass(Long.class); |
145 |
1 |
verify(this.response.getHttpServletResponse()).setDateHeader(eq("Expires"), expireDate.capture()); |
146 |
|
|
147 |
1 |
assertTrue(expireDate.getValue() >= (now + 365 * 24 * 3600 * 1000L)); |
148 |
|
|
149 |
|
|
150 |
|
|
151 |
1 |
verify(this.response.getHttpServletResponse()).setDateHeader(eq("Last-Modified"), anyLong()); |
152 |
|
|
153 |
1 |
verify(this.chain).handleNext(reference); |
154 |
|
} |
155 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0.2 |
1PASS
|
|
156 |
1 |
@Test... |
157 |
|
public void return304WhenIfModifiedSinceHeader() throws Exception |
158 |
|
{ |
159 |
1 |
WebJarsResourceReference reference = |
160 |
|
new WebJarsResourceReference("wiki:wiki", Arrays.asList("angular", "2.1.11", "angular.js")); |
161 |
|
|
162 |
1 |
when(this.request.getHttpServletRequest().getHeader("If-Modified-Since")).thenReturn("some value"); |
163 |
|
|
164 |
1 |
this.handler.handle(reference, this.chain); |
165 |
|
|
166 |
|
|
167 |
1 |
verify(this.response.getHttpServletResponse()).setStatus(304); |
168 |
|
|
169 |
1 |
verify(this.chain).handleNext(reference); |
170 |
|
} |
171 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (13) |
Complexity: 1 |
Complexity Density: 0.08 |
1PASS
|
|
172 |
1 |
@Test... |
173 |
|
public void evaluateResource() throws Exception |
174 |
|
{ |
175 |
1 |
WebJarsResourceReference reference = |
176 |
|
new WebJarsResourceReference("wiki:wiki", Arrays.asList("angular", "2.1.11", "angular.js")); |
177 |
1 |
reference.addParameter("evaluate", true); |
178 |
|
|
179 |
1 |
ByteArrayInputStream resourceStream = new ByteArrayInputStream("content".getBytes()); |
180 |
1 |
when(this.classLoader.getResourceAsStream("META-INF/resources/webjars/angular/2.1.11/angular.js")).thenReturn( |
181 |
|
resourceStream); |
182 |
|
|
183 |
1 |
VelocityManager velocityManager = this.componentManager.getInstance(VelocityManager.class); |
184 |
1 |
VelocityEngine velocityEngine = mock(VelocityEngine.class); |
185 |
1 |
when(velocityManager.getVelocityEngine()).thenReturn(velocityEngine); |
186 |
|
|
187 |
1 |
doAnswer(new Answer<Void>() |
188 |
|
{ |
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
189 |
1 |
@Override... |
190 |
|
public Void answer(InvocationOnMock invocation) |
191 |
|
{ |
192 |
1 |
((StringWriter) invocation.getArguments()[1]).write("evaluated content"); |
193 |
1 |
return null; |
194 |
|
} |
195 |
|
}).when(velocityEngine).evaluate(any(), any(), eq("angular/2.1.11/angular.js"), any(Reader.class)); |
196 |
|
|
197 |
1 |
this.handler.handle(reference, this.chain); |
198 |
|
|
199 |
|
|
200 |
1 |
assertEquals("evaluated content", this.response.getOutputStream().toString()); |
201 |
|
|
202 |
|
|
203 |
1 |
verify(this.response).setContentType("application/javascript"); |
204 |
|
|
205 |
|
|
206 |
1 |
verify(this.response.getHttpServletResponse(), never()).setHeader(any(), any()); |
207 |
1 |
verify(this.response.getHttpServletResponse(), never()).setDateHeader(any(), anyLong()); |
208 |
|
} |
209 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (12) |
Complexity: 1 |
Complexity Density: 0.08 |
1PASS
|
|
210 |
1 |
@Test... |
211 |
|
public void failingResourceEvaluation() throws Exception |
212 |
|
{ |
213 |
1 |
WebJarsResourceReference reference = |
214 |
|
new WebJarsResourceReference("wiki:wiki", Arrays.asList("angular", "2.1.11", "angular.js")); |
215 |
1 |
reference.addParameter("evaluate", "true"); |
216 |
|
|
217 |
1 |
ByteArrayInputStream resourceStream = new ByteArrayInputStream("content".getBytes()); |
218 |
1 |
when(this.classLoader.getResourceAsStream("META-INF/resources/webjars/angular/2.1.11/angular.js")).thenReturn( |
219 |
|
resourceStream); |
220 |
|
|
221 |
1 |
VelocityManager velocityManager = this.componentManager.getInstance(VelocityManager.class); |
222 |
1 |
VelocityEngine velocityEngine = mock(VelocityEngine.class); |
223 |
1 |
when(velocityManager.getVelocityEngine()).thenReturn(velocityEngine); |
224 |
|
|
225 |
1 |
when(velocityEngine.evaluate(any(), any(), eq("angular/2.1.11/angular.js"), any(Reader.class))) |
226 |
|
.thenThrow(new VelocityException("Bad code!")); |
227 |
|
|
228 |
1 |
this.handler.handle(reference, this.chain); |
229 |
|
|
230 |
|
|
231 |
1 |
verify(this.componentManager.getMockedLogger()).error( |
232 |
|
eq("Failed to evaluate the Velocity code from WebJar resource [angular/2.1.11/angular.js]"), |
233 |
|
any(ResourceReferenceHandlerException.class)); |
234 |
|
|
235 |
|
|
236 |
1 |
verify(this.response.getHttpServletResponse()).sendError(500, |
237 |
|
"Failed to evaluate the Velocity code from WebJar resource [angular/2.1.11/angular.js]"); |
238 |
|
|
239 |
|
|
240 |
1 |
verify(this.chain).handleNext(reference); |
241 |
|
} |
242 |
|
} |