1   package com.atlassian.maven.plugins.amps.codegen.prompter.common.web;
2   
3   import java.util.Arrays;
4   import java.util.List;
5   
6   import com.atlassian.maven.plugins.amps.codegen.prompter.AbstractModulePrompter;
7   import com.atlassian.maven.plugins.amps.codegen.prompter.AbstractPrompterTest;
8   import com.atlassian.maven.plugins.amps.codegen.prompter.PluginModulePrompter;
9   import com.atlassian.plugins.codegen.modules.common.Condition;
10  import com.atlassian.plugins.codegen.modules.common.Conditional;
11  import com.atlassian.plugins.codegen.modules.common.Conditions;
12  import com.atlassian.plugins.codegen.modules.common.Resource;
13  import com.atlassian.plugins.codegen.modules.common.web.WebResourceProperties;
14  import com.atlassian.plugins.codegen.modules.common.web.WebResourceTransformation;
15  
16  import org.apache.commons.lang.StringUtils;
17  import org.codehaus.plexus.components.interactivity.Prompter;
18  import org.codehaus.plexus.components.interactivity.PrompterException;
19  import org.junit.Before;
20  import org.junit.Test;
21  
22  import static com.atlassian.maven.plugins.amps.codegen.prompter.AbstractModulePrompter.MODULE_DESCRIP_PROMPT;
23  import static com.atlassian.maven.plugins.amps.codegen.prompter.AbstractModulePrompter.MODULE_KEY_PROMPT;
24  import static org.junit.Assert.assertEquals;
25  import static org.junit.Assert.assertTrue;
26  import static org.mockito.Mockito.mock;
27  import static org.mockito.Mockito.when;
28  
29  /**
30   * @since 3.6
31   */
32  public class WebResourcePrompterTest extends AbstractPrompterTest
33  {
34      public static final String MODULE_NAME = "My Web Resource";
35      public static final String MODULE_KEY = "my-web-resource";
36      public static final String DESCRIPTION = "The My Web Resource Plugin";
37      public static final String I18N_NAME_KEY = "my-web-resource.name";
38      public static final String I18N_DESCRIPTION_KEY = "my-web-resource.description";
39  
40      public static final String ADV_MODULE_NAME = "My Awesome Plugin";
41      public static final String ADV_MODULE_KEY = "awesome-module";
42      public static final String ADV_DESCRIPTION = "The Awesomest Plugin Ever";
43      public static final String ADV_I18N_NAME_KEY = "awesome-plugin.name";
44      public static final String ADV_I18N_DESCRIPTION_KEY = "pluginus-awesomeous.description";
45  
46      public static final String RESOURCE_NAME = "resourceCSS";
47      public static final String RESOURCE_NAME_PATTERN = "templates/*.vm";
48      public static final String DOWNLOAD_TYPE = "download";
49      public static final String VELOCITY_TYPE = "velocity";
50      public static final String RESOURCE_CSS_PATH = "templates/resource.css";
51      public static final String RESOURCE_VM_PATH = "templates/resource.vm";
52      public static final String PARAM_KEY = "paramKey";
53      public static final String PARAM_VAL = "paramVal";
54      public static final String DEPENDENCY = "web.resources:ajs";
55  
56      public static final String CUSTOM_CONTEXT = "my.context";
57      public static final String TRANS_EXTENSION = "css";
58      public static final String TRANS_KEY = "template";
59  
60      public static final String CONDITIONS_TYPE = "AND";
61      public static final String CUSTOM_CONDITION = "com.atlassian.plugins.web.CustomCondition";
62  
63      Prompter prompter;
64  
65      @Before
66      public void setup()
67      {
68          prompter = mock(Prompter.class);
69      }
70  
71      @Test
72      public void basicPropertiesAreValid() throws PrompterException
73      {
74          when(prompter.prompt("Enter Plugin Module Name", "My Web Resource")).thenReturn(MODULE_NAME);
75  
76          when(prompter.prompt("Enter Resource Name (leave blank to use namePattern)")).thenReturn(RESOURCE_NAME)
77                  .thenReturn("");
78          when(prompter.prompt("Enter Resource Name Pattern")).thenReturn(RESOURCE_NAME_PATTERN);
79          when(prompter.prompt("Enter Resource Type", "download")).thenReturn(DOWNLOAD_TYPE)
80                  .thenReturn(VELOCITY_TYPE);
81          when(prompter.prompt("Enter Location (path to resource file)")).thenReturn(RESOURCE_CSS_PATH)
82                  .thenReturn(RESOURCE_VM_PATH);
83          when(prompter.prompt("Add Resource Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
84                  .thenReturn("N");
85          when(prompter.prompt("params:\nparamKey->paramVal\nAdd Resource Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
86          when(prompter.prompt("param name")).thenReturn(PARAM_KEY);
87          when(prompter.prompt("param value")).thenReturn(PARAM_VAL);
88          when(prompter.prompt("Add Resource", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
89                  .thenReturn("N");
90  
91          when(prompter.prompt("Show Advanced Setup?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
92          when(prompter.prompt("Include Example Code?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
93  
94          WebResourcePrompter modulePrompter = new WebResourcePrompter(prompter);
95          modulePrompter.setUseAnsiColor(false);
96          WebResourceProperties props = modulePrompter.getModulePropertiesFromInput(moduleLocation);
97  
98          assertEquals("wrong module name", MODULE_NAME, props.getModuleName());
99          assertEquals("wrong module key", MODULE_KEY, props.getModuleKey());
100         assertEquals("wrong description", DESCRIPTION, props.getDescription());
101         assertEquals("wrong i18n name key", I18N_NAME_KEY, props.getNameI18nKey());
102         assertEquals("wrong i18n desc key", I18N_DESCRIPTION_KEY, props.getDescriptionI18nKey());
103     }
104 
105     @Test
106     public void advancedPropertiesAreValid() throws PrompterException
107     {
108         when(prompter.prompt("Enter Plugin Module Name", "My Web Resource")).thenReturn(MODULE_NAME);
109 
110         when(prompter.prompt("Enter Resource Name (leave blank to use namePattern)")).thenReturn(RESOURCE_NAME)
111                 .thenReturn("");
112         when(prompter.prompt("Enter Resource Name Pattern")).thenReturn(RESOURCE_NAME_PATTERN);
113         when(prompter.prompt("Enter Resource Type", "download")).thenReturn(DOWNLOAD_TYPE)
114                 .thenReturn(VELOCITY_TYPE);
115         when(prompter.prompt("Enter Location (path to resource file)")).thenReturn(RESOURCE_CSS_PATH)
116                 .thenReturn(RESOURCE_VM_PATH);
117         when(prompter.prompt("Add Resource Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
118                 .thenReturn("N");
119         when(prompter.prompt("params:\nparamKey->paramVal\nAdd Resource Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
120         when(prompter.prompt("param name")).thenReturn(PARAM_KEY);
121         when(prompter.prompt("param value")).thenReturn(PARAM_VAL);
122         when(prompter.prompt("Add Resource", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
123                 .thenReturn("N");
124 
125         when(prompter.prompt("Show Advanced Setup?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y");
126 
127         when(prompter.prompt(MODULE_KEY_PROMPT, MODULE_KEY)).thenReturn(ADV_MODULE_KEY);
128         when(prompter.prompt(MODULE_DESCRIP_PROMPT, DESCRIPTION)).thenReturn(ADV_DESCRIPTION);
129         when(prompter.prompt("i18n Name Key", I18N_NAME_KEY)).thenReturn(ADV_I18N_NAME_KEY);
130         when(prompter.prompt("i18n Description Key", I18N_DESCRIPTION_KEY)).thenReturn(ADV_I18N_DESCRIPTION_KEY);
131 
132         when(prompter.prompt("Add Dependency?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y");
133         when(prompter.prompt("Enter Dependency")).thenReturn(DEPENDENCY);
134         when(prompter.prompt("values:\nweb.resources:ajs\nAdd Dependency?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
135 
136         when(prompter.prompt("Add Web Resource Context?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
137                 .thenReturn("Y")
138                 .thenReturn("N");
139         when(prompter.prompt("Choose A Context\n1: atl.general\n2: atl.admin\n3: atl.userprofile\n4: Custom Context\nChoose a number: ", Arrays.asList("1", "2", "3", "4"), "1")).thenReturn("2");
140         when(prompter.prompt("Choose A Context\n1: atl.general\n2: atl.userprofile\n3: Custom Context\nChoose a number: ", Arrays.asList("1", "2", "3"), "1")).thenReturn("3");
141         when(prompter.prompt("Enter Context")).thenReturn(CUSTOM_CONTEXT);
142 
143         when(prompter.prompt("Add Web Resource Transformation?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
144                 .thenReturn("N");
145         when(prompter.prompt("File Extension")).thenReturn(TRANS_EXTENSION);
146         when(prompter.prompt("Transformer Key")).thenReturn(TRANS_KEY);
147         when(prompter.prompt("Add Transformer Key?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
148 
149         when(prompter.prompt("Add Conditions?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
150                 .thenReturn("N");
151         when(prompter.prompt("Condition Type", PluginModulePrompter.ANDOR_ANSWERS, "AND")).thenReturn(CONDITIONS_TYPE);
152         when(prompter.prompt("Enter Fully Qualified Condition Class", AbstractModulePrompter.DEFAULT_BASE_PACKAGE + ".web.condition.MyCondition")).thenReturn(CUSTOM_CONDITION);
153         when(prompter.prompt("Add Condition?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
154         when(prompter.prompt("Add Condition Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
155                 .thenReturn("N");
156         when(prompter.prompt("params:\nparamKey->paramVal\nAdd Condition Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
157         when(prompter.prompt("Invert Condition?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y");
158 
159         when(prompter.prompt("Include Example Code?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
160 
161         WebResourcePrompter modulePrompter = new WebResourcePrompter(prompter);
162         modulePrompter.setUseAnsiColor(false);
163         WebResourceProperties props = modulePrompter.getModulePropertiesFromInput(moduleLocation);
164 
165         assertEquals("wrong adv module name", MODULE_NAME, props.getModuleName());
166         assertEquals("wrong adv module key", ADV_MODULE_KEY, props.getModuleKey());
167         assertEquals("wrong adv description", ADV_DESCRIPTION, props.getDescription());
168         assertEquals("wrong adv i18n name key", ADV_I18N_NAME_KEY, props.getNameI18nKey());
169         assertEquals("wrong adv i18n desc key", ADV_I18N_DESCRIPTION_KEY, props.getDescriptionI18nKey());
170 
171         //resources
172         List<Resource> resources = props.getResources();
173         assertTrue("resources not found", !resources.isEmpty());
174         assertEquals("wrong number of resources", 2, resources.size());
175 
176         Resource cssResource = resources.get(0);
177         Resource vmResource = resources.get(1);
178 
179         assertEquals("wrong css resource name", RESOURCE_NAME, cssResource.getName());
180         assertTrue("css name pattern found when name is set", StringUtils.isBlank(cssResource.getNamePattern()));
181         assertEquals("wrong css resource type", DOWNLOAD_TYPE, cssResource.getType());
182         assertEquals("wrong css resource location", RESOURCE_CSS_PATH, cssResource.getLocation());
183         assertEquals("wrong number of css resource params", 1, cssResource.getParams()
184                 .size());
185         assertTrue("css resource param key not found", cssResource.getParams()
186                 .containsKey(PARAM_KEY));
187         assertEquals("wrong css resource param value", PARAM_VAL, cssResource.getParams()
188                 .get(PARAM_KEY));
189 
190         assertTrue("vm name found when name pattern is set", StringUtils.isBlank(vmResource.getName()));
191         assertEquals("wrong vm resource name pattern", RESOURCE_NAME_PATTERN, vmResource.getNamePattern());
192         assertEquals("wrong vm resource type", VELOCITY_TYPE, vmResource.getType());
193         assertEquals("wrong vm resource location", RESOURCE_VM_PATH, vmResource.getLocation());
194         assertEquals("wrong number of vm resource params", 0, vmResource.getParams()
195                 .size());
196 
197         //dependencies
198         List<String> dependencies = props.getDependencies();
199         assertEquals("wrong number of dependencies", 1, dependencies.size());
200         assertEquals("wronf dependency value", DEPENDENCY, dependencies.get(0));
201 
202         //contexts
203         List<String> contexts = props.getContexts();
204         assertEquals("wrong number of contexts", 2, contexts.size());
205         assertTrue("admin context not found", contexts.contains("atl.admin"));
206         assertTrue("custom context not found", contexts.contains(CUSTOM_CONTEXT));
207 
208         //transformations
209         List<WebResourceTransformation> transformations = props.getTransformations();
210         assertEquals("wrong number of transformations", 1, transformations.size());
211 
212         WebResourceTransformation transformation = transformations.get(0);
213         assertEquals("wrong transformation extension", TRANS_EXTENSION, transformation.getExtension());
214 
215         List<String> keys = transformation.getTransformerKeys();
216         assertEquals("wrong number of transfromer keys", 1, keys.size());
217         assertEquals("worng transformer key", TRANS_KEY, keys.get(0));
218 
219         //conditions
220         List<Conditional> conditionals = props.getConditions();
221         assertEquals("wrong number of conditionals", 1, conditionals.size());
222 
223         Conditional conditional = conditionals.get(0);
224         assertTrue("first conditional is not Conditions", (conditional instanceof Conditions));
225 
226         Conditions conditions = (Conditions) conditional;
227         assertEquals("wrong conditions type", CONDITIONS_TYPE, conditions.getType());
228 
229         List<Conditional> nestedConditions = conditions.getConditions();
230         assertEquals("wrong number of nested conditiomals", 1, nestedConditions.size());
231 
232         Conditional nestedConditional = nestedConditions.get(0);
233         assertTrue("nested conditional is not a Condition", (nestedConditional instanceof Condition));
234 
235         Condition condition = (Condition) nestedConditional;
236         assertEquals("wrong number of condition params", 1, condition.getParams()
237                 .size());
238         assertTrue("condition param key not found", condition.getParams()
239                 .containsKey(PARAM_KEY));
240         assertEquals("wrong condition param value", PARAM_VAL, condition.getParams()
241                 .get(PARAM_KEY));
242 
243         assertTrue("condition should be inverted", condition.isInvert());
244 
245 
246     }
247 }