package com.processpuzzle.user.session.control;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeThat;
import java.io.FileNotFoundException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.application.security.domain.User;
import com.processpuzzle.litest.template.MockServletRunner;
import com.processpuzzle.user.session.control.HttpSessionUserSessionHolder;
import com.processpuzzle.user.session.control.UserRequestContextCreator;
import com.processpuzzle.user_session.domain.UserRequestContext;
import com.processpuzzle.user_session.domain.UserRequestManager;
import com.processpuzzle.user_session.domain.UserSession;
import com.processpuzzle.user_session.domain.UserSessionHolder;
public class UserRequestContextCreatorTest {
private MockServletRunner runner;
private Application application;
private UserRequestContextCreator requestCreatorFilter;
private UserRequestManager requestManager;
@Before public void beforeEachTests() throws FileNotFoundException {
runner = new MockServletRunner();
runner.setUp();
runner.setFilter( UserRequestContextCreator.class );
requestCreatorFilter = (UserRequestContextCreator) runner.getFilter( UserRequestContextCreator.class );
application = runner.getApplication();
requestManager = UserRequestManager.getInstance();
}
@Test public void init_shouldFindApplicationInServletContext() {
assertThat( requestCreatorFilter.getRequestManager(), notNullValue() );
assertThat( requestCreatorFilter.getApplication(), equalTo( application ));
}
@Test public void doFilter_shouldCreateNewUserSessionIfThereIsNoOne() {
assumeThat( requestManager.currentUserSession(), is( nullValue() ));
assumeThat( requestManager.currentRequestContext(), is( nullValue() ));
assumeThat( requestManager.getApplicationInContext(), is( nullValue() ));
assumeThat( requestManager.getApplicationContext(), is( nullValue() ));
//EXCERCISE:
runner.doFilter();
//VERIFY:
assertThat( requestManager.currentUserSession(), notNullValue() );
assertThat( requestManager.currentRequestContext(), notNullValue() );
assertThat( requestManager.currentUser(), equalTo( runner.getAnonymousUser() ));
assertThat( requestManager.getApplicationInContext(), equalTo( runner.getApplication() ));
assertThat( requestManager.getApplicationContext(), equalTo( runner.getApplication().getContext() ));
assertThat( (UserSession) runner.getSession().getAttribute( HttpSessionUserSessionHolder.USER_SESSION ), equalTo( requestManager.currentUserSession() ));
//TEARDOWN:
requestManager.destroySession( requestManager.currentUserSession() );
}
@Test public void doFilter_shouldReuseExistingUserSession() {
//SETUP:
UserRequestContext existingUserRequestContext = createNewUserSessionAndRequestContext();
UserSession existingSession = existingUserRequestContext.getUserSession();
User existingUser = runner.getMockUser();
//EXCERCISE:
runner.doFilter();
//VERIFY:
assertThat( requestManager.currentUserSession(), equalTo( existingSession ));
assertThat( requestManager.currentUser(), equalTo( existingUser ));
}
@Test public void doFilter_shouldCreateNewRequestEvenIfExists() {
//SETUP:
UserRequestContext existingUserRequestContext = createNewUserSessionAndRequestContext();
//EXCERCISE:
runner.doFilter();
//VERIFY:
assertThat( requestManager.currentRequestContext(), not( equalTo( existingUserRequestContext )));
}
@After public void afterEachTests() {
runner.tearDown();
runner = null;
requestManager = null;
}
//Private helper methods
private UserRequestContext createNewUserSessionAndRequestContext() {
UserSessionHolder sessionHolder = new HttpSessionUserSessionHolder( runner.getRequest() );
requestManager.createSession( sessionHolder, runner.getMockUser(), application );
UserRequestContext existingUserReqestContext = requestManager.createRequestContext( sessionHolder );
return existingUserReqestContext;
}
}