1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.hr.test;
17
18 import java.io.File;
19 import java.util.ArrayList;
20 import java.util.Calendar;
21 import java.util.List;
22
23 import org.apache.log4j.Logger;
24 import org.junit.Assert;
25 import org.kuali.hr.time.test.HtmlUnitUtil;
26 import org.kuali.hr.time.test.TkTestConstants;
27 import org.kuali.hr.time.util.*;
28 import org.kuali.rice.core.api.config.property.Config;
29 import org.kuali.rice.core.api.config.property.ConfigContext;
30 import org.kuali.rice.core.api.lifecycle.BaseLifecycle;
31 import org.kuali.rice.core.api.lifecycle.Lifecycle;
32 import org.kuali.rice.core.impl.services.CoreImplServiceLocator;
33 import org.kuali.rice.krad.UserSession;
34 import org.kuali.rice.krad.service.KRADServiceLocatorInternal;
35 import org.kuali.rice.krad.util.GlobalVariables;
36 import org.kuali.rice.krad.util.MessageMap;
37 import org.kuali.rice.test.RiceInternalSuiteDataTestCase;
38 import org.kuali.rice.test.TransactionalLifecycle;
39 import org.kuali.rice.test.lifecycles.JettyServerLifecycle;
40 import org.kuali.rice.test.lifecycles.JettyServerLifecycle.ConfigMode;
41 import org.kuali.rice.test.lifecycles.KPMEXmlDataLoaderLifecycle;
42 import org.springframework.cache.CacheManager;
43 import org.springframework.mock.web.MockHttpServletRequest;
44
45 import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput;
46 import com.gargoylesoftware.htmlunit.html.HtmlElement;
47 import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
48 import com.gargoylesoftware.htmlunit.html.HtmlForm;
49 import com.gargoylesoftware.htmlunit.html.HtmlHiddenInput;
50 import com.gargoylesoftware.htmlunit.html.HtmlInput;
51 import com.gargoylesoftware.htmlunit.html.HtmlPage;
52 import com.gargoylesoftware.htmlunit.html.HtmlRadioButtonInput;
53 import com.gargoylesoftware.htmlunit.html.HtmlSelect;
54 import com.gargoylesoftware.htmlunit.html.HtmlTextArea;
55 import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
56
57
58
59
60 public abstract class KPMETestCase extends RiceInternalSuiteDataTestCase {
61
62 private static final String FILE_PREFIX = System.getProperty("user.dir") + "/src/main/config/workflow/";
63
64 private static final String RELATIVE_WEBAPP_ROOT = "/src/main/webapp";
65
66 private TransactionalLifecycle transactionalLifecycle;
67
68 @Override
69 protected String getModuleName() {
70 return "kpme";
71 }
72
73 @Override
74 public void setUp() throws Exception {
75 if (System.getProperty("basedir") == null) {
76 System.setProperty("basedir", System.getProperty("user.dir") + "/");
77 }
78
79 super.setUp();
80
81 GlobalVariables.setMessageMap(new MessageMap());
82
83 final boolean needsSpring = false;
84 if (needsSpring) {
85 transactionalLifecycle = new TransactionalLifecycle();
86 transactionalLifecycle.setTransactionManager(KRADServiceLocatorInternal.getTransactionManager());
87 transactionalLifecycle.start();
88 }
89
90 new ClearDatabaseLifecycle().start();
91
92 new LoadDatabaseDataLifeCycle(this.getClass()).start();
93
94
95 GlobalVariables.setUserSession(new UserSession("admin"));
96 TKContext.setHttpServletRequest(new MockHttpServletRequest());
97 }
98
99 @Override
100 public void tearDown() throws Exception {
101
102
103
104 TKUser.clearTargetUser();
105 new DatabaseCleanupDataLifecycle(this.getClass()).start();
106
107 final boolean needsSpring = true;
108 if (needsSpring) {
109 if ( (transactionalLifecycle != null) && (transactionalLifecycle.isStarted()) ) {
110 transactionalLifecycle.stop();
111 }
112 }
113
114 GlobalVariables.setMessageMap(new MessageMap());
115
116 super.tearDown();
117 }
118
119 @Override
120 protected List<Lifecycle> getPerTestLifecycles() {
121 List<Lifecycle> lifecycles = super.getPerTestLifecycles();
122 lifecycles.add(new ClearCacheLifecycle());
123 return lifecycles;
124 }
125 @Override
126 protected List<Lifecycle> getSuiteLifecycles() {
127 List<Lifecycle> lifecycles = super.getPerTestLifecycles();
128 lifecycles.add(new Lifecycle() {
129 boolean started = false;
130
131 public boolean isStarted() {
132 return this.started;
133 }
134
135 public void start() throws Exception {
136 setModuleName(getModuleName());
137 setBaseDirSystemProperty(getModuleName());
138 Config config = getTestHarnessConfig();
139 ConfigContext.init(config);
140 this.started = true;
141 }
142
143 public void stop() throws Exception {
144 this.started = false;
145 }
146 });
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 lifecycles.add(new Lifecycle() {
165 private JettyServerLifecycle jettyServerLifecycle;
166
167 public boolean isStarted() {
168 return jettyServerLifecycle.isStarted();
169 }
170
171 public void start() throws Exception {
172 System.setProperty("web.bootstrap.spring.file", "classpath:TestHarnessSpringBeans.xml");
173 jettyServerLifecycle = new JettyServerLifecycle(HtmlUnitUtil.getPort(), HtmlUnitUtil.getContext(), RELATIVE_WEBAPP_ROOT);
174 jettyServerLifecycle.setConfigMode(ConfigMode.OVERRIDE);
175 jettyServerLifecycle.start();
176 }
177
178 public void stop() throws Exception {
179 this.jettyServerLifecycle.stop();
180 }
181 });
182
183 ClearDatabaseLifecycle clearDatabaseLifecycle = new ClearDatabaseLifecycle();
184 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_T");
185 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_RSP_T");
186 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_DLGN_RSP_T");
187 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_ATTR_T");
188 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_TMPL_T");
189 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_DOC_TYP_T");
190 lifecycles.add(clearDatabaseLifecycle);
191
192 File[] files = new File(FILE_PREFIX).listFiles();
193 if (files != null) {
194 for (File file : files) {
195 if (file.getName().endsWith(".xml")) {
196 lifecycles.add(new KPMEXmlDataLoaderLifecycle(FILE_PREFIX + file.getName()));
197 }
198 }
199 }
200 return lifecycles;
201 }
202
203 protected final void setFieldValue(HtmlPage page, String fieldId, String fieldValue) {
204 HtmlElement element = page.getHtmlElementById(fieldId);
205 Assert.assertTrue("element " + fieldId + " is null, page: " + page.asText(), element != null);
206
207 if (element instanceof HtmlTextInput) {
208 HtmlTextInput textField = (HtmlTextInput) element;
209 textField.setValueAttribute(fieldValue);
210 } else if (element instanceof HtmlTextArea) {
211 HtmlTextArea textAreaField = (HtmlTextArea) element;
212 textAreaField.setText(fieldValue);
213 } else if (element instanceof HtmlHiddenInput) {
214 HtmlHiddenInput hiddenField = (HtmlHiddenInput) element;
215 hiddenField.setValueAttribute(fieldValue);
216 } else if (element instanceof HtmlSelect) {
217 HtmlSelect selectField = (HtmlSelect) element;
218 try {
219 selectField.setSelectedAttribute(fieldValue, true);
220 } catch (IllegalArgumentException e) {
221 Assert.fail("select element [" + element.asText() + "] " + e.getMessage());
222 }
223 } else if (element instanceof HtmlCheckBoxInput) {
224 HtmlCheckBoxInput checkboxField = (HtmlCheckBoxInput) element;
225 if (fieldValue.equals("on")) {
226 checkboxField.setChecked(true);
227 } else if (fieldValue.equals("off")) {
228 checkboxField.setChecked(false);
229 } else {
230 Assert.assertTrue("Invalid checkbox value", false);
231 }
232 } else if (element instanceof HtmlFileInput) {
233 HtmlFileInput fileInputField = (HtmlFileInput) element;
234 fileInputField.setValueAttribute(fieldValue);
235 } else if (element instanceof HtmlRadioButtonInput) {
236 HtmlRadioButtonInput radioButton = (HtmlRadioButtonInput) element;
237 if (fieldValue.equals("on")) {
238 radioButton.setChecked(true);
239 } else if (fieldValue.equals("off")) {
240 radioButton.setChecked(false);
241 }
242 } else {
243 Assert.fail("Unknown control field: " + fieldId);
244 }
245 }
246
247 public void futureEffectiveDateValidation(String baseUrl) throws Exception {
248 HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(baseUrl);
249 Assert.assertNotNull(page);
250
251 HtmlForm form = page.getFormByName("KualiForm");
252 Assert.assertNotNull("Search form was missing from page.", form);
253
254 setFieldValue(page, "document.newMaintainableObject.effectiveDate", "04/01/2011");
255 HtmlInput input = HtmlUnitUtil.getInputContainingText(form, "methodToCall.route");
256 Assert.assertNotNull("Could not locate submit button", input);
257 page = page.getElementByName("methodToCall.route").click();
258 Assert.assertTrue("page text does not contain:\n" + TkTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(TkTestConstants.EFFECTIVE_DATE_ERROR));
259 Calendar futureDate = Calendar.getInstance();
260 futureDate.add(java.util.Calendar.YEAR, 2);
261 String futureDateString = "01/01/" + Integer.toString(futureDate.get(Calendar.YEAR));
262
263
264 setFieldValue(page, "document.newMaintainableObject.effectiveDate", futureDateString);
265 page = page.getElementByName("methodToCall.route").click();
266 Assert.assertTrue("page text does not contain:\n" + TkTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(TkTestConstants.EFFECTIVE_DATE_ERROR));
267 Calendar validDate = Calendar.getInstance();
268 validDate.add(java.util.Calendar.MONTH, 5);
269 String validDateString = Integer.toString(validDate.get(Calendar.MONTH)) + '/' + Integer.toString(validDate.get(Calendar.DAY_OF_MONTH))
270 + '/' + Integer.toString(validDate.get(Calendar.YEAR));
271 setFieldValue(page, "document.newMaintainableObject.effectiveDate", validDateString);
272 page = page.getElementByName("methodToCall.route").click();
273 Assert.assertFalse("page text contains:\n" + TkTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(TkTestConstants.EFFECTIVE_DATE_ERROR));
274 }
275
276 public class ClearCacheLifecycle extends BaseLifecycle {
277 private final Logger LOG = Logger.getLogger(ClearCacheLifecycle.class);
278
279 @Override
280 public void start() throws Exception {
281 long startTime = System.currentTimeMillis();
282 LOG.info("Starting cache flushing");
283 List<CacheManager> cms = new ArrayList<CacheManager>(CoreImplServiceLocator.getCacheManagerRegistry().getCacheManagers());
284 for (CacheManager cm : cms) {
285 for (String cacheName : cm.getCacheNames()) {
286
287 cm.getCache(cacheName).clear();
288 }
289 }
290 long endTime = System.currentTimeMillis();
291 LOG.info("Caches cleared in " + (endTime - startTime) + "ms");
292 }
293
294 @Override
295 public void stop() throws Exception {
296 super.stop();
297 }
298
299 }
300
301 }