View Javadoc

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          // ordering of contexts is not important
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         // ordering of contexts is not important
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         // ordering of contexts is not important
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 }