1 package com.atlassian.plugin.webresource;
2
3 import static org.mockito.Mockito.mock;
4 import static org.mockito.Mockito.when;
5
6 import com.atlassian.plugin.ModuleDescriptor;
7 import com.atlassian.plugin.Plugin;
8 import com.atlassian.plugin.PluginAccessor;
9 import com.atlassian.plugin.elements.ResourceDescriptor;
10 import com.atlassian.plugin.servlet.DownloadableResource;
11
12 import org.mockito.Mock;
13 import org.mockito.MockitoAnnotations;
14
15 import java.net.URI;
16 import java.util.ArrayList;
17 import java.util.Collections;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.TreeMap;
21
22 import junit.framework.TestCase;
23
24 public class TestSingleBatchDownloadableResourceBuilder extends TestCase
25 {
26 public static final String MODULE_KEY = "test.plugin:webresources";
27 @Mock
28 private PluginAccessor mockPluginAccessor;
29 @Mock
30 private WebResourceUrlProvider mockWebResourceUrlProvider;
31 @Mock
32 private DownloadableResourceFinder mockResourceFinder;
33
34 private Plugin plugin;
35 private WebResourceModuleDescriptor moduleDescriptor;
36 private SingleBatchDownloadableResourceBuilder builder;
37
38 @Override
39 public void setUp() throws Exception
40 {
41 super.setUp();
42
43 MockitoAnnotations.initMocks(this);
44 builder = new SingleBatchDownloadableResourceBuilder(mockPluginAccessor, mockWebResourceUrlProvider, mockResourceFinder);
45
46 plugin = TestUtils.createTestPlugin("test.plugin", "1.0");
47 }
48
49 @Override
50 public void tearDown() throws Exception
51 {
52 mockPluginAccessor = null;
53 mockWebResourceUrlProvider = null;
54 mockResourceFinder = null;
55 plugin = null;
56 moduleDescriptor = null;
57 builder = null;
58
59 super.tearDown();
60 }
61
62 public void testIsCacheSupported() throws Exception
63 {
64 final Map<String, String> queryParams = new TreeMap<String, String>();
65 queryParams.put("cache", "false");
66 final List<ResourceDescriptor> resourceDescriptors = TestUtils.createResourceDescriptors("webresources.css");
67 resourceDescriptors.add(TestUtils.createResourceDescriptor("webresources-nocache.css", queryParams));
68
69 addModuleDescriptor(resourceDescriptors);
70
71 final DownloadableResource resource = builder.parse("/download/batch/" + MODULE_KEY + "/test.plugin:webresources.css",
72 Collections.<String, String> emptyMap());
73 final BatchPluginResource batchResource = (BatchPluginResource) resource;
74 assertTrue(batchResource.isCacheSupported());
75
76 final DownloadableResource resource2 = builder.parse("/download/batch/" + MODULE_KEY + "/test.plugin:webresources-nocache.css", queryParams);
77 final BatchPluginResource batchResource2 = (BatchPluginResource) resource2;
78 assertFalse(batchResource2.isCacheSupported());
79 }
80
81 public void testParse() throws Exception
82 {
83 final List<ResourceDescriptor> resourceDescriptors = TestUtils.createResourceDescriptors("webresources.css");
84 addModuleDescriptor(resourceDescriptors);
85
86 final DownloadableResource resource = builder.parse("/download/batch/" + MODULE_KEY + "/test.plugin:webresources.css",
87 Collections.<String, String> emptyMap());
88
89 final BatchPluginResource batchResource = (BatchPluginResource) resource;
90 assertEquals("css", batchResource.getType());
91 assertEquals(MODULE_KEY, batchResource.getModuleCompleteKey());
92
93 final Map<String, String> params = batchResource.getParams();
94
95 assertEquals(0, params.size());
96 }
97
98 public void testParseWithParams() throws Exception
99 {
100 final Map<String, String> queryParams = new TreeMap<String, String>();
101 queryParams.put("ieonly", "true");
102 queryParams.put("foo", "bar");
103
104 final List<ResourceDescriptor> resourceDescriptors = new ArrayList<ResourceDescriptor>();
105 resourceDescriptors.add(TestUtils.createResourceDescriptor("webresources.css", queryParams));
106 addModuleDescriptor(resourceDescriptors);
107
108 final DownloadableResource resource = builder.parse("/download/batch/" + MODULE_KEY + "/test.plugin:webresources.css", queryParams);
109 final BatchPluginResource batchResource = (BatchPluginResource) resource;
110 assertEquals("css", batchResource.getType());
111 assertEquals(MODULE_KEY, batchResource.getModuleCompleteKey());
112
113 final Map<String, String> params = new TreeMap<String, String>();
114 params.put("ieonly", "true");
115 params.put("foo", "bar");
116
117 assertEquals(params, batchResource.getParams());
118 }
119
120 public void testParseWithParams2() throws Exception
121 {
122 final Map<String, String> queryParams = new TreeMap<String, String>();
123 queryParams.put("ieonly", "true");
124 queryParams.put("foo", "bar");
125
126 final List<ResourceDescriptor> resourceDescriptors = new ArrayList<ResourceDescriptor>();
127 resourceDescriptors.add(TestUtils.createResourceDescriptor("webresources.css", queryParams));
128 addModuleDescriptor(resourceDescriptors);
129
130 final DownloadableResource resource = builder.parse("/download/batch/" + MODULE_KEY + "/test.plugin:webresources.css", queryParams);
131 final BatchPluginResource batchResource = (BatchPluginResource) resource;
132 assertEquals("css", batchResource.getType());
133 assertEquals(MODULE_KEY, batchResource.getModuleCompleteKey());
134
135 final Map<String, String> params = new TreeMap<String, String>();
136 params.put("ieonly", "true");
137 params.put("foo", "bar");
138
139 assertEquals(params, batchResource.getParams());
140 }
141
142 public void testParseWithParamsAndRandomPrefix() throws Exception
143 {
144 final Map<String, String> queryParams = new TreeMap<String, String>();
145 queryParams.put("ieonly", "true");
146 queryParams.put("foo", "bar");
147 final List<ResourceDescriptor> resourceDescriptors = new ArrayList<ResourceDescriptor>();
148 resourceDescriptors.add(TestUtils.createResourceDescriptor("webresources.css", queryParams));
149 addModuleDescriptor(resourceDescriptors);
150
151 final DownloadableResource resource = builder.parse("/random/stuff/download/batch/" + MODULE_KEY + "/test.plugin:webresources.css",
152 queryParams);
153 final BatchPluginResource batchResource = (BatchPluginResource) resource;
154 assertEquals("css", batchResource.getType());
155 assertEquals(MODULE_KEY, batchResource.getModuleCompleteKey());
156
157 final Map<String, String> params = new TreeMap<String, String>();
158 params.put("ieonly", "true");
159 params.put("foo", "bar");
160
161 assertEquals(params, batchResource.getParams());
162 }
163
164 public void testRoundTrip() throws Exception
165 {
166 final Map<String, String> params = new TreeMap<String, String>();
167 params.put("media", "print");
168
169 final List<ResourceDescriptor> resourceDescriptors = new ArrayList<ResourceDescriptor>();
170 resourceDescriptors.add(TestUtils.createResourceDescriptor("webresources.js", params));
171
172 addModuleDescriptor(resourceDescriptors);
173
174 final String moduleKey = MODULE_KEY;
175 final BatchPluginResource batchResource = new BatchPluginResource(moduleKey, "js", params, Collections.<DownloadableResource> emptyList());
176 final URI uri = new URI(batchResource.getUrl());
177 final BatchPluginResource parsedBatchResource = (BatchPluginResource) builder.parse(uri.getPath(), params);
178 assertEquals(batchResource.getType(), parsedBatchResource.getType());
179 assertEquals(batchResource.getModuleCompleteKey(), parsedBatchResource.getModuleCompleteKey());
180 assertEquals(batchResource.getParams(), parsedBatchResource.getParams());
181 assertEquals(moduleKey + ".js", parsedBatchResource.getResourceName());
182 }
183
184 public void testParseInvlaidUrlThrowsException()
185 {
186 try
187 {
188 builder.parse("/download/batch/blah.css", Collections.<String, String> emptyMap());
189 fail("Should have thrown exception for invalid url");
190 }
191 catch (final UrlParseException e)
192 {
193
194 }
195 }
196
197
198 private void addModuleDescriptor(List<ResourceDescriptor> resourceDescriptors)
199 {
200 moduleDescriptor = TestUtils.createWebResourceModuleDescriptor(MODULE_KEY, plugin, resourceDescriptors);
201 when(mockPluginAccessor.getEnabledPluginModule(MODULE_KEY)).thenReturn((ModuleDescriptor) moduleDescriptor);
202
203 for (ResourceDescriptor resourceDescriptor : resourceDescriptors)
204 {
205
206 DownloadableResource downloadableResourceInBatch = mock(DownloadableResource.class);
207 when(mockResourceFinder.find(MODULE_KEY, resourceDescriptor.getName())).thenReturn(downloadableResourceInBatch);
208 }
209 }
210 }