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
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
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
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
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
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
136 assertTrue("context provider is blank", StringUtils.isNotBlank(props.getContextProvider()));
137
138
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
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 }