1   package com.atlassian.plugins.codegen.modules.jira;
2   
3   import java.io.File;
4   import java.util.List;
5   import java.util.regex.Matcher;
6   
7   import com.atlassian.plugins.codegen.AbstractCodegenTestCase;
8   import com.atlassian.plugins.codegen.modules.PluginModuleLocation;
9   
10  import org.dom4j.Document;
11  import org.dom4j.Node;
12  import org.junit.Before;
13  import org.junit.Test;
14  
15  import static org.junit.Assert.*;
16  
17  /**
18   * @since 3.6
19   */
20  public class WebworkTest extends AbstractCodegenTestCase<WebworkProperties>
21  {
22      public static final String PACKAGE_NAME = "com.atlassian.plugins.jira.webwork";
23  
24      @Before
25      public void runGenerator() throws Exception
26      {
27          setCreator(new WebworkModuleCreator());
28          setModuleLocation(new PluginModuleLocation.Builder(srcDir)
29                  .resourcesDirectory(resourcesDir)
30                  .testDirectory(testDir)
31                  .templateDirectory(templateDir)
32                  .build());
33  
34          setProps(new WebworkProperties("My Webwork"));
35  
36          props.setIncludeExamples(false);
37  
38      }
39  
40      @Test
41      public void singleActionFilesAreGenerated() throws Exception
42      {
43          ActionProperties action = new ActionProperties(PACKAGE_NAME + ".ActionOne");
44          props.addAction(action);
45          creator.createModule(moduleLocation, props);
46  
47          String packagePath = PACKAGE_NAME.replaceAll("\\.", Matcher.quoteReplacement(File.separator));
48          assertTrue("action class not generated", new File(srcDir, packagePath + File.separator + "ActionOne.java").exists());
49          assertTrue("action test class not generated", new File(testDir, packagePath + File.separator + "ActionOneTest.java").exists());
50          assertTrue("plugin.xml not generated", new File(resourcesDir, "atlassian-plugin.xml").exists());
51  
52      }
53  
54      @Test
55      public void multipleActionFilesAreGenerated() throws Exception
56      {
57          ActionProperties action1 = new ActionProperties(PACKAGE_NAME + ".ActionOne");
58          ActionProperties action2 = new ActionProperties(PACKAGE_NAME + ".ActionTwo");
59          props.addAction(action1);
60          props.addAction(action2);
61          creator.createModule(moduleLocation, props);
62  
63          String packagePath = PACKAGE_NAME.replaceAll("\\.", Matcher.quoteReplacement(File.separator));
64          assertTrue("action one class not generated", new File(srcDir, packagePath + File.separator + "ActionOne.java").exists());
65          assertTrue("action one test class not generated", new File(testDir, packagePath + File.separator + "ActionOneTest.java").exists());
66          assertTrue("action two class not generated", new File(srcDir, packagePath + File.separator + "ActionTwo.java").exists());
67          assertTrue("action two test class not generated", new File(testDir, packagePath + File.separator + "ActionTwoTest.java").exists());
68          assertTrue("plugin.xml not generated", new File(resourcesDir, "atlassian-plugin.xml").exists());
69  
70      }
71  
72      @Test
73      public void singleActionSingleViewModuleIsValid() throws Exception
74      {
75          String actionOneFQName = PACKAGE_NAME + ".ActionOne";
76          ActionProperties action = new ActionProperties(actionOneFQName);
77          View successView = new View("success", "templates/success.vm");
78          action.addView(successView);
79          props.addAction(action);
80          creator.createModule(moduleLocation, props);
81  
82          String webworkXpath = "/atlassian-plugin/webwork1[@name='My Webwork' and @key='my-webwork' and @i18n-name-key='my-webwork.name']";
83  
84          creator.createModule(moduleLocation, props);
85          Document pluginDoc = getXmlDocument(pluginXml);
86          Node webworkNode = pluginDoc.selectSingleNode(webworkXpath);
87  
88          assertNotNull("valid webwork not found", webworkNode);
89  
90          List<Node> actions = webworkNode.selectNodes("actions/action");
91          assertEquals("wrong number of actions found", 1, actions.size());
92  
93          Node actionOneNode = webworkNode.selectSingleNode("actions/action[@name='" + actionOneFQName + "' and @alias='ActionOne']");
94          assertNotNull("action node not found", actionOneNode);
95  
96          List<Node> views = actionOneNode.selectNodes("view");
97          assertEquals("wrong number of views", 1, views.size());
98  
99          Node successNode = actionOneNode.selectSingleNode("view[@name='success' and text()='templates/success.vm']");
100         assertNotNull("success view not found", successNode);
101 
102         File successFile = new File(moduleLocation.getTemplateDirectory(), "success.vm");
103         assertTrue("view file does not exist!", successFile.exists());
104     }
105 
106     @Test
107     public void singleActionMultipleViewModuleIsValid() throws Exception
108     {
109         String actionOneFQName = PACKAGE_NAME + ".ActionOne";
110         ActionProperties action = new ActionProperties(actionOneFQName);
111         View successView = new View("success", "templates/success.vm");
112         View errorView = new View("error", "templates/error.vm");
113         action.addView(successView);
114         action.addView(errorView);
115         props.addAction(action);
116         creator.createModule(moduleLocation, props);
117 
118         String webworkXpath = "/atlassian-plugin/webwork1[@name='My Webwork' and @key='my-webwork' and @i18n-name-key='my-webwork.name']";
119 
120         creator.createModule(moduleLocation, props);
121         Document pluginDoc = getXmlDocument(pluginXml);
122         Node webworkNode = pluginDoc.selectSingleNode(webworkXpath);
123 
124         assertNotNull("valid webwork not found", webworkNode);
125 
126         List<Node> actions = webworkNode.selectNodes("actions/action");
127         assertEquals("wrong number of actions found", 1, actions.size());
128 
129         Node actionOneNode = webworkNode.selectSingleNode("actions/action[@name='" + actionOneFQName + "' and @alias='ActionOne']");
130         assertNotNull("action node not found", actionOneNode);
131 
132         List<Node> views = actionOneNode.selectNodes("view");
133         assertEquals("wrong number of views", 2, views.size());
134 
135         Node successNode = actionOneNode.selectSingleNode("view[@name='success' and text()='templates/success.vm']");
136         assertNotNull("success view not found", successNode);
137 
138         File successFile = new File(moduleLocation.getTemplateDirectory(), "success.vm");
139         assertTrue("success file does not exist!", successFile.exists());
140 
141         Node errorNode = actionOneNode.selectSingleNode("view[@name='error' and text()='templates/error.vm']");
142         assertNotNull("error view not found", errorNode);
143 
144         File errorFile = new File(moduleLocation.getTemplateDirectory(), "error.vm");
145         assertTrue("error file does not exist!", errorFile.exists());
146     }
147 
148     @Test
149     public void multipleActionMultipleViewModuleIsValid() throws Exception
150     {
151         String actionOneFQName = PACKAGE_NAME + ".ActionOne";
152         String actionTwoFQName = PACKAGE_NAME + ".ActionTwo";
153 
154         ActionProperties actionOne = new ActionProperties(actionOneFQName);
155         View successView = new View("success", "/templates/subdir/success.vm");
156         View errorView = new View("error", "templates/subdir/error.vm");
157         actionOne.addView(successView);
158         actionOne.addView(errorView);
159 
160         ActionProperties actionTwo = new ActionProperties(actionTwoFQName);
161         View inputView = new View("input", "templates/input.vm");
162         actionTwo.addView(inputView);
163 
164         props.addAction(actionOne);
165         props.addAction(actionTwo);
166         creator.createModule(moduleLocation, props);
167 
168         String webworkXpath = "/atlassian-plugin/webwork1[@name='My Webwork' and @key='my-webwork' and @i18n-name-key='my-webwork.name']";
169 
170         creator.createModule(moduleLocation, props);
171         Document pluginDoc = getXmlDocument(pluginXml);
172         Node webworkNode = pluginDoc.selectSingleNode(webworkXpath);
173 
174         assertNotNull("valid webwork not found", webworkNode);
175 
176         List<Node> actions = webworkNode.selectNodes("actions/action");
177         assertEquals("wrong number of actions found", 2, actions.size());
178 
179         Node actionOneNode = webworkNode.selectSingleNode("actions/action[@name='" + actionOneFQName + "' and @alias='ActionOne']");
180         Node actionTwoNode = webworkNode.selectSingleNode("actions/action[@name='" + actionTwoFQName + "' and @alias='ActionTwo']");
181 
182         assertNotNull("action one node not found", actionOneNode);
183         assertNotNull("action two node not found", actionTwoNode);
184 
185         List<Node> viewsOne = actionOneNode.selectNodes("view");
186         assertEquals("actionOne - wrong number of views", 2, viewsOne.size());
187 
188         List<Node> viewsTwo = actionTwoNode.selectNodes("view");
189         assertEquals("actionTwo - wrong number of views", 1, viewsTwo.size());
190 
191         Node successNode = actionOneNode.selectSingleNode("view[@name='success' and text()='/templates/subdir/success.vm']");
192         assertNotNull("success view not found", successNode);
193 
194         File successFile = new File(moduleLocation.getTemplateDirectory(), "subdir/success.vm");
195         assertTrue("success file does not exist!", successFile.exists());
196 
197         Node errorNode = actionOneNode.selectSingleNode("view[@name='error' and text()='templates/subdir/error.vm']");
198         assertNotNull("error view not found", errorNode);
199 
200         File errorFile = new File(moduleLocation.getTemplateDirectory(), "subdir/error.vm");
201         assertTrue("error file does not exist!", errorFile.exists());
202 
203         Node inputNode = actionTwoNode.selectSingleNode("view[@name='input' and text()='templates/input.vm']");
204         assertNotNull("input view not found", inputNode);
205 
206         File inputFile = new File(moduleLocation.getTemplateDirectory(), "input.vm");
207         assertTrue("input file does not exist!", inputFile.exists());
208     }
209 
210 }