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