1   package com.atlassian.plugins.codegen.modules.common.web;
2   
3   import java.util.List;
4   
5   import com.atlassian.plugins.codegen.modules.common.AbstractConditionTest;
6   import com.atlassian.plugins.codegen.modules.common.Resource;
7   
8   import org.dom4j.Document;
9   import org.dom4j.Node;
10  import org.junit.Test;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertNotNull;
14  
15  /**
16   * @since 3.6
17   */
18  
19  public abstract class AbstractWebFragmentTest<T extends AbstractWebFragmentProperties> extends AbstractConditionTest<T>
20  {
21  
22      public static final String JIRA_MODIFIER_KEY_CTX_PROVIDER = "com.atlassian.jira.plugin.webfragment.contextproviders.ModifierKeyContextProvider";
23      public static final String XPATH_CTX_PROVIDER = "//context-provider";
24      public static final String XPATH_RESOURCE = "/atlassian-plugin/*//resource";
25      public static final String XPATH_PARAM_RELATIVE = "param";
26  
27      @Test
28      public void contextProviderIsAdded() throws Exception
29      {
30          props.setContextProvider(JIRA_MODIFIER_KEY_CTX_PROVIDER);
31          creator.createModule(moduleLocation, props);
32  
33          Document pluginDoc = getXmlDocument(pluginXml);
34  
35          List<Node> ctxProviderList = pluginDoc.selectNodes(XPATH_CTX_PROVIDER);
36          assertEquals("wrong number of context providers", 1, ctxProviderList.size());
37  
38          Node ctxProviderNode = ctxProviderList.get(0);
39          assertEquals("wrong context provider class", JIRA_MODIFIER_KEY_CTX_PROVIDER, ctxProviderNode.selectSingleNode("@class")
40                  .getStringValue());
41      }
42  
43      @Test
44      public void singleResourceAdded() throws Exception
45      {
46          Resource resource = new Resource();
47          resource.setName("style.css");
48          resource.setLocation("com/example/plugin/style.css");
49          resource.setType("download");
50  
51          props.getResources()
52                  .add(resource);
53  
54          creator.createModule(moduleLocation, props);
55  
56          Document pluginDoc = getXmlDocument(pluginXml);
57          List<Node> resourceList = pluginDoc.selectNodes(XPATH_RESOURCE);
58  
59          assertEquals("expected single resource", 1, resourceList.size());
60  
61          String nodeXpath = "//resource[@name='style.css' and @location='com/example/plugin/style.css' and @type='download']";
62          assertNotNull("single resource not found", pluginDoc.selectSingleNode(nodeXpath));
63  
64      }
65  
66      @Test
67      public void singleResourceNamePatternAdded() throws Exception
68      {
69          Resource resource = new Resource();
70          resource.setNamePattern("*.css");
71          resource.setLocation("com/example/plugin/style.css");
72          resource.setType("download");
73  
74          props.getResources()
75                  .add(resource);
76  
77          creator.createModule(moduleLocation, props);
78  
79          Document pluginDoc = getXmlDocument(pluginXml);
80          List<Node> resourceList = pluginDoc.selectNodes(XPATH_RESOURCE);
81  
82          assertEquals("expected single resource", 1, resourceList.size());
83  
84          String nodeXpath = "//resource[@namePattern='*.css' and @location='com/example/plugin/style.css' and @type='download']";
85          assertNotNull("single resource not found", pluginDoc.selectSingleNode(nodeXpath));
86  
87      }
88  
89      @Test
90      public void nameChosenOverPattern() throws Exception
91      {
92          Resource resource = new Resource();
93          resource.setName("style.css");
94          resource.setNamePattern("*.css");
95          resource.setLocation("com/example/plugin/style.css");
96          resource.setType("download");
97  
98          props.getResources()
99                  .add(resource);
100 
101         creator.createModule(moduleLocation, props);
102 
103         Document pluginDoc = getXmlDocument(pluginXml);
104         List<Node> resourceList = pluginDoc.selectNodes(XPATH_RESOURCE);
105 
106         assertEquals("expected single resource", 1, resourceList.size());
107 
108         String nodeXpath = "//resource[not(@namePattern) and @name='style.css' and @location='com/example/plugin/style.css' and @type='download']";
109         assertNotNull("single resource not found", pluginDoc.selectSingleNode(nodeXpath));
110 
111     }
112 
113     @Test
114     public void resourceParamsAdded() throws Exception
115     {
116         Resource resource = new Resource();
117         resource.setName("style.css");
118         resource.setLocation("com/example/plugin/style.css");
119         resource.setType("download");
120         resource.getParams()
121                 .put("content-type", "text/css");
122         resource.getParams()
123                 .put("awesome", "me");
124 
125         props.getResources()
126                 .add(resource);
127 
128         creator.createModule(moduleLocation, props);
129 
130         Document pluginDoc = getXmlDocument(pluginXml);
131         List<Node> resourceList = pluginDoc.selectNodes(XPATH_RESOURCE);
132 
133         assertEquals("expected single resource", 1, resourceList.size());
134 
135         String nodeXpath = "//resource[not(@namePattern) and @name='style.css' and @location='com/example/plugin/style.css' and @type='download']";
136         Node resourceNode = pluginDoc.selectSingleNode(nodeXpath);
137 
138         List<Node> paramList = resourceNode.selectNodes(XPATH_PARAM_RELATIVE);
139         assertEquals("expected resource params", 2, paramList.size());
140 
141         assertNotNull("missing content param", resourceNode.selectSingleNode("param[@name='content-type' and @value='text/css']"));
142         assertNotNull("missing awesome param", resourceNode.selectSingleNode("param[@name='awesome' and @value='me']"));
143 
144     }
145 
146     @Test
147     public void multipleResourcesAdded() throws Exception
148     {
149         Resource resource = new Resource();
150         resource.setName("style.css");
151         resource.setLocation("com/example/plugin/style.css");
152         resource.setType("download");
153         resource.getParams()
154                 .put("content-type", "text/css");
155         resource.getParams()
156                 .put("awesome", "me");
157 
158         Resource resource2 = new Resource();
159         resource2.setName("custom.js");
160         resource2.setLocation("com/example/plugin/custom.js");
161         resource2.setType("download");
162 
163         props.getResources()
164                 .add(resource);
165         props.getResources()
166                 .add(resource2);
167 
168         creator.createModule(moduleLocation, props);
169 
170         Document pluginDoc = getXmlDocument(pluginXml);
171         List<Node> resourceList = pluginDoc.selectNodes(XPATH_RESOURCE);
172 
173         assertEquals("expected multiple resources", 2, resourceList.size());
174 
175         String nodeXpath = "//resource[not(@namePattern) and @name='style.css' and @location='com/example/plugin/style.css' and @type='download']";
176         String node2Xpath = "//resource[not(@namePattern) and @name='custom.js' and @location='com/example/plugin/custom.js' and @type='download']";
177 
178         assertNotNull("missing css resource", pluginDoc.selectSingleNode(nodeXpath));
179         assertNotNull("missing js resource", pluginDoc.selectSingleNode(node2Xpath));
180 
181     }
182 }