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  
58          Mock mockResponse = new Mock(HttpServletResponse.class);
59          mockResponse.expect("sendError", C.args(C.eq(HttpServletResponse.SC_NOT_FOUND)));
60          mockPluginResourceLocator.expectAndReturn("getDownloadableResource", C.args(C.eq(SINGLE_RESOURCE), C.eq(Collections.EMPTY_MAP)), null);
61  
62          pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(), (HttpServletResponse) mockResponse.proxy());
63      }
64  
65      public void testServeFile() throws Exception
66      {
67          Map<String, String[]> params = new HashMap<String, String[]>();
68          params.put("aaa", new String[] {"bbb"});
69  
70          Mock mockRequest = new Mock(HttpServletRequest.class);
71          mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
72          mockRequest.expectAndReturn("getParameterMap", params);
73  
74          Mock mockResponse = new Mock(HttpServletResponse.class);
75          mockResponse.expect("setContentType", C.args(C.eq(JS_CONTENT_TYPE)));
76  
77          Mock mockDownloadableResource = new Mock(DownloadableResource.class);
78          mockDownloadableResource.expectAndReturn("isResourceModified", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())), false);
79          mockDownloadableResource.expectAndReturn("getContentType", JS_CONTENT_TYPE);
80          mockDownloadableResource.expect("serveResource", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())));
81          mockPluginResourceLocator.expectAndReturn("getDownloadableResource", C.ANY_ARGS, mockDownloadableResource.proxy());
82  
83          pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(), (HttpServletResponse) mockResponse.proxy());
84      }
85  
86      public void testServeFileContentTypeUsesContentTypeResolverWhenResourceContentTypeIsNull() throws DownloadException
87      {
88          Mock mockRequest = new Mock(HttpServletRequest.class);
89          mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
90          mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
91  
92          Mock mockResponse = new Mock(HttpServletResponse.class);
93          mockResponse.expect("setContentType", C.args(C.eq(JS_CONTENT_TYPE)));
94  
95          Mock mockDownloadableResource = new Mock(DownloadableResource.class);
96          mockDownloadableResource.expectAndReturn("isResourceModified",
97                                                   C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())),
98                                                   false);
99          mockDownloadableResource.expectAndReturn("getContentType", null);
100         mockDownloadableResource.expect("serveResource", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())));
101         mockPluginResourceLocator.expectAndReturn("getDownloadableResource",
102                                                   C.ANY_ARGS,
103                                                   mockDownloadableResource.proxy());
104 
105         mockContentTypeResolver.expectAndReturn("getContentType", C.args(C.eq(SINGLE_RESOURCE)), JS_CONTENT_TYPE);
106         
107         pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(),
108                                          (HttpServletResponse) mockResponse.proxy());
109 
110         mockResponse.verify();
111     }
112 
113     public void testServeFileDoesNotCallSetContentTypeWithNullContentType() throws DownloadException
114     {
115         Mock mockRequest = new Mock(HttpServletRequest.class);
116         mockRequest.matchAndReturn("getRequestURI", SINGLE_RESOURCE);
117         mockRequest.expectAndReturn("getParameterMap", Collections.EMPTY_MAP);
118 
119         Mock mockResponse = new Mock(HttpServletResponse.class);
120 
121         Mock mockDownloadableResource = new Mock(DownloadableResource.class);
122         mockDownloadableResource.expectAndReturn("isResourceModified",
123                                                  C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())),
124                                                  false);
125         mockDownloadableResource.expectAndReturn("getContentType", null);
126         mockDownloadableResource.expect("serveResource", C.args(C.eq(mockRequest.proxy()), C.eq(mockResponse.proxy())));
127         mockPluginResourceLocator.expectAndReturn("getDownloadableResource",
128                                                   C.ANY_ARGS,
129                                                   mockDownloadableResource.proxy());
130 
131         mockContentTypeResolver.expectAndReturn("getContentType", C.args(C.eq(SINGLE_RESOURCE)), null);
132 
133         pluginResourceDownload.serveFile((HttpServletRequest) mockRequest.proxy(),
134                                          (HttpServletResponse) mockResponse.proxy());
135     }
136 }