1   package com.atlassian.plugins.codegen.modules.common.web;
2   
3   import com.atlassian.plugins.codegen.modules.PluginModuleCreator;
4   import com.atlassian.plugins.codegen.modules.common.AbstractConditionTest;
5   import com.atlassian.plugins.codegen.modules.common.Resource;
6   
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  
17  public abstract class AbstractWebFragmentTest<T extends AbstractWebFragmentProperties> extends AbstractConditionTest<T>
18  {
19      public static final String JIRA_MODIFIER_KEY_CTX_PROVIDER = "com.atlassian.jira.plugin.webfragment.contextproviders.ModifierKeyContextProvider";
20      public static final String XPATH_CTX_PROVIDER = "//context-provider";
21      public static final String MODULE_NAME = "My Web Thing";
22      public static final String MODULE_KEY = "my-web-thing";
23      
24      protected AbstractWebFragmentTest(String moduleType, PluginModuleCreator<T> creator)
25      {
26          super(moduleType, creator);
27      }
28          
29      @Test
30      public void moduleHasDefaultKey() throws Exception
31      {
32          assertEquals(MODULE_KEY, getGeneratedModule().attributeValue("key"));
33      }
34      
35      @Test
36      public void moduleHasDefaultI18nNameKey() throws Exception
37      {
38          assertEquals(MODULE_KEY + ".name", getGeneratedModule().attributeValue("i18n-name-key"));
39      }
40  
41      @Test
42      public void contextProviderIsAdded() throws Exception
43      {
44          props.setContextProvider(JIRA_MODIFIER_KEY_CTX_PROVIDER);
45  
46          getGeneratedModule();
47      }
48  
49      @Test
50      public void contextProviderHasClass() throws Exception
51      {
52          props.setContextProvider(JIRA_MODIFIER_KEY_CTX_PROVIDER);
53  
54          assertEquals(JIRA_MODIFIER_KEY_CTX_PROVIDER,
55                       getGeneratedModule().selectSingleNode(XPATH_CTX_PROVIDER + "/@class").getText());
56      }
57  
58      @Test
59      public void resourceIsAdded() throws Exception
60      {
61          props.getResources().add(cssResource);
62          
63          assertNotNull(getGeneratedModule().selectSingleNode("resource"));
64      }
65      
66      @Test
67      public void resourceHasName() throws Exception
68      {
69          props.getResources().add(cssResource);
70          
71          assertEquals("style.css", getGeneratedModule().selectSingleNode("resource/@name").getText());
72      }
73  
74      @Test
75      public void resourceHasLocation() throws Exception
76      {
77          props.getResources().add(cssResource);
78  
79          assertEquals("com/example/plugin/style.css", getGeneratedModule().selectSingleNode("resource/@location").getText());
80      }
81      
82      @Test
83      public void resourceHasType() throws Exception
84      {
85          props.getResources().add(cssResource);
86  
87          assertEquals("download", getGeneratedModule().selectSingleNode("resource/@type").getText());
88      }
89  
90      @Test
91      public void namePatternResourceAdded() throws Exception
92      {
93          props.getResources().add(cssNamePatternResource);
94  
95          assertNotNull(getGeneratedModule().selectSingleNode("resource"));
96      }
97      
98      @Test
99      public void namePatternResourceHasNamePattern() throws Exception
100     {
101         props.getResources().add(cssNamePatternResource);
102         
103         assertEquals("*.css", getGeneratedModule().selectSingleNode("resource/@namePattern").getText());
104     }
105 
106     @Test
107     public void namePatternResourceHasLocation() throws Exception
108     {
109         props.getResources().add(cssNamePatternResource);
110         
111         assertEquals("com/example/plugin", getGeneratedModule().selectSingleNode("resource/@location").getText());
112     }
113 
114     @Test
115     public void namePatternResourceHasType() throws Exception
116     {
117         props.getResources().add(cssNamePatternResource);
118 
119         assertEquals("download", getGeneratedModule().selectSingleNode("resource/@type").getText());
120     }
121 
122     @Test
123     public void resourceNameChosenOverPattern() throws Exception
124     {
125         cssResource.setNamePattern("*.css");
126         props.getResources().add(cssResource);
127 
128         assertNull(getGeneratedModule().selectSingleNode("resource/@namePattern"));
129     }
130 
131     @Test
132     public void resourceParamHasName() throws Exception
133     {
134         cssResource.getParams().put("content-type", "text/css");
135         props.getResources().add(cssResource);
136 
137         assertEquals("content-type", getGeneratedModule().selectSingleNode("resource/param/@name").getText());
138     }
139 
140     @Test
141     public void resourceParamHasValue() throws Exception
142     {
143         cssResource.getParams().put("content-type", "text/css");
144         props.getResources().add(cssResource);
145 
146         assertEquals("text/css", getGeneratedModule().selectSingleNode("resource/param/@value").getText());
147     }
148     
149     @Test
150     public void secondResourceParamAdded() throws Exception
151     {
152         cssResource.getParams().put("content-type", "text/css");
153         cssResource.getParams().put("awesome", "me");
154         props.getResources().add(cssResource);
155         
156         assertEquals("me", getGeneratedModule().selectSingleNode("resource/param[@name='awesome']/@value").getText());
157     }
158 
159     @Test
160     public void allResourceParamsAdded() throws Exception
161     {
162         cssResource.getParams().put("content-type", "text/css");
163         cssResource.getParams().put("awesome", "me");
164         props.getResources().add(cssResource);
165         
166         assertEquals(2, getGeneratedModule().selectNodes("resource/param").size());
167     }
168 
169     @Test
170     public void secondResourceAdded() throws Exception
171     {
172         Resource resource2 = new Resource();
173         resource2.setName("custom.js");
174         resource2.setLocation("com/example/plugin/custom.js");
175         resource2.setType("download");
176 
177         props.getResources().add(cssResource);
178         props.getResources().add(resource2);
179         
180         assertEquals("com/example/plugin/custom.js",
181                      getGeneratedModule().selectSingleNode("resource[@name='custom.js']/@location").getText());
182     }
183 
184     @Test
185     public void allResourcesAdded() throws Exception
186     {
187         Resource resource2 = new Resource();
188         resource2.setName("custom.js");
189         resource2.setLocation("com/example/plugin/custom.js");
190         resource2.setType("download");
191 
192         props.getResources().add(cssResource);
193         props.getResources().add(resource2);
194         
195         assertEquals(2, getGeneratedModule().selectNodes("resource").size());
196     }
197 }