1   package com.atlassian.maven.plugins.amps.codegen.prompter.common.web;
2   
3   import java.util.List;
4   import java.util.SortedMap;
5   
6   import com.atlassian.maven.plugins.amps.codegen.ConditionFactory;
7   import com.atlassian.maven.plugins.amps.codegen.ContextProviderFactory;
8   import com.atlassian.maven.plugins.amps.codegen.prompter.AbstractModulePrompter;
9   import com.atlassian.maven.plugins.amps.codegen.prompter.AbstractPrompterTest;
10  import com.atlassian.maven.plugins.amps.codegen.prompter.PluginModulePrompter;
11  import com.atlassian.plugins.codegen.modules.common.Condition;
12  import com.atlassian.plugins.codegen.modules.common.Conditional;
13  import com.atlassian.plugins.codegen.modules.common.Conditions;
14  import com.atlassian.plugins.codegen.modules.common.Resource;
15  import com.atlassian.plugins.codegen.modules.common.web.AbstractWebFragmentProperties;
16  
17  import org.apache.commons.collections.MapUtils;
18  import org.apache.commons.lang.StringUtils;
19  import org.codehaus.plexus.components.interactivity.PrompterException;
20  import org.junit.After;
21  import org.junit.Before;
22  
23  import static org.junit.Assert.assertEquals;
24  import static org.junit.Assert.assertTrue;
25  import static org.mockito.Mockito.when;
26  
27  /**
28   * @since 3.5
29   */
30  public abstract class AbstractWebFragmentPrompterTest<T extends AbstractWebFragmentProperties> extends AbstractPrompterTest
31  {
32  
33      public static final String RESOURCE_NAME = "resourceCSS";
34      public static final String RESOURCE_NAME_PATTERN = "templates/*.vm";
35      public static final String DOWNLOAD_TYPE = "download";
36      public static final String VELOCITY_TYPE = "velocity";
37      public static final String RESOURCE_CSS_PATH = "templates/resource.css";
38      public static final String RESOURCE_VM_PATH = "templates/resource.vm";
39      public static final String PARAM_KEY = "paramKey";
40      public static final String PARAM_VAL = "paramVal";
41      public static final String CUSTOM_CONTEXT_PROVIDER = "com.atlassian.plugins.web.CustomContextProvider";
42      public static final String CONDITIONS_TYPE = "AND";
43      public static final String CUSTOM_CONDITION = "com.atlassian.plugins.web.CustomCondition";
44  
45      protected TestingContextProviderFactory contextProviderFactory;
46      protected TestingConditionFactory conditionFactory;
47      protected T props;
48  
49      public void setProps(T props)
50      {
51          this.props = props;
52      }
53  
54      @Before
55      public void setupProviders()
56      {
57          contextProviderFactory = new TestingContextProviderFactory();
58          conditionFactory = new TestingConditionFactory();
59      }
60  
61      @After
62      public void resetProviders()
63      {
64          contextProviderFactory.setProvidersMap(MapUtils.EMPTY_SORTED_MAP);
65          conditionFactory.setConditions(MapUtils.EMPTY_SORTED_MAP);
66      }
67  
68      @Before
69      public void setupCommonPrompts() throws PrompterException
70      {
71  
72          //resources
73          when(prompter.prompt("Add Resource", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
74                  .thenReturn("Y")
75                  .thenReturn("N");
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                  .thenReturn(DOWNLOAD_TYPE);
82          when(prompter.prompt("Enter Location (path to resource file)")).thenReturn(RESOURCE_CSS_PATH)
83                  .thenReturn(RESOURCE_VM_PATH);
84          when(prompter.prompt("Add Resource Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
85                  .thenReturn("N");
86          when(prompter.prompt("params:\nparamKey->paramVal\nAdd Resource Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
87          when(prompter.prompt("param name")).thenReturn(PARAM_KEY);
88          when(prompter.prompt("param value")).thenReturn(PARAM_VAL);
89  
90          //context provider
91          when(prompter.prompt("Add Velocity Context Provider", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y");
92          when(prompter.prompt("Enter Fully Qualified Context Provider Class", AbstractModulePrompter.DEFAULT_BASE_PACKAGE + ".web.contextproviders.MyContextProvider")).thenReturn(CUSTOM_CONTEXT_PROVIDER);
93  
94          //conditions
95          when(prompter.prompt("Add Conditions?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
96                  .thenReturn("N");
97          when(prompter.prompt("Condition Type", PluginModulePrompter.ANDOR_ANSWERS, "AND")).thenReturn(CONDITIONS_TYPE);
98          when(prompter.prompt("Enter Fully Qualified Condition Class", AbstractModulePrompter.DEFAULT_BASE_PACKAGE + ".web.condition.MyCondition")).thenReturn(CUSTOM_CONDITION);
99          when(prompter.prompt("Add Condition?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
100         when(prompter.prompt("Add Condition Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y")
101                 .thenReturn("N");
102         when(prompter.prompt("params:\nparamKey->paramVal\nAdd Condition Parameter?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("N");
103         when(prompter.prompt("Invert Condition?", PluginModulePrompter.YN_ANSWERS, "N")).thenReturn("Y");
104 
105     }
106 
107     protected void assertAdvancedCommonProps()
108     {
109         //resources
110         List<Resource> resources = props.getResources();
111         assertTrue("resources not found", !resources.isEmpty());
112         assertEquals("wrong number of resources", 2, resources.size());
113 
114         Resource cssResource = resources.get(0);
115         Resource vmResource = resources.get(1);
116 
117         assertEquals("wrong css resource name", RESOURCE_NAME, cssResource.getName());
118         assertTrue("css name pattern found when name is set", StringUtils.isBlank(cssResource.getNamePattern()));
119         assertEquals("wrong css resource type", DOWNLOAD_TYPE, cssResource.getType());
120         assertEquals("wrong css resource location", RESOURCE_CSS_PATH, cssResource.getLocation());
121         assertEquals("wrong number of css resource params", 1, cssResource.getParams()
122                 .size());
123         assertTrue("css resource param key not found", cssResource.getParams()
124                 .containsKey(PARAM_KEY));
125         assertEquals("wrong css resource param value", PARAM_VAL, cssResource.getParams()
126                 .get(PARAM_KEY));
127 
128         assertTrue("vm name found when name pattern is set", StringUtils.isBlank(vmResource.getName()));
129         assertEquals("wrong vm resource name pattern", RESOURCE_NAME_PATTERN, vmResource.getNamePattern());
130         assertEquals("wrong vm resource type", VELOCITY_TYPE, vmResource.getType());
131         assertEquals("wrong vm resource location", RESOURCE_VM_PATH, vmResource.getLocation());
132         assertEquals("wrong number of vm resource params", 0, vmResource.getParams()
133                 .size());
134 
135         //context provider (subclasses should check for actual value)
136         assertTrue("context provider is blank", StringUtils.isNotBlank(props.getContextProvider()));
137 
138         //conditions
139         List<Conditional> conditionals = props.getConditions();
140         assertEquals("wrong number of conditionals", 1, conditionals.size());
141 
142         Conditional conditional = conditionals.get(0);
143         assertTrue("first conditional is not Conditions", (conditional instanceof Conditions));
144 
145         Conditions conditions = (Conditions) conditional;
146         assertEquals("wrong conditions type", CONDITIONS_TYPE, conditions.getType());
147 
148         List<Conditional> nestedConditions = conditions.getConditions();
149         assertEquals("wrong number of nested conditiomals", 1, nestedConditions.size());
150 
151         Conditional nestedConditional = nestedConditions.get(0);
152         assertTrue("nested conditional is not a Condition", (nestedConditional instanceof Condition));
153 
154         //subclasses should check actual condition class name
155 
156         Condition condition = (Condition) nestedConditional;
157         assertEquals("wrong number of condition params", 1, condition.getParams()
158                 .size());
159         assertTrue("condition param key not found", condition.getParams()
160                 .containsKey(PARAM_KEY));
161         assertEquals("wrong condition param value", PARAM_VAL, condition.getParams()
162                 .get(PARAM_KEY));
163 
164         assertTrue("condition should be inverted", condition.isInvert());
165     }
166 
167     protected class TestingContextProviderFactory extends ContextProviderFactory
168     {
169         public void setProvidersMap(SortedMap<String, String> map)
170         {
171             providers = map;
172         }
173     }
174 
175     protected class TestingConditionFactory extends ConditionFactory
176     {
177         public void setConditions(SortedMap<String, String> map)
178         {
179             conditions = map;
180         }
181     }
182 }