package com.processpuzzle.application.configuration.domain;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.application.security.domain.SystemAdministrator;
import com.processpuzzle.application.security.domain.UserFactory;
import com.processpuzzle.persistence.domain.TestEntity;
import com.processpuzzle.persistence.domain.TestEntityFactory;
import com.processpuzzle.user_session.domain.StaticUserSessionHolder;
import com.processpuzzle.user_session.domain.UserRequestManager;
import com.processpuzzle.user_session.domain.UserSessionHolder;
public class BeanContainerTest {
private static String CONTAINER_DEFINITION_PATH = "classpath:com/processpuzzle/application/configuration/domain/BeanContainerDefinition.xml";
private static Application application;
private static ProcessPuzzleContext applicationContext;
private BeanContainer container = null;
@Before public final void beforeEachTests() {
application = mock( Application.class );
applicationContext = mock( ProcessPuzzleContext.class );
defineUserRequestContext();
defineMockApplication();
ResourceLoader loader = new DefaultResourceLoader();
Resource containerDefinitionXml = loader.getResource( CONTAINER_DEFINITION_PATH );
container = new BeanContainer( application, containerDefinitionXml );
container.setUp( Application.Action.start );
}
@Test public final void setUp_ShouldConfigureContainer() {
assertTrue( container.isConfigured() );
assertTrue( "BeanContainer configures a Spring 'ApplicationContext'.", container.getApplicationContext() instanceof org.springframework.context.ApplicationContext );
}
@Test public final void setUp_MakesAvailableRequiredBeans() {
assertNotNull( container.getBean( ProcessPuzzleApplicationComponent.USER_REQUEST_FACTORY.getComponentId() ));
}
@Test( expected = UndefinedBeanException.class )
public final void getBean_ThrowsExceptionWhenNotFound() {
container.getBean( "notExistingBean" );
}
@Test public void getEntityFactoryByEntityClass_DeterminesFactoryFromEntityClass() {
assertThat( container.getEntityFactoryByEntityClass( TestEntity.class ), instanceOf( TestEntityFactory.class ));
}
@Test public void getEntityFactory_ShouldDetermineBeanNameFromClassName() {
UserFactory userFactory = container.getEntityFactory( UserFactory.class );
assertThat( userFactory, notNullValue() );
}
@After public final void afterEachTests() {
container.tearDown( Application.Action.stop );
container = null;
}
private void defineMockApplication() {
applicationContext = mock( ProcessPuzzleContext.class );
application = mock( Application.class );
when( application.getContext() ).thenReturn( applicationContext );
}
private void defineUserRequestContext() {
UserRequestManager requestManager = UserRequestManager.getInstance();
UserSessionHolder sessionHolder = new StaticUserSessionHolder();
requestManager.createSession( sessionHolder, new SystemAdministrator(), application );
requestManager.createRequestContext( sessionHolder );
}
}