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