001 /** 002 * Copyright 2004-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.hr; 017 018 import java.io.File; 019 import java.util.ArrayList; 020 import java.util.Arrays; 021 import java.util.List; 022 023 import org.apache.log4j.Logger; 024 import org.kuali.kpme.core.rice.test.lifecycles.KPMEXmlDataLoaderLifecycle; 025 import org.kuali.kpme.core.util.ClearDatabaseLifecycle; 026 import org.kuali.kpme.core.util.DatabaseCleanupDataLifecycle; 027 import org.kuali.kpme.core.util.HrContext; 028 import org.kuali.kpme.core.util.LoadDatabaseDataLifeCycle; 029 import org.kuali.rice.core.api.config.property.Config; 030 import org.kuali.rice.core.api.config.property.ConfigContext; 031 import org.kuali.rice.core.api.lifecycle.BaseLifecycle; 032 import org.kuali.rice.core.api.lifecycle.Lifecycle; 033 import org.kuali.rice.core.impl.services.CoreImplServiceLocator; 034 import org.kuali.rice.krad.UserSession; 035 import org.kuali.rice.krad.util.GlobalVariables; 036 import org.kuali.rice.krad.util.MessageMap; 037 import org.kuali.rice.test.RiceInternalSuiteDataTestCase; 038 import org.kuali.rice.test.TransactionalLifecycle; 039 import org.kuali.rice.test.lifecycles.JettyServerLifecycle; 040 import org.kuali.rice.test.lifecycles.JettyServerLifecycle.ConfigMode; 041 import org.springframework.cache.CacheManager; 042 043 import com.gargoylesoftware.htmlunit.BrowserVersion; 044 import com.gargoylesoftware.htmlunit.WebClient; 045 046 /** 047 * Default test base for a full KPME unit test. 048 */ 049 public abstract class KPMEWebTestCase extends RiceInternalSuiteDataTestCase { 050 051 private static final String FILE_PREFIX = System.getProperty("user.dir") + "/../db/src/main/config/workflow/"; 052 053 private static final String RELATIVE_WEBAPP_ROOT = "/src/main/webapp"; 054 055 private TransactionalLifecycle transactionalLifecycle; 056 private WebClient webClient; 057 058 @Override 059 protected String getModuleName() { 060 return "kpme"; 061 } 062 063 @Override 064 public void setUp() throws Exception { 065 if (System.getProperty("basedir") == null) { 066 System.setProperty("basedir", System.getProperty("user.dir") + "/"); 067 } 068 069 super.setUp(); 070 071 GlobalVariables.setMessageMap(new MessageMap()); 072 073 final boolean needsSpring = false; 074 if (needsSpring) { 075 transactionalLifecycle = new TransactionalLifecycle(); 076 //transactionalLifecycle.setTransactionManager(KRADServiceLocatorInternal.getTransactionManager()); 077 transactionalLifecycle.start(); 078 } 079 080 new ClearDatabaseLifecycle().start(); 081 082 new LoadDatabaseDataLifeCycle(this.getClass()).start(); 083 084 //lets try to create a user session 085 GlobalVariables.setUserSession(new UserSession("admin")); 086 setWebClient(new WebClient(BrowserVersion.FIREFOX_17)); 087 getWebClient().getOptions().setJavaScriptEnabled(true); 088 getWebClient().getOptions().setTimeout(0); 089 } 090 091 @Override 092 public void tearDown() throws Exception { 093 // runs custom SQL at the end of each test. 094 // useful for difficult to reset test additions, not handled by 095 // our ClearDatabaseLifecycle. 096 HrContext.clearTargetUser(); 097 getWebClient().closeAllWindows(); 098 new DatabaseCleanupDataLifecycle(this.getClass()).start(); 099 100 final boolean needsSpring = true; 101 if (needsSpring) { 102 if ( (transactionalLifecycle != null) && (transactionalLifecycle.isStarted()) ) { 103 transactionalLifecycle.stop(); 104 } 105 } 106 107 GlobalVariables.setMessageMap(new MessageMap()); 108 109 super.tearDown(); 110 } 111 112 @Override 113 protected List<Lifecycle> getPerTestLifecycles() { 114 List<Lifecycle> lifecycles = super.getPerTestLifecycles(); 115 lifecycles.add(new ClearCacheLifecycle()); 116 return lifecycles; 117 } 118 119 @Override 120 protected List<Lifecycle> getSuiteLifecycles() { 121 List<Lifecycle> lifecycles = super.getPerTestLifecycles(); 122 lifecycles.add(new Lifecycle() { 123 boolean started = false; 124 125 public boolean isStarted() { 126 return this.started; 127 } 128 129 public void start() throws Exception { 130 setModuleName(getModuleName()); 131 setBaseDirSystemProperty(getModuleName()); 132 Config config = getTestHarnessConfig(); 133 ConfigContext.init(config); 134 this.started = true; 135 } 136 137 public void stop() throws Exception { 138 this.started = false; 139 } 140 }); 141 /** 142 * Loads the TestHarnessSpringBeans.xml file which obtains connections to the DB for us 143 */ 144 /* lifecycles.add(getTestHarnessSpringResourceLoader());*/ 145 146 /** 147 * Establishes the TestHarnessServiceLocator so that it has a reference to the Spring context 148 * created from TestHarnessSpringBeans.xml 149 */ 150 /* lifecycles.add(new BaseLifecycle() { 151 @Override 152 public void start() throws Exception { 153 TestHarnessServiceLocator.setContext(getTestHarnessSpringResourceLoader().getContext()); 154 super.start(); 155 } 156 });*/ 157 158 lifecycles.add(new Lifecycle() { 159 private JettyServerLifecycle jettyServerLifecycle; 160 161 public boolean isStarted() { 162 return jettyServerLifecycle.isStarted(); 163 } 164 165 public void start() throws Exception { 166 System.setProperty("web.bootstrap.spring.file", "classpath:TestHarnessSpringBeans.xml"); 167 jettyServerLifecycle = new JettyServerLifecycle(getPort(), getContext(), RELATIVE_WEBAPP_ROOT); 168 jettyServerLifecycle.setConfigMode(ConfigMode.OVERRIDE); 169 jettyServerLifecycle.start(); 170 } 171 172 public void stop() throws Exception { 173 this.jettyServerLifecycle.stop(); 174 } 175 }); 176 177 ClearDatabaseLifecycle clearDatabaseLifecycle = new ClearDatabaseLifecycle(); 178 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_T"); 179 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_RSP_T"); 180 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_DLGN_RSP_T"); 181 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_ATTR_T"); 182 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_TMPL_T"); 183 clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_DOC_TYP_T"); 184 lifecycles.add(clearDatabaseLifecycle); 185 186 File[] files = new File(FILE_PREFIX).listFiles(); 187 if (files != null) { 188 Arrays.sort(files); 189 for (File file : files) { 190 if (file.getName().endsWith(".xml")) { 191 lifecycles.add(new KPMEXmlDataLoaderLifecycle(FILE_PREFIX + file.getName())); 192 } 193 } 194 } 195 return lifecycles; 196 } 197 198 /* public void futureEffectiveDateValidation(String baseUrl) throws Exception { 199 HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), baseUrl); 200 Assert.assertNotNull(page); 201 202 HtmlForm form = page.getFormByName("KualiForm"); 203 Assert.assertNotNull("Search form was missing from page.", form); 204 // use past dates 205 setFieldValue(page, "document.newMaintainableObject.effectiveDate", "04/01/2011"); 206 HtmlInput input = HtmlUnitUtil.getInputContainingText(form, "methodToCall.route"); 207 Assert.assertNotNull("Could not locate submit button", input); 208 page = ((HtmlButtonInput)page.getElementByName("methodToCall.route")).click(); 209 Assert.assertTrue("page text does not contain:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR)); 210 LocalDate futureDate = LocalDate.now().plusYears(2); // 2 years in the future 211 String futureDateString = "01/01/" + Integer.toString(futureDate.getYear()); 212 213 // use dates 2 years in the future 214 setFieldValue(page, "document.newMaintainableObject.effectiveDate", futureDateString); 215 page = ((HtmlButtonInput)page.getElementByName("methodToCall.route")).click(); 216 Assert.assertTrue("page text does not contain:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR)); 217 LocalDate validDate = LocalDate.now().plusMonths(5); // 5 month in the future 218 String validDateString = Integer.toString(validDate.getMonthOfYear()) + '/' + Integer.toString(validDate.getDayOfMonth()) 219 + '/' + Integer.toString(validDate.getYear()); 220 setFieldValue(page, "document.newMaintainableObject.effectiveDate", validDateString); 221 page = ((HtmlElement)page.getElementByName("methodToCall.route")).click(); 222 Assert.assertFalse("page text contains:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR)); 223 } 224 */ 225 public class ClearCacheLifecycle extends BaseLifecycle { 226 private final Logger LOG = Logger.getLogger(ClearCacheLifecycle.class); 227 228 @Override 229 public void start() throws Exception { 230 long startTime = System.currentTimeMillis(); 231 LOG.info("Starting cache flushing"); 232 List<CacheManager> cms = new ArrayList<CacheManager>(CoreImplServiceLocator.getCacheManagerRegistry().getCacheManagers()); 233 for (CacheManager cm : cms) { 234 for (String cacheName : cm.getCacheNames()) { 235 //LOG.info("Clearing cache: " + cacheName); 236 cm.getCache(cacheName).clear(); 237 } 238 } 239 long endTime = System.currentTimeMillis(); 240 LOG.info("Caches cleared in " + (endTime - startTime) + "ms"); 241 } 242 243 @Override 244 public void stop() throws Exception { 245 super.stop(); 246 } 247 248 } 249 250 public WebClient getWebClient() { 251 return this.webClient; 252 } 253 254 public void setWebClient(WebClient webClient) { 255 this.webClient = webClient; 256 } 257 258 public static String getBaseURL() { 259 return ConfigContext.getCurrentContextConfig().getProperty("application.url"); 260 } 261 262 public static String getContext() { 263 return "/" + ConfigContext.getCurrentContextConfig().getProperty("app.context.name"); 264 } 265 266 public static String getTempDir() { 267 return ConfigContext.getCurrentContextConfig().getProperty("temp.dir"); 268 } 269 270 public static Integer getPort() { 271 return new Integer(ConfigContext.getCurrentContextConfig().getProperty("kns.test.port")); 272 } 273 274 /*protected List<String> getConfigLocations() { 275 List<String> configLocations = new ArrayList<String>(); 276 //configLocations.add(getRiceMasterDefaultConfigFile()); 277 configLocations.add("classpath:META-INF/kpme-test-config.xml"); 278 279 //module specific overrides: 280 configLocations.add(getModuleTestConfigLocation()); 281 return configLocations; 282 }*/ 283 284 }