package org.appfuse.webapp.action; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.shale.test.mock.MockApplication; import org.apache.shale.test.mock.MockExternalContext; import org.apache.shale.test.mock.MockFacesContext; import org.apache.shale.test.mock.MockFacesContextFactory; import org.apache.shale.test.mock.MockHttpServletRequest; import org.apache.shale.test.mock.MockHttpServletResponse; import org.apache.shale.test.mock.MockHttpSession; import org.apache.shale.test.mock.MockLifecycle; import org.apache.shale.test.mock.MockLifecycleFactory; import org.apache.shale.test.mock.MockRenderKit; import org.apache.shale.test.mock.MockServletConfig; import org.apache.shale.test.mock.MockServletContext; import org.appfuse.Constants; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests; import javax.faces.FactoryFinder; import javax.faces.application.ApplicationFactory; import javax.faces.component.UIViewRoot; import javax.faces.lifecycle.LifecycleFactory; import javax.faces.render.RenderKitFactory; import java.net.URL; import java.net.URLClassLoader; import java.util.Locale; import java.util.List; import java.util.ArrayList; /** *

Abstract JUnit test case base class, which sets up the JavaServer Faces * mock object environment for a particular simulated request. The following * protected variables are initialized in the setUp() method, and * cleaned up in the tearDown() method:

* *

*

In addition, appropriate factory classes will have been registered with * javax.faces.FactoryFinder for Application and * RenderKit instances. The created FacesContext * instance will also have been registered in the apppriate thread local * variable, to simulate what a servlet container would do.

*

*

WARNING - If you choose to subclass this class, be sure * your onSetUp() and onTearDown() methods call * super.setUp() and super.tearDown() respectively, * and that you implement your own suite() method that exposes * the test methods for your test case.

*

*

NOTE: This class is a copy of Shale's AbstractJsfTestCase, * except it extends Spring's AbstractTransactionalDataSourceSpringContextTests * instead of JUnit's TestCase.

*/ public abstract class BasePageTestCase extends AbstractTransactionalDataSourceSpringContextTests { protected final Log log = LogFactory.getLog(getClass()); protected static final String MESSAGES = Constants.BUNDLE_KEY; protected MockApplication application = null; protected MockServletConfig config = null; protected MockExternalContext externalContext = null; protected MockFacesContext facesContext = null; protected MockFacesContextFactory facesContextFactory = null; protected MockLifecycle lifecycle = null; protected MockLifecycleFactory lifecycleFactory = null; protected MockRenderKit renderKit = null; protected MockHttpServletRequest request = null; protected MockHttpServletResponse response = null; protected MockServletContext servletContext = null; protected MockHttpSession session = null; // Thread context class loader saved and restored after each test private ClassLoader threadContextClassLoader = null; /** *

Set up instance variables required by this test case.

*/ @Override protected void onSetUp() throws Exception { // Set up a new thread context class loader threadContextClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[0], this.getClass().getClassLoader())); // Set up Servlet API Objects servletContext = new MockServletContext(); config = new MockServletConfig(servletContext); session = new MockHttpSession(); session.setServletContext(servletContext); request = new MockHttpServletRequest(session); request.setServletContext(servletContext); request.setLocale(new Locale("en")); response = new MockHttpServletResponse(); // Set up JSF API Objects FactoryFinder.releaseFactories(); FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, "org.apache.shale.test.mock.MockApplicationFactory"); FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY, "org.apache.shale.test.mock.MockFacesContextFactory"); FactoryFinder.setFactory(FactoryFinder.LIFECYCLE_FACTORY, "org.apache.shale.test.mock.MockLifecycleFactory"); FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY, "org.apache.shale.test.mock.MockRenderKitFactory"); externalContext = new MockExternalContext(servletContext, request, response); lifecycleFactory = (MockLifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); lifecycle = (MockLifecycle) lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); facesContextFactory = (MockFacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); facesContext = (MockFacesContext) facesContextFactory.getFacesContext(servletContext, request, response, lifecycle); externalContext = (MockExternalContext) facesContext.getExternalContext(); UIViewRoot root = new UIViewRoot(); root.setViewId("/viewId"); root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT); facesContext.setViewRoot(root); ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY); application = (MockApplication) applicationFactory.getApplication(); facesContext.setApplication(application); RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); renderKit = new MockRenderKit(); renderKitFactory.addRenderKit(RenderKitFactory.HTML_BASIC_RENDER_KIT, renderKit); application.setMessageBundle(Constants.BUNDLE_KEY); // set supported locales List list = new ArrayList(); list.add(new Locale("en")); list.add(new Locale("fr")); list.add(new Locale("de")); list.add(new Locale("es")); application.setSupportedLocales(list); // change the port on the mailSender so it doesn't conflict with an // existing SMTP server on localhost JavaMailSenderImpl mailSender = (JavaMailSenderImpl) applicationContext.getBean("mailSender"); mailSender.setPort(2525); mailSender.setHost("localhost"); } /** *

Tear down instance variables required by this test case.

*/ @Override protected void onTearDown() throws Exception { application = null; config = null; externalContext = null; facesContext.release(); facesContext = null; lifecycle = null; lifecycleFactory = null; renderKit = null; request = null; response = null; servletContext = null; session = null; FactoryFinder.releaseFactories(); Thread.currentThread().setContextClassLoader(threadContextClassLoader); threadContextClassLoader = null; } protected String[] getConfigLocations() { return new String[] { "classpath*:/applicationContext-resources.xml", "classpath*:/applicationContext-dao.xml", "classpath*:/applicationContext-service.xml", "classpath*:/applicationContext.xml", // for modular archetypes "/WEB-INF/applicationContext*.xml"}; } }