1 package com.atlassian.plugin.webresource;
2
3 import static com.google.common.collect.Iterables.get;
4 import static com.google.common.collect.Iterables.size;
5 import static org.mockito.Mockito.when;
6
7 import com.atlassian.plugin.PluginAccessor;
8 import com.atlassian.plugin.servlet.DownloadableResource;
9
10 import org.mockito.Mock;
11 import org.mockito.MockitoAnnotations;
12
13 import java.util.Collections;
14 import java.util.Map;
15 import java.util.TreeMap;
16
17 import junit.framework.TestCase;
18
19 public class TestContextBatchDownloadableResourceBuilder extends TestCase
20 {
21 @Mock
22 private DefaultResourceDependencyResolver mockDependencyResolver;
23 @Mock
24 private PluginAccessor mockPluginAccessor;
25 @Mock
26 private WebResourceUrlProvider mockWebResourceUrlProvider;
27 @Mock
28 private DownloadableResourceFinder mockResourceFinder;
29
30 private ContextBatchDownloadableResourceBuilder builder;
31
32 @Override
33 public void setUp() throws Exception
34 {
35 super.setUp();
36
37 MockitoAnnotations.initMocks(this);
38 builder = new ContextBatchDownloadableResourceBuilder(mockDependencyResolver, mockPluginAccessor, mockWebResourceUrlProvider,
39 mockResourceFinder);
40 }
41
42 @Override
43 public void tearDown() throws Exception
44 {
45 mockDependencyResolver = null;
46 mockPluginAccessor = null;
47 mockWebResourceUrlProvider = null;
48 mockResourceFinder = null;
49 builder = null;
50
51 super.tearDown();
52 }
53
54 public void testParseCss() throws UrlParseException
55 {
56 final String context = "contexta";
57 createContext(context);
58 final String path = "/download/contextbatch/css/contexta/batch.css";
59 assertTrue(builder.matches(path));
60 final DownloadableResource resource = builder.parse(path, Collections.<String, String> emptyMap());
61 final ContextBatchPluginResource batchResource = (ContextBatchPluginResource) resource;
62 assertEquals("css", batchResource.getType());
63 assertEquals(batchResource.getUrl(), path);
64 assertEquals("batch.css", batchResource.getResourceName());
65 assertEquals(1, size(batchResource.getContexts()));
66 assertEquals(context, get(batchResource.getContexts(), 0));
67 }
68
69 public void testParseCssWithMultipleContexts() throws UrlParseException
70 {
71 createContext("contexta");
72 createContext("contextb");
73 final String path = "/download/contextbatch/css/contexta,contextb/batch.css";
74 assertTrue(builder.matches(path));
75 final DownloadableResource resource = builder.parse(path, Collections.<String, String> emptyMap());
76 final ContextBatchPluginResource batchResource = (ContextBatchPluginResource) resource;
77 assertEquals("css", batchResource.getType());
78 assertEquals(batchResource.getUrl(), path);
79 assertEquals("batch.css", batchResource.getResourceName());
80
81 Iterable<String> contexts = batchResource.getContexts();
82 assertEquals(2, size(contexts));
83
84
85 for (String ctx : contexts)
86 {
87 assertTrue(ctx.equals("contexta") || ctx.equals("contextb"));
88 }
89 }
90
91 public void testParseCssWithMultipleIncludedAndExcludedContexts() throws UrlParseException
92 {
93 createContext("contexta");
94 createContext("contextb");
95 createContext("contextc");
96 createContext("contextd");
97 createContext("contexte");
98
99 final String path = "/download/contextbatch/css/contexta,contextb,-contextc,-contextd,-contexte/batch.css";
100 assertTrue(builder.matches(path));
101 final DownloadableResource resource = builder.parse(path, Collections.<String, String> emptyMap());
102 final ContextBatchPluginResource batchResource = (ContextBatchPluginResource) resource;
103 assertEquals("css", batchResource.getType());
104 assertEquals(batchResource.getUrl(), path);
105 assertEquals("batch.css", batchResource.getResourceName());
106
107 Iterable<String> contexts = batchResource.getContexts();
108 assertEquals(2, size(contexts));
109
110
111 for (String ctx : contexts)
112 {
113 assertTrue(ctx.equals("contexta") || ctx.equals("contextb"));
114 }
115
116 contexts = batchResource.getExcludedContexts();
117 assertEquals(3, size(contexts));
118
119
120 for (String ctx : contexts)
121 {
122 assertTrue(ctx.equals("contextc") || ctx.equals("contextd") || ctx.equals("contexte"));
123 }
124 }
125
126 public void testParseJavascript() throws UrlParseException
127 {
128 createContext("contexta");
129 final String path = "/download/contextbatch/js/contexta/batch.js";
130 assertTrue(builder.matches(path));
131 final DownloadableResource resource = builder.parse(path, Collections.<String, String> emptyMap());
132 final ContextBatchPluginResource batchResource = (ContextBatchPluginResource) resource;
133 assertEquals("js", batchResource.getType());
134 assertEquals(batchResource.getUrl(), path);
135 assertEquals("batch.js", batchResource.getResourceName());
136 assertEquals(1, size(batchResource.getContexts()));
137 assertEquals("contexta", get(batchResource.getContexts(), 0));
138 }
139
140 public void testParseWithParam() throws UrlParseException
141 {
142 createContext("contexta");
143 final String path = "/download/contextbatch/js/contexta/batch.js";
144 final Map<String, String> params = Collections.singletonMap("ieOnly", "true");
145 final DownloadableResource resource = builder.parse(path, params);
146 final ContextBatchPluginResource batchResource = (ContextBatchPluginResource) resource;
147 assertEquals(params, batchResource.getParams());
148 assertEquals(path + "?ieOnly=true", batchResource.getUrl());
149 assertEquals("batch.js", batchResource.getResourceName());
150 }
151
152 public void testParseWithParams() throws UrlParseException
153 {
154 createContext("contexta");
155 final String path = "/download/contextbatch/js/contexta/batch.js";
156 final Map<String, String> params = new TreeMap<String, String>();
157 params.put("ieOnly", "true");
158 params.put("zomg", "false");
159 final DownloadableResource resource = builder.parse(path, params);
160 final ContextBatchPluginResource batchResource = (ContextBatchPluginResource) resource;
161 assertEquals(params, batchResource.getParams());
162 assertEquals(path + "?ieOnly=true&zomg=false", batchResource.getUrl());
163 assertEquals("batch.js", batchResource.getResourceName());
164 }
165
166 public void testMatch()
167 {
168 assertTrue("correct path", builder.matches("/download/contextbatch/css/contexta/batch.css"));
169 assertFalse("wrong path", builder.matches("/download/contextbatch/js/contexta/batch.css"));
170 assertFalse("wrong path", builder.matches("/download/contextbatch/css/contexta/image.png"));
171 }
172
173 private void createContext(String context)
174 {
175 when(mockDependencyResolver.getDependenciesInContext(context)).thenReturn(Collections.<WebResourceModuleDescriptor>emptyList());
176 }
177 }