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 }