package com.processpuzzle.litest.template;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.FileNotFoundException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.google.common.collect.Maps;
import com.mockrunner.mock.web.MockServletContext;
import com.mockrunner.mock.web.WebMockObjectFactory;
import com.mockrunner.servlet.ServletTestModule;
import com.processpuzzle.application.configuration.control.ApplicationLifecycleListener;
import com.processpuzzle.application.configuration.control.ProcessPuzzleCommandMapping;
import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext;
import com.processpuzzle.application.configuration.domain.PropertyContext;
import com.processpuzzle.application.configuration.domain.PropertyKeys;
import com.processpuzzle.application.configuration.domain.WebApplicationContext;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.application.domain.WebApplication;
import com.processpuzzle.application.security.domain.AnonymousUser;
import com.processpuzzle.application.security.domain.User;
import com.processpuzzle.application.security.domain.UserRepository;
import com.processpuzzle.litest.fixture.GenericTestFixture;
import com.processpuzzle.litest.fixture.TransientFreshFixture;
import com.processpuzzle.sharedfixtures.webtier.MockServletContextFixture;
import com.processpuzzle.user_session.domain.StaticUserSessionHolder;
import com.processpuzzle.user_session.domain.UserRequestManager;
import com.processpuzzle.user_session.domain.UserSessionHolder;
public class MockServletRunner extends GenericTestFixture<Object> implements TransientFreshFixture<Object> {
public static final String DEFAULT_SKIN_PATH = "Default";
public static final String DEFAULT_SKIN_NAME = "ProcessPuzzle";
private MockServletContextFixture contextFixture;
private WebMockObjectFactory factory;
private Map<Class<? extends Filter>, Filter> filters = Maps.newHashMap();
private WebApplication mockApplication;
private WebApplicationContext mockApplicationContext;
private AnonymousUser mockAnonymousUser;
private User mockUser;
private MockServletContext servletContext;
private Map<Class<? extends Servlet>, Servlet> servlets = Maps.newHashMap();
private HttpSession session;
private ServletTestModule testModule;
private PropertyContext mockPropertyContext;
public MockServletRunner() {
}
//Public mutators
public void addRequestParameter( String parameterName, String parameterValue ){
testModule.addRequestParameter( parameterName, parameterValue );
}
public void doDelete() { testModule.doDelete(); }
public void doFilter() { testModule.doFilter(); }
public void doGet() { testModule.doGet(); }
public void doHead() { testModule.doHead(); }
public void doOptions() { testModule.doOptions(); }
public void doPost() { testModule.doPost(); }
public void doPut() { testModule.doPut(); }
public void doTrace() { testModule.doTrace(); }
//Properties
public User getAnonymousUser() { return mockAnonymousUser; }
public Application getApplication() { return mockApplication; }
public ProcessPuzzleContext getApplicationContext() { return mockApplicationContext; }
public WebMockObjectFactory getFactory() { return factory; }
@SuppressWarnings("unchecked") public <F extends Filter> F getFilter( Class<F> filterClass ) { return (F) filters.get( filterClass ); }
public User getMockUser() { return mockUser; }
public HttpServletResponse getResponse() { return factory.getWrappedResponse(); }
public HttpServletRequest getRequest() { return factory.getWrappedRequest(); }
public Object getRequestAttribute( String attributeName ) { return getRequest().getAttribute( attributeName ); }
public RequestDispatcher getRequestDispathcer( String pageName ){ return factory.getMockServletContext().getRequestDispatcher( pageName ); }
public String getRequestDispatcherPath( String pageName ) { return factory.getMockServletContext().getContextPath(); }
public HttpSession getSession() { return session; }
public ServletContext getServletContext() { return servletContext; }
public WebMockObjectFactory getWebMockObjectFactory() { return factory; }
public void setFilter( Class<? extends Filter> filterClass ) { Filter filter = testModule.createFilter( filterClass ); filters.put( filterClass, filter ); }
public void setServletContextAttribute( String attributeName, Object attributeValue ) { servletContext.setAttribute( attributeName, attributeValue ); }
public void setServlet( Class<? extends Servlet> servletClass ) { Servlet servlet = testModule.createServlet( servletClass ); servlets.put( servletClass, servlet ); }
//Private helper methods
private void createMockAnonymousUser() {
mockAnonymousUser = mock( AnonymousUser.class );
mockUser = mock( User.class );
}
private void createMockApplicationContext() {
mockApplicationContext = mock( WebApplicationContext.class );
when( mockApplication.getContext() ).thenReturn( mockApplicationContext );
UserRepository mockUserRepository = mock( UserRepository.class );
when( mockUserRepository.findAnonymousUser() ).thenReturn( mockAnonymousUser );
when( mockApplicationContext.getRepository( UserRepository.class )).thenReturn( mockUserRepository );
}
private void createMockApplication() {
mockApplication = mock( WebApplication.class );
servletContext.setAttribute( ApplicationLifecycleListener.APPLICATION_OBJECT, mockApplication );
}
private void createMockPropertyContext(){
mockPropertyContext = mock( PropertyContext.class );
when( mockPropertyContext.getProperty( PropertyKeys.PRESENTATION_DEFALT_SKIN_NAME.getDefaultKey() )).thenReturn( DEFAULT_SKIN_NAME );
when( mockPropertyContext.getProperty( PropertyKeys.PRESENTATION_DEFALT_SKIN_PATH.getDefaultKey() )).thenReturn( DEFAULT_SKIN_PATH );
when( mockPropertyContext.getProperty( PropertyKeys.COMMAND_MAPPING.getDefaultKey() )).thenReturn( ProcessPuzzleCommandMapping.class.getName() );
when( mockApplicationContext.getPropertyContext() ).thenReturn( mockPropertyContext );
}
private void createUserRequestContext() {
UserRequestManager requestManager = UserRequestManager.getInstance();
UserSessionHolder sessionHolder = new StaticUserSessionHolder();
requestManager.createSession( sessionHolder, mockUser, mockApplication );
requestManager.createRequestContext( sessionHolder );
}
@Override
protected void configureBeforeSutInstantiation() {
factory = new WebMockObjectFactory();
testModule = new ServletTestModule( factory );
testModule.setDoChain( true );
session = factory.getWrappedRequest().getSession();
servletContext = (MockServletContext) session.getServletContext();
contextFixture = new MockServletContextFixture( servletContext );
try{
contextFixture.setUp();
}catch( FileNotFoundException e ){
e.printStackTrace();
}
createMockAnonymousUser();
createMockApplication();
createMockApplicationContext();
createMockPropertyContext();
createUserRequestContext();
}
@Override
protected void configureAfterSutInstantiation() {
}
@Override protected Object instantiateSUT() {
return null;
}
@Override
protected void releaseResources() {
testModule.releaseFilters();
testModule = null;
filters.clear();
servlets.clear();
contextFixture.tearDown();
factory = null;
servletContext = null;
}
}