1   package com.atlassian.plugins.codegen.modules.common;
2   
3   import com.atlassian.plugins.codegen.AbstractModuleCreatorTestCase;
4   import com.atlassian.plugins.codegen.modules.PluginModuleCreator;
5   import com.atlassian.plugins.codegen.modules.common.web.AbstractConditionsProperties;
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  public abstract class AbstractConditionTest<T extends AbstractConditionsProperties> extends AbstractModuleCreatorTestCase<T>
17  {
18      public static final String XPATH_ALL_CONDITIONS = "//conditions";
19      public static final String XPATH_TOP_CONDITIONS = "/atlassian-plugin/*[not(self::conditions)]/conditions";
20      public static final String XPATH_CONDITIONS_RELATIVE = "conditions";
21      public static final String XPATH_ALL_CONDITION = "//condition";
22      public static final String XPATH_TOP_CONDITION = "/atlassian-plugin/*[not(self::conditions)]/condition";
23      public static final String XPATH_CONDITION_RELATIVE = "condition";
24      public static final String JIRA_GLOBAL_PERMISSION = "com.atlassian.jira.plugin.webfragment.conditions.JiraGlobalPermissionCondition";
25      public static final String JIRA_HAS_ISSUE_PERMISSION = "com.atlassian.jira.plugin.webfragment.conditions.HasIssuePermissionCondition";
26      public static final String XPATH_PARAM_RELATIVE = "param";
27  
28      protected AbstractConditionTest(String moduleType, PluginModuleCreator<T> creator)
29      {
30          super(moduleType, creator);
31      }
32      
33      @Test
34      public void emptyConditionsAreNotIncluded() throws Exception
35      {
36          assertEquals(0, getGeneratedModule().selectNodes("//condition").size());
37      }
38  
39      @Test
40      public void singleConditionAdded() throws Exception
41      {
42          props.getConditions().add(new Condition(JIRA_GLOBAL_PERMISSION));
43          
44          assertNotNull(getGeneratedModule().selectSingleNode("//condition"));
45      }
46  
47      @Test
48      public void conditionHasClass() throws Exception
49      {
50          props.getConditions().add(new Condition(JIRA_GLOBAL_PERMISSION));
51          
52          assertEquals(JIRA_GLOBAL_PERMISSION, getGeneratedModule().selectSingleNode("//condition/@class").getText());
53      }
54      
55      @Test
56      public void conditionIsNotInverted() throws Exception
57      {
58          props.getConditions().add(new Condition(JIRA_GLOBAL_PERMISSION));
59          
60          assertNull(JIRA_GLOBAL_PERMISSION, getGeneratedModule().selectSingleNode("//condition/@invert"));
61      }
62      
63      @Test
64      public void invertedConditionHasAttribute() throws Exception
65      {
66          Condition jiraCondition = new Condition(JIRA_GLOBAL_PERMISSION);
67          jiraCondition.setInvert(true);
68  
69          props.getConditions().add(jiraCondition);
70          
71          assertEquals("true", getGeneratedModule().selectSingleNode("//condition/@invert").getText());
72      }
73  
74      @Test
75      public void singleANDConditionsAdded() throws Exception
76      {
77          createSingleConditions(Conditions.AND);
78  
79          assertNotNull(getGeneratedModule().selectSingleNode("//conditions"));
80      }
81      
82      @Test
83      public void singleANDConditionsHasType() throws Exception
84      {
85          createSingleConditions(Conditions.AND);
86  
87          assertEquals(Conditions.AND, getGeneratedModule().selectSingleNode("//conditions/@type").getText());
88      }
89      
90      @Test
91      public void singleANDConditionsHasCondition() throws Exception
92      {
93          createSingleConditions(Conditions.AND);
94  
95          assertNotNull(getGeneratedModule().selectSingleNode("//conditions/condition"));
96      }
97  
98      @Test
99      public void singleORConditionsAdded() throws Exception
100     {
101         createSingleConditions(Conditions.OR);
102 
103         assertNotNull(getGeneratedModule().selectSingleNode("//conditions"));
104     }
105 
106     @Test
107     public void singleORConditionsHasType() throws Exception
108     {
109         createSingleConditions(Conditions.OR);
110 
111         assertEquals(Conditions.OR, getGeneratedModule().selectSingleNode("//conditions/@type").getText());
112     }
113 
114     @Test
115     public void nestedMixedConditionsAdded() throws Exception
116     {
117         createNestedMixedConditions();
118 
119         assertNotNull(getGeneratedModule().selectSingleNode("//conditions"));
120     }
121     
122     @Test
123     public void nestedMixedConditionsHasType() throws Exception
124     {
125         createNestedMixedConditions();
126 
127         assertEquals(Conditions.AND, getGeneratedModule().selectSingleNode("//conditions/@type").getText());
128     }
129     
130     @Test
131     public void nestedMixedConditionsHasNestedType() throws Exception
132     {
133         createNestedMixedConditions();
134 
135         assertEquals(Conditions.OR, getGeneratedModule().selectSingleNode("//conditions/conditions/@type").getText());
136     }
137     
138     @Test
139     public void nestedMixedConditionsHasClass() throws Exception
140     {
141         createNestedMixedConditions();
142 
143         assertEquals(JIRA_GLOBAL_PERMISSION, getGeneratedModule().selectSingleNode("//conditions/condition/@class").getText());
144     }
145 
146     @Test
147     public void nestedMixedConditionsHasNestedClass() throws Exception
148     {
149         createNestedMixedConditions();
150 
151         assertEquals(JIRA_HAS_ISSUE_PERMISSION, getGeneratedModule().selectSingleNode("//conditions/conditions/condition/@class").getText());
152     }
153 
154     @Test
155     public void conditionCanBeSiblingOfConditions() throws Exception
156     {
157         Conditions conditionsRoot = new Conditions(Conditions.AND);
158         conditionsRoot.addCondition(new Condition(JIRA_GLOBAL_PERMISSION));
159 
160         Condition singleCondition = new Condition(JIRA_HAS_ISSUE_PERMISSION);
161 
162         props.getConditions().add(conditionsRoot);
163         props.getConditions().add(singleCondition);
164 
165         assertNotNull(getGeneratedModule().selectSingleNode("//condition"));
166     }
167     
168     @Test
169     public void conditionsCanBeSiblingOfConditions() throws Exception
170     {
171         Conditions conditionsRoot = new Conditions(Conditions.AND);
172         conditionsRoot.addCondition(new Condition(JIRA_GLOBAL_PERMISSION));
173 
174         Condition singleCondition = new Condition(JIRA_HAS_ISSUE_PERMISSION);
175 
176         props.getConditions().add(conditionsRoot);
177         props.getConditions().add(singleCondition);
178 
179         assertNotNull(getGeneratedModule().selectSingleNode("//conditions/condition"));
180     }
181 
182     @Test
183     public void conditionParamsAreAdded() throws Exception
184     {
185         Condition condition = new Condition(JIRA_GLOBAL_PERMISSION);
186         condition.getParams().put("permission", "admin");
187         condition.getParams().put("username", "user");
188 
189         props.getConditions().add(condition);
190 
191         assertEquals(2, getGeneratedModule().selectNodes("//condition/param").size());
192     }
193 
194     @Test
195     public void conditionParamHasName() throws Exception
196     {
197         Condition condition = new Condition(JIRA_GLOBAL_PERMISSION);
198         condition.getParams().put("permission", "admin");
199 
200         props.getConditions().add(condition);
201 
202         assertEquals("permission", getGeneratedModule().selectSingleNode("//condition/param/@name").getText());
203     }
204 
205     @Test
206     public void conditionParamHasValue() throws Exception
207     {
208         Condition condition = new Condition(JIRA_GLOBAL_PERMISSION);
209         condition.getParams().put("permission", "admin");
210 
211         props.getConditions().add(condition);
212 
213         assertEquals("admin", getGeneratedModule().selectSingleNode("//condition/param/@value").getText());
214     }
215     
216     protected void createSingleConditions(String type)
217     {
218         Conditions conditionsRoot = new Conditions(type);
219         conditionsRoot.addCondition(new Condition(JIRA_GLOBAL_PERMISSION));
220 
221         props.getConditions().add(conditionsRoot);
222     }
223     
224     protected void createNestedMixedConditions()
225     {
226         Conditions conditionsRoot = new Conditions(Conditions.AND);
227         conditionsRoot.addCondition(new Condition(JIRA_GLOBAL_PERMISSION));
228 
229         Conditions nestedConditions = new Conditions(Conditions.OR);
230         nestedConditions.addCondition(new Condition(JIRA_HAS_ISSUE_PERMISSION));
231 
232         conditionsRoot.addCondition(nestedConditions);
233         props.getConditions().add(conditionsRoot);
234     }
235 }