1 package com.atlassian.plugin.webresource;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.PluginInformation;
5 import com.atlassian.plugin.elements.ResourceDescriptor;
6 import com.atlassian.plugin.elements.ResourceLocation;
7 import com.mockobjects.dynamic.Mock;
8 import org.dom4j.DocumentException;
9 import org.dom4j.DocumentHelper;
10
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17 import java.util.TreeMap;
18
19 public class TestUtils
20 {
21 static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey, final Plugin p)
22 {
23 return createWebResourceModuleDescriptor(completeKey, p, Collections.<ResourceDescriptor>emptyList(), Collections.<String>emptyList());
24 }
25
26 static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey,
27 final Plugin p, final List<ResourceDescriptor> resourceDescriptors)
28 {
29 return createWebResourceModuleDescriptor(completeKey, p, resourceDescriptors, Collections.<String>emptyList());
30 }
31
32 static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey,
33 final Plugin p, final List<ResourceDescriptor> resourceDescriptors, final List<String> dependencies)
34 {
35 return createWebResourceModuleDescriptor(completeKey, p, resourceDescriptors, dependencies, Collections.<String>emptySet());
36 }
37
38 static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey,
39 final Plugin p, final List<ResourceDescriptor> resourceDescriptors, final List<String> dependencies, final Set<String> contexts)
40 {
41 return new WebResourceModuleDescriptor()
42 {
43 @Override
44 public String getCompleteKey()
45 {
46 return completeKey;
47 }
48
49 @Override
50 public List<ResourceDescriptor> getResourceDescriptors()
51 {
52 return resourceDescriptors;
53 }
54
55 @Override
56 public List<ResourceDescriptor> getResourceDescriptors(String type)
57 {
58 return resourceDescriptors;
59 }
60
61 @Override
62 public String getPluginKey()
63 {
64 return p.getKey();
65 }
66
67 @Override
68 public Plugin getPlugin()
69 {
70 return p;
71 }
72
73 @Override
74 public List<String> getDependencies()
75 {
76 return dependencies;
77 }
78
79 @Override
80 public Set<String> getContexts()
81 {
82 return contexts;
83 }
84
85 @Override
86 public ResourceLocation getResourceLocation(String type, String name)
87 {
88 if ("download".equals(type))
89 {
90 return new ResourceLocation("", name, type, "", "", Collections.<String, String>emptyMap());
91 }
92 return super.getResourceLocation(type, name);
93 }
94 };
95 }
96
97 static List<ResourceDescriptor> createResourceDescriptors(String... resourceNames) throws DocumentException
98 {
99 List<ResourceDescriptor> resourceDescriptors = new ArrayList<ResourceDescriptor>();
100 for(String resourceName : resourceNames)
101 {
102 resourceDescriptors.add(createResourceDescriptor(resourceName));
103 }
104 return resourceDescriptors;
105 }
106
107 static ResourceDescriptor createResourceDescriptor(String resourceName) throws DocumentException
108 {
109 return createResourceDescriptor(resourceName, new TreeMap<String, String>());
110 }
111
112 static ResourceDescriptor createResourceDescriptor(String resourceName, Map<String, String> parameters) throws DocumentException
113 {
114 String xml = "<resource type=\"download\" name=\"" + resourceName + "\" location=\"/includes/css/" + resourceName + "\">\n" +
115 "<param name=\"source\" value=\"webContextStatic\"/>\n";
116
117 if(resourceName.indexOf("ie") != -1)
118 parameters.put("ieonly", "true");
119
120 for(String key : parameters.keySet())
121 {
122 xml += "<param name=\"" + escapeXMLCharacters(key) + "\" value=\"" + escapeXMLCharacters(parameters.get(key)) + "\"/>\n";
123 }
124
125 xml += "</resource>";
126 return new ResourceDescriptor(DocumentHelper.parseText(xml).getRootElement());
127 }
128
129 static void setupSuperbatchTestContent(TestResourceBatchingConfiguration resourceBatchingConfiguration, Mock mockPluginAccessor, Plugin testPlugin)
130 throws DocumentException
131 {
132 resourceBatchingConfiguration.enabled = true;
133
134 ResourceDescriptor masterCssResource = TestUtils.createResourceDescriptor("master.css");
135 ResourceDescriptor ieOnlyasterCssResource = TestUtils.createResourceDescriptor("master.css", Collections.singletonMap("ieonly", "true"));
136 ResourceDescriptor irrelevantParameterCssResource = TestUtils.createResourceDescriptor("two.css", Collections.singletonMap("fish", "true"));
137 ResourceDescriptor masterJavascriptResource = TestUtils.createResourceDescriptor("master.js");
138
139 ResourceDescriptor pluginCssResource = TestUtils.createResourceDescriptor("plugin.css");
140 ResourceDescriptor pluginJsResource = TestUtils.createResourceDescriptor("plugin.js");
141
142 WebResourceModuleDescriptor master = TestUtils.createWebResourceModuleDescriptor("test.atlassian:superbatch", testPlugin, Arrays.asList(masterCssResource, ieOnlyasterCssResource, masterJavascriptResource, irrelevantParameterCssResource));
143 WebResourceModuleDescriptor plugin = TestUtils.createWebResourceModuleDescriptor("test.atlassian:superbatch2", testPlugin, Arrays.asList(pluginCssResource, pluginJsResource));
144
145 mockPluginAccessor.matchAndReturn("getEnabledPluginModule", "test.atlassian:superbatch", master);
146 mockPluginAccessor.matchAndReturn("getEnabledPluginModule", "test.atlassian:superbatch2", plugin);
147 mockPluginAccessor.matchAndReturn("getEnabledPluginModule", "test.atlassian:missing-plugin", null);
148 }
149
150 private static String escapeXMLCharacters(String input)
151 {
152 return input.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
153 }
154
155 static Plugin createTestPlugin()
156 {
157 return createTestPlugin("test.atlassian", "1");
158 }
159
160 static Plugin createTestPlugin(String pluginKey, String version)
161 {
162 final Mock mockPlugin = new Mock(Plugin.class);
163 PluginInformation pluginInfo = new PluginInformation();
164 pluginInfo.setVersion(version);
165 mockPlugin.matchAndReturn("getPluginInformation", pluginInfo);
166 mockPlugin.matchAndReturn("getKey", pluginKey);
167
168 return (Plugin) mockPlugin.proxy();
169 }
170 }