1   package com.atlassian.plugins.codegen.modules.common.web;
2   
3   import com.atlassian.plugins.codegen.modules.common.AbstractConditionTest;
4   import com.atlassian.plugins.codegen.modules.common.Resource;
5   
6   import org.junit.Before;
7   import org.junit.Test;
8   
9   import static junit.framework.Assert.assertNotNull;
10  import static org.junit.Assert.assertEquals;
11  import static org.junit.Assert.assertNull;
12  
13  /**
14   * @since 3.6
15   */
16  public class WebResourceTest extends AbstractConditionTest<WebResourceProperties>
17  {
18      public static final String MODULE_NAME = "Awesome Web Resource";
19      public static final String XPATH_RESOURCE = "/atlassian-plugin/web-resource/resource";
20      public static final String DEPENDENCY1 = "jira.web.resources:ajs";
21      public static final String DEPENDENCY2 = "jira.web.resources:jquery";
22      public static final String CONTEXT1 = "atl.general";
23      public static final String CONTEXT2 = "atl.userprofile";
24      
25      public WebResourceTest()
26      {
27          super("web-resource", new WebResourceModuleCreator());
28      }
29      
30      @Before
31      public void setupProps() throws Exception
32      {
33          setProps(new WebResourceProperties(MODULE_NAME));
34          props.setIncludeExamples(false);
35      }
36  
37      @Test
38      public void moduleHasDefaultKey() throws Exception
39      {
40          assertEquals("awesome-web-resource", getGeneratedModule().attributeValue("key"));
41      }
42      
43      @Test
44      public void dependenciesAreAdded() throws Exception
45      {
46          createDependencies();
47          
48          assertEquals(2, getGeneratedModule().selectNodes("//dependency").size());
49      }
50  
51      @Test
52      public void dependency1HasValue() throws Exception
53      {
54          createDependencies();
55          
56          assertNotNull(getGeneratedModule().selectSingleNode("//dependency[text() = '" + DEPENDENCY1 + "'"));
57      }
58  
59      @Test
60      public void dependency2HasValue() throws Exception
61      {
62          createDependencies();
63          
64          assertNotNull(getGeneratedModule().selectSingleNode("//dependency[text() = '" + DEPENDENCY2 + "'"));
65      }
66  
67      @Test
68      public void contextsAreAdded() throws Exception
69      {
70          createContexts();
71  
72          assertEquals(2, getGeneratedModule().selectNodes("//context").size());
73      }
74  
75      @Test
76      public void context1HasValue() throws Exception
77      {
78          createContexts();
79          
80          assertNotNull(getGeneratedModule().selectSingleNode("//context[text() = '" + CONTEXT1 + "'"));
81      }
82  
83      @Test
84      public void context2HasValue() throws Exception
85      {
86          createContexts();
87          
88          assertNotNull(getGeneratedModule().selectSingleNode("//context[text() = '" + CONTEXT2 + "'"));
89      }
90  
91      @Test
92      public void transformationWithSingleTransformerAdded() throws Exception
93      {
94          createSingleTransformer();
95  
96          assertNotNull(getGeneratedModule().selectSingleNode("//transformation"));
97      }
98  
99      @Test
100     public void transformationWithSingleTransformerHasTransformer() throws Exception
101     {
102         createSingleTransformer();
103 
104         assertNotNull(getGeneratedModule().selectSingleNode("//transformation/transformer"));
105     }
106 
107     @Test
108     public void transformationWithSingleTransformerHasExtension() throws Exception
109     {
110         createSingleTransformer();
111 
112         assertEquals("txt", getGeneratedModule().selectSingleNode("//transformation/@extension").getText());
113     }
114 
115     @Test
116     public void transformationWithSingleTransformerHasTransformerKey() throws Exception
117     {
118         createSingleTransformer();
119 
120         assertEquals("template", getGeneratedModule().selectSingleNode("//transformation/transformer/@key").getText());
121     }
122 
123     @Test
124     public void singleTransformationWithMultipleTransformersAdded() throws Exception
125     {
126         createMultipleTransformers();
127 
128         assertEquals(2, getGeneratedModule().selectNodes("//transformation/transformer").size());
129     }
130 
131     @Test
132     public void singleTransformationWithMultipleTransformersHasTransformer1Key() throws Exception
133     {
134         createMultipleTransformers();
135 
136         assertEquals("template", getGeneratedModule().selectSingleNode("//transformation/transformer[1]/@key").getText());
137     }
138 
139     @Test
140     public void singleTransformationWithMultipleTransformersHasTransformer2Key() throws Exception
141     {
142         createMultipleTransformers();
143 
144         assertEquals("prefix", getGeneratedModule().selectSingleNode("//transformation/transformer[2]/@key").getText());
145     }
146 
147     @Test
148     public void multipleTransformationsAdded() throws Exception
149     {
150         createMultipleTransformations();
151 
152         assertEquals(2, getGeneratedModule().selectNodes("//transformation").size());
153     }
154 
155     @Test
156     public void multipleTransformationsHasTransformation1Extension() throws Exception
157     {
158         createMultipleTransformations();
159         
160         assertEquals("txt", getGeneratedModule().selectSingleNode("//transformation[1]/@extension").getText());
161     }
162 
163     @Test
164     public void multipleTransformationsHasTransformation2Extension() throws Exception
165     {
166         createMultipleTransformations();
167         
168         assertEquals("css", getGeneratedModule().selectSingleNode("//transformation[2]/@extension").getText());
169     }
170     
171     @Test
172     public void multipleTransformationsHasTransformer1Key() throws Exception
173     {
174         createMultipleTransformations();
175         
176         assertEquals("template", getGeneratedModule().selectSingleNode("//transformation[1]/transformer/@key").getText());
177     }
178 
179     @Test
180     public void multipleTransformationsHasTransformer2Key() throws Exception
181     {
182         createMultipleTransformations();
183         
184         assertEquals("prefix", getGeneratedModule().selectSingleNode("//transformation[2]/transformer/@key").getText());
185     }
186 
187     @Test
188     public void resourceIsAdded() throws Exception
189     {
190         props.getResources().add(cssResource);
191         
192         assertNotNull(getGeneratedModule().selectSingleNode("resource"));
193     }
194     
195     @Test
196     public void resourceHasName() throws Exception
197     {
198         props.getResources().add(cssResource);
199         
200         assertEquals("style.css", getGeneratedModule().selectSingleNode("resource/@name").getText());
201     }
202 
203     @Test
204     public void resourceHasLocation() throws Exception
205     {
206         props.getResources().add(cssResource);
207 
208         assertEquals("com/example/plugin/style.css", getGeneratedModule().selectSingleNode("resource/@location").getText());
209     }
210     
211     @Test
212     public void resourceHasType() throws Exception
213     {
214         props.getResources().add(cssResource);
215 
216         assertEquals("download", getGeneratedModule().selectSingleNode("resource/@type").getText());
217     }
218 
219     @Test
220     public void namePatternResourceAdded() throws Exception
221     {
222         props.getResources().add(cssNamePatternResource);
223 
224         assertNotNull(getGeneratedModule().selectSingleNode("resource"));
225     }
226     
227     @Test
228     public void namePatternResourceHasNamePattern() throws Exception
229     {
230         props.getResources().add(cssNamePatternResource);
231         
232         assertEquals("*.css", getGeneratedModule().selectSingleNode("resource/@namePattern").getText());
233     }
234 
235     @Test
236     public void namePatternResourceHasLocation() throws Exception
237     {
238         props.getResources().add(cssNamePatternResource);
239         
240         assertEquals("com/example/plugin", getGeneratedModule().selectSingleNode("resource/@location").getText());
241     }
242 
243     @Test
244     public void namePatternResourceHasType() throws Exception
245     {
246         props.getResources().add(cssNamePatternResource);
247 
248         assertEquals("download", getGeneratedModule().selectSingleNode("resource/@type").getText());
249     }
250 
251     @Test
252     public void resourceNameChosenOverPattern() throws Exception
253     {
254         cssResource.setNamePattern("*.css");
255         props.getResources().add(cssResource);
256 
257         assertNull(getGeneratedModule().selectSingleNode("resource/@namePattern"));
258     }
259 
260     @Test
261     public void resourceParamHasName() throws Exception
262     {
263         cssResource.getParams().put("content-type", "text/css");
264         props.getResources().add(cssResource);
265 
266         assertEquals("content-type", getGeneratedModule().selectSingleNode("resource/param/@name").getText());
267     }
268 
269     @Test
270     public void resourceParamHasValue() throws Exception
271     {
272         cssResource.getParams().put("content-type", "text/css");
273         props.getResources().add(cssResource);
274 
275         assertEquals("text/css", getGeneratedModule().selectSingleNode("resource/param/@value").getText());
276     }
277     
278     @Test
279     public void secondResourceParamAdded() throws Exception
280     {
281         cssResource.getParams().put("content-type", "text/css");
282         cssResource.getParams().put("awesome", "me");
283         props.getResources().add(cssResource);
284         
285         assertEquals("me", getGeneratedModule().selectSingleNode("resource/param[@name='awesome']/@value").getText());
286     }
287 
288     @Test
289     public void allResourceParamsAdded() throws Exception
290     {
291         cssResource.getParams().put("content-type", "text/css");
292         cssResource.getParams().put("awesome", "me");
293         props.getResources().add(cssResource);
294         
295         assertEquals(2, getGeneratedModule().selectNodes("resource/param").size());
296     }
297 
298     @Test
299     public void secondResourceAdded() throws Exception
300     {
301         Resource resource2 = new Resource();
302         resource2.setName("custom.js");
303         resource2.setLocation("com/example/plugin/custom.js");
304         resource2.setType("download");
305 
306         props.getResources().add(cssResource);
307         props.getResources().add(resource2);
308         
309         assertEquals("com/example/plugin/custom.js",
310                      getGeneratedModule().selectSingleNode("resource[@name='custom.js']/@location").getText());
311     }
312 
313     @Test
314     public void allResourcesAdded() throws Exception
315     {
316         Resource resource2 = new Resource();
317         resource2.setName("custom.js");
318         resource2.setLocation("com/example/plugin/custom.js");
319         resource2.setType("download");
320 
321         props.getResources().add(cssResource);
322         props.getResources().add(resource2);
323         
324         assertEquals(2, getGeneratedModule().selectNodes("resource").size());
325     }
326 
327     @Test
328     public void nonBatchResourceAdded() throws Exception
329     {
330         cssResource.setBatch(false);
331         
332         props.getResources().add(cssResource);
333         
334         assertEquals("false", getGeneratedModule().selectSingleNode("//resource/param[@name='batch']/@value").getText());
335     }
336 
337     protected void createDependencies()
338     {
339         props.getResources().add(cssResource);
340 
341         props.addDependency(DEPENDENCY1);
342         props.addDependency(DEPENDENCY2);
343     }
344     
345     protected void createContexts()
346     {
347         props.getResources().add(cssResource);
348 
349         props.addContext(CONTEXT1);
350         props.addContext(CONTEXT2);
351     }
352     
353     protected void createSingleTransformer()
354     {
355         props.getResources().add(cssResource);
356 
357         WebResourceTransformation transformation = new WebResourceTransformation("txt");
358         addTransformerWithKey(transformation, "template");
359 
360         props.addTransformation(transformation);
361     }
362 
363     protected void createMultipleTransformers()
364     {
365         props.getResources().add(cssResource);
366 
367         WebResourceTransformation transformation = new WebResourceTransformation("txt");
368         addTransformerWithKey(transformation, "template");
369         addTransformerWithKey(transformation, "prefix");
370 
371         props.addTransformation(transformation);
372     }
373     
374     protected void createMultipleTransformations()
375     {
376         props.getResources().add(cssResource);
377 
378         WebResourceTransformation txtTrans = new WebResourceTransformation("txt");
379         addTransformerWithKey(txtTrans, "template");
380 
381         WebResourceTransformation cssTrans = new WebResourceTransformation("css");
382         addTransformerWithKey(cssTrans, "prefix");
383 
384         props.addTransformation(txtTrans);
385         props.addTransformation(cssTrans);
386     }
387 
388     private void addTransformerWithKey(WebResourceTransformation transformation, String transformerKey)
389     {
390         WebResourceTransformer transformer = new WebResourceTransformer();
391         transformer.setModuleKey(transformerKey);
392         transformation.addTransformer(transformer);
393     }
394 }