001/** 002 * Copyright 2004-2014 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 */ 016package org.kuali.hr; 017 018import java.io.File; 019import java.util.ArrayList; 020import java.util.Arrays; 021import java.util.List; 022 023import org.apache.log4j.Logger; 024import org.kuali.kpme.core.rice.test.lifecycles.KPMEXmlDataLoaderLifecycle; 025import org.kuali.kpme.core.util.ClearDatabaseLifecycle; 026import org.kuali.kpme.core.util.DatabaseCleanupDataLifecycle; 027import org.kuali.kpme.core.util.HrContext; 028import org.kuali.kpme.core.util.LoadDatabaseDataLifeCycle; 029import org.kuali.rice.core.api.config.property.Config; 030import org.kuali.rice.core.api.config.property.ConfigContext; 031import org.kuali.rice.core.api.lifecycle.BaseLifecycle; 032import org.kuali.rice.core.api.lifecycle.Lifecycle; 033import org.kuali.rice.core.impl.services.CoreImplServiceLocator; 034import org.kuali.rice.krad.UserSession; 035import org.kuali.rice.krad.util.GlobalVariables; 036import org.kuali.rice.krad.util.MessageMap; 037import org.kuali.rice.test.RiceInternalSuiteDataTestCase; 038import org.kuali.rice.test.TransactionalLifecycle; 039import org.kuali.rice.test.lifecycles.JettyServerLifecycle; 040import org.kuali.rice.test.lifecycles.JettyServerLifecycle.ConfigMode; 041import org.springframework.cache.CacheManager; 042 043import com.gargoylesoftware.htmlunit.BrowserVersion; 044import com.gargoylesoftware.htmlunit.WebClient; 045 046/** 047 * Default test base for a full KPME unit test. 048 */ 049public abstract class KPMEWebTestCase extends RiceInternalSuiteDataTestCase { 050 051 private static final String FILE_PREFIX = System.getProperty("user.dir") + "/../db/src/main/resources/org/kuali/kpme/kpme-db/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[] folders = new File(FILE_PREFIX).listFiles(); 187 188 if (folders != null) { 189 Arrays.sort(folders); 190 for (File folder : folders) { 191 if (folder.getName().startsWith("00")) { 192 File[] files = new File(FILE_PREFIX + folder.getName()).listFiles(); 193 if (files != null) { 194 // Arrays.sort(files); 195 for (File file : files) { 196 if (file.getName().endsWith(".xml")) { 197 lifecycles.add(new KPMEXmlDataLoaderLifecycle(FILE_PREFIX + folder.getName() + "/" + file.getName())); 198 } 199 } 200 } 201 } 202 } 203 } 204 return lifecycles; 205 } 206 207/* public void futureEffectiveDateValidation(String baseUrl) throws Exception { 208 HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), baseUrl); 209 Assert.assertNotNull(page); 210 211 HtmlForm form = page.getFormByName("KualiForm"); 212 Assert.assertNotNull("Search form was missing from page.", form); 213 // use past dates 214 setFieldValue(page, "document.newMaintainableObject.effectiveDate", "04/01/2011"); 215 HtmlInput input = HtmlUnitUtil.getInputContainingText(form, "methodToCall.route"); 216 Assert.assertNotNull("Could not locate submit button", input); 217 page = ((HtmlButtonInput)page.getElementByName("methodToCall.route")).click(); 218 Assert.assertTrue("page text does not contain:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR)); 219 LocalDate futureDate = LocalDate.now().plusYears(2); // 2 years in the future 220 String futureDateString = "01/01/" + Integer.toString(futureDate.getYear()); 221 222 // use dates 2 years in the future 223 setFieldValue(page, "document.newMaintainableObject.effectiveDate", futureDateString); 224 page = ((HtmlButtonInput)page.getElementByName("methodToCall.route")).click(); 225 Assert.assertTrue("page text does not contain:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR)); 226 LocalDate validDate = LocalDate.now().plusMonths(5); // 5 month in the future 227 String validDateString = Integer.toString(validDate.getMonthOfYear()) + '/' + Integer.toString(validDate.getDayOfMonth()) 228 + '/' + Integer.toString(validDate.getYear()); 229 setFieldValue(page, "document.newMaintainableObject.effectiveDate", validDateString); 230 page = ((HtmlElement)page.getElementByName("methodToCall.route")).click(); 231 Assert.assertFalse("page text contains:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR)); 232 } 233*/ 234 public class ClearCacheLifecycle extends BaseLifecycle { 235 private final Logger LOG = Logger.getLogger(ClearCacheLifecycle.class); 236 237 @Override 238 public void start() throws Exception { 239 long startTime = System.currentTimeMillis(); 240 LOG.info("Starting cache flushing"); 241 List<CacheManager> cms = new ArrayList<CacheManager>(CoreImplServiceLocator.getCacheManagerRegistry().getCacheManagers()); 242 for (CacheManager cm : cms) { 243 for (String cacheName : cm.getCacheNames()) { 244 //LOG.info("Clearing cache: " + cacheName); 245 cm.getCache(cacheName).clear(); 246 } 247 } 248 long endTime = System.currentTimeMillis(); 249 LOG.info("Caches cleared in " + (endTime - startTime) + "ms"); 250 } 251 252 @Override 253 public void stop() throws Exception { 254 super.stop(); 255 } 256 257 } 258 259 public WebClient getWebClient() { 260 return this.webClient; 261 } 262 263 public void setWebClient(WebClient webClient) { 264 this.webClient = webClient; 265 } 266 267 public static String getBaseURL() { 268 return ConfigContext.getCurrentContextConfig().getProperty("application.url"); 269 } 270 271 public static String getContext() { 272 return "/" + ConfigContext.getCurrentContextConfig().getProperty("app.context.name"); 273 } 274 275 public static String getTempDir() { 276 return ConfigContext.getCurrentContextConfig().getProperty("temp.dir"); 277 } 278 279 public static Integer getPort() { 280 return new Integer(ConfigContext.getCurrentContextConfig().getProperty("kns.test.port")); 281 } 282 283 /*protected List<String> getConfigLocations() { 284 List<String> configLocations = new ArrayList<String>(); 285 //configLocations.add(getRiceMasterDefaultConfigFile()); 286 configLocations.add("classpath:META-INF/kpme-test-config.xml"); 287 288 //module specific overrides: 289 configLocations.add(getModuleTestConfigLocation()); 290 return configLocations; 291 }*/ 292 293}