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 }