View Javadoc

1   package com.atlassian.plugin.servlet;
2   
3   import com.atlassian.plugin.webresource.PluginResourceLocator;
4   import com.mockobjects.dynamic.C;
5   import com.mockobjects.dynamic.Mock;
6   import junit.framework.TestCase;
7   
8   import javax.servlet.http.HttpServletRequest;
9   import javax.servlet.http.HttpServletResponse;
10  import java.util.Collections;
11  import java.util.HashMap;
12  import java.util.Map;
13  
14  public class TestPluginResourceDownload extends TestCase
15  {
16      private static final String SINGLE_RESOURCE = "/download/resources/com.atlassian.plugin:foo-resources/foo.js";
17      private static final String BATCH_RESOURCE = "/download/batch/js/com.atlassian.plugin:bar-resources.js";
18      private static final String JS_CONTENT_TYPE = "text/javascript";
19  
20      private PluginResourceDownload pluginResourceDownload;
21      private Mock mockPluginResourceLocator;
22      private Mock mockContentTypeResolver;
23  
24      protected void setUp() throws Exception
25      {
26          super.setUp();
27  
28          mockPluginResourceLocator = new Mock(PluginResourceLocator.class);
29          mockContentTypeResolver = new Mock(ContentTypeResolver.class);
30  
31          pluginResourceDownload = new PluginResourceDownload((PluginResourceLocator) mockPluginResourceLocator.proxy(),
32              (ContentTypeResolver) mockContentTypeResolver.proxy(), "UTF-8");
33      }
34  
35      protected void tearDown() throws Exception
36      {
37          mockContentTypeResolver = null;
38          mockPluginResourceLocator = null;
39          pluginResourceDownload = null;
40          super.tearDown();
41      }
42  
43      public void testMatches()
44      {
45          mockPluginResourceLocator.expectAndReturn("matches", C.args(C.eq(SINGLE_RESOURCE)), true);
46          assertTrue(pluginResourceDownload.matches(SINGLE_RESOURCE));
47  
48          mockPluginResourceLocator.expectAndReturn("matches", C.args(C.eq(BATCH_RESOURCE)), true);
49          assertTrue(pluginResourceDownload.matches(BATCH_RESOURCE));
50      }
51  
52      public void testResourceNotFound() throws Exception
53      {
54          Mock mockRequest = new Mock(HttpServletRequest.class);
55          mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
56          mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
57          mockRequest.expectAndReturn("getAttribute", "_statichash", null);
58  
59          Mock mockResponse = new Mock(HttpServletResponse.class);
60          mockResponse.expect("sendError", C.args(C.eq(HttpServletResponse.SC_NOT_FOUND)));
61          mockPluginResourceLocator.expectAndReturn("getDownloadableResource", C.args(C.eq(SINGLE_RESOURCE), C.eq(Collections.EMPTY_MAP)), null);
62  
63          pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(), (HttpServletResponse) mockResponse.proxy());
64      }
65  
66      public void testServeFile() throws Exception
67      {
68          Map<String, String[]> params = new HashMap<String, String[]>();
69          params.put("aaa", new String[] {"bbb"});
70  
71          Mock mockRequest = new Mock(HttpServletRequest.class);
72          mockRequest.expectAndReturn("getParameterMap", params);
73          mockRequest.expectAndReturn("getAttribute", "_statichash", null);
74          mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
75          mockRequest.expectAndReturn("getParameterMap", params);
76          mockRequest.expectAndReturn("getAttribute", "_statichash", null);
77  
78          Mock mockResponse = new Mock(HttpServletResponse.class);
79          mockResponse.expect("setContentType", C.args(C.eq(JS_CONTENT_TYPE)));
80  
81          Mock mockDownloadableResource = new Mock(DownloadableResource.class);
82          mockDownloadableResource.expectAndReturn("isResourceModified", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())), false);
83          mockDownloadableResource.expectAndReturn("getContentType", JS_CONTENT_TYPE);
84          mockDownloadableResource.expect("serveResource", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())));
85          mockPluginResourceLocator.expectAndReturn("getDownloadableResource", C.ANY_ARGS, mockDownloadableResource.proxy());
86  
87          pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(), (HttpServletResponse) mockResponse.proxy());
88      }
89  
90      public void testServeFileContentTypeUsesContentTypeResolverWhenResourceContentTypeIsNull() throws DownloadException
91      {
92          Mock mockRequest = new Mock(HttpServletRequest.class);
93          mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
94          mockRequest.expectAndReturn("getAttribute", "_statichash", null);
95          mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
96          mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
97          mockRequest.expectAndReturn("getAttribute", "_statichash", null);
98  
99          Mock mockResponse = new Mock(HttpServletResponse.class);
100         mockResponse.expect("setContentType", C.args(C.eq(JS_CONTENT_TYPE)));
101 
102         Mock mockDownloadableResource = new Mock(DownloadableResource.class);
103         mockDownloadableResource.expectAndReturn("isResourceModified",
104                                                  C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())),
105                                                  true);
106         mockDownloadableResource.expectAndReturn("getContentType", null);
107         mockDownloadableResource.expect("serveResource", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())));
108         mockPluginResourceLocator.expectAndReturn("getDownloadableResource",
109                                                   C.ANY_ARGS,
110                                                   mockDownloadableResource.proxy());
111 
112         mockContentTypeResolver.expectAndReturn("getContentType", C.args(C.eq(SINGLE_RESOURCE)), JS_CONTENT_TYPE);
113         
114         pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(),
115                                          (HttpServletResponse) mockResponse.proxy());
116 
117         mockResponse.verify();
118     }
119 
120     public void testServeFileDoesNotCallSetContentTypeWithNullContentType() throws DownloadException
121     {
122         Mock mockRequest = new Mock(HttpServletRequest.class);
123         mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
124         mockRequest.expectAndReturn("getAttribute", "_statichash", null);
125         mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
126         mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
127         mockRequest.expectAndReturn("getAttribute", "_statichash", null);
128 
129         Mock mockResponse = new Mock(HttpServletResponse.class);
130 
131         Mock mockDownloadableResource = new Mock(DownloadableResource.class);
132         mockDownloadableResource.expectAndReturn("isResourceModified",
133                                                  C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())),
134                                                  false);
135         mockDownloadableResource.expectAndReturn("getContentType", null);
136         mockDownloadableResource.expect("serveResource", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())));
137         mockPluginResourceLocator.expectAndReturn("getDownloadableResource",
138                                                   C.ANY_ARGS,
139                                                   mockDownloadableResource.proxy());
140 
141         mockContentTypeResolver.expectAndReturn("getContentType", C.args(C.eq(SINGLE_RESOURCE)), null);
142 
143         pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(),
144                                          (HttpServletResponse) mockResponse.proxy());
145     }
146 }