package com.processpuzzle.application.configuration.domain;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertEquals;
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.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.application.security.domain.User;
import com.processpuzzle.commons.persistence.AggregateRoot;
import com.processpuzzle.commons.persistence.PersistenceStrategy;
import com.processpuzzle.commons.persistence.Repository;
import com.processpuzzle.commons.persistence.RepositoryResultSet;
import com.processpuzzle.commons.persistence.UnitOfWork;
import com.processpuzzle.commons.persistence.query.IdentityExpression;
import com.processpuzzle.commons.persistence.query.Query;
import com.processpuzzle.persistence.domain.BidirectionalSynchronizationStrategy;
import com.processpuzzle.persistence.domain.HibernatePersistenceProvider;
import com.processpuzzle.persistence.domain.TestEntity;
import com.processpuzzle.persistence.domain.TestEntityRepository;
import com.processpuzzle.sharedfixtures.domaintier.DomainTierTestConfiguration;
public class PersistenceContextTest {
// private static String ERRONEOUS_CONFIGURATION_DESCRIPTOR = "classpath:com/itcodex/objectpuzzle/framework/application_configuration/domain/erroneous_configuration_descriptor.xml";
private static Application application;
private static ProcessPuzzleContext applicationContext;
private static PropertyContext propertyContext;
private PersistenceContext persistenceContext;
private PersistenceStrategy strategy_1;
private PersistenceStrategy strategy_2;
@BeforeClass
public static void beforeAllTests() {
application = mock( Application.class );
applicationContext = mock( ProcessPuzzleContext.class );
when( application.getContext() ).thenReturn( applicationContext );
propertyContext = new PropertyContext( application, "classpath:com/processpuzzle/application/configuration/domain/configuration_descriptor.xml" );
propertyContext.setUp( Application.Action.install );
when( applicationContext.getPropertyContext() ).thenReturn( propertyContext );
}
@Before
public void beforeEachTests() {
persistenceContext = new PersistenceContext( application );
persistenceContext.setUp( Application.Action.install );
strategy_1 = persistenceContext.getStrategy( DomainTierTestConfiguration.STRATEGY_NAME );
strategy_2 = persistenceContext.getStrategy( DomainTierTestConfiguration.SECOND_STRATEGY_NAME );
}
@After
public void afterEachTests() {
persistenceContext.tearDown( Application.Action.stop );
persistenceContext = null;
}
@Ignore @Test
public void setUp_ForSupportedStrategies() {
assertEquals("According to the 'default_configuration.xml' the number of instantiated PersistentStrategies is:", 2, persistenceContext.getSupportedStrategies().size());
assertTrue("HibernateStrategy is supported.", persistenceContext.getSupportedStrategies().containsKey( DomainTierTestConfiguration.STRATEGY_NAME ));
assertTrue("InMemoryStrategy is supported.", persistenceContext.getSupportedStrategies().containsKey( DomainTierTestConfiguration.SECOND_STRATEGY_NAME ));
}
@Ignore @Test
public void setUp_ForEventHandlers() {
PersistenceStrategy strategy_1 = persistenceContext.getSupportedStrategies().get( DomainTierTestConfiguration.STRATEGY_NAME );
assertEquals("'strategy_1' contains only one event handler.", 1, strategy_1.getEventHandlers().size() );
assertTrue("This event handler is:", strategy_1.getEventHandlers().get(0) instanceof HibernatePersistenceProvider );
PersistenceStrategy strategy_2 = persistenceContext.getSupportedStrategies().get( DomainTierTestConfiguration.SECOND_STRATEGY_NAME );
assertEquals("'strategy_2' contains two event handlers.", 2, strategy_2.getEventHandlers().size() );
assertTrue("The first event handler is:", strategy_2.getEventHandlers().get(0) instanceof HibernatePersistenceProvider );
assertTrue("The second event handler is:", strategy_2.getEventHandlers().get(1) instanceof BidirectionalSynchronizationStrategy );
}
@Ignore @Test
public void setUp_ForRepositories() {
assertEquals("According to 'default_configuration.xml' the number of instantiated repositories is:", 3, persistenceContext.getAvailableRepositories().size());
Repository<?> repository = persistenceContext.getAvailableRepositories().get( TestEntityRepository.class );
assertTrue("The instantiated repository is:", repository instanceof TestEntityRepository );
assertEquals("'TestEntiryRepository' is supported by", DomainTierTestConfiguration.STRATEGY_NAME, repository.getPersistenceStrategy().getName() );
assertEquals("'TestEntitiyRepository' supports class:", TestEntity.class, repository.getSupportedAggregateRootClass() );
}
@Ignore @Test
public void setUp_ForEventHandlerInitialization() {
assertTrue( strategy_1.isConfigured() );
assertTrue( strategy_2.isConfigured() );
HibernatePersistenceProvider hibernateProvider = (HibernatePersistenceProvider) strategy_1.getEventHandlers().get( 0 );
assertTrue( hibernateProvider.isConfigured());
hibernateProvider = (HibernatePersistenceProvider) strategy_2.getEventHandlers().get( 0 );
assertTrue( hibernateProvider.isConfigured());
BidirectionalSynchronizationStrategy synchronizationStrategy = (BidirectionalSynchronizationStrategy) strategy_2.getEventHandlers().get( 1 );
assertTrue( synchronizationStrategy.isConfigured() );
}
@Ignore @Test
public void setUp_ForPersistentClasses() {
assertEquals("According to 'default_configuration.xml' and 'TestClassList' the number of persistent classes is:",
3,
persistenceContext.getPersistentClassesSize() ); //Note that, class defintions comes from two sources!
}
@Ignore @Test
public void setUp_ForClassRepositoryMapping() {
assertNotNull("PersistenceContext builds up a Map of persisted Entity classes and RepositoryInstances.", persistenceContext.getRepositoryByAggregateRootClass(TestEntity.class ));
}
@Ignore @Test
public void setUp_ForGetPersistentDataInitializationStrategy() {
assertEquals( PersistentDataInitializationStrategies.dropAndCreate, persistenceContext.getPersistentDataInitializationStrategy() );
}
@Ignore @Test (expected = UndeclaredRepositoryException.class )
public void getRepositoryInstance(){
persistenceContext.getRepositoryInstance( DummyRepository.class );
}
@Ignore @Test
public void getRepositoryByAggregateRootClass() {
assertNotNull("PersistenceContex bulds up a Map of aggregate root classes and the repositories which serves them.",
persistenceContext.getRepositoryByAggregateRootClass( User.class ));
}
@Ignore @Test
public void getStrategy() {
assertThat( persistenceContext.getStrategy( DomainTierTestConfiguration.STRATEGY_NAME ), notNullValue() );
assertThat( persistenceContext.getStrategy( DomainTierTestConfiguration.STRATEGY_NAME ).getName(), equalTo( DomainTierTestConfiguration.STRATEGY_NAME ) );
}
private class DummyRepository implements Repository<AggregateRoot> {
public PersistenceStrategy getPersistenceStrategy() { return null; }
public Class<? extends AggregateRoot> getSupportedAggregateRootClass() { return null; }
@Override public Integer add( UnitOfWork work, AggregateRoot entity ) { return null; }
@Override public void delete( UnitOfWork work, AggregateRoot entity ) {}
@Override public RepositoryResultSet<AggregateRoot> findAll( UnitOfWork work ) { return null; }
@Override public AggregateRoot findById( UnitOfWork work, Integer id ) { return null; }
@Override public AggregateRoot findByIdentityExpression( UnitOfWork work, IdentityExpression<?> identity ) { return null; }
@Override public RepositoryResultSet<AggregateRoot> findByQuery( UnitOfWork work, Query query ) { return null; }
@Override public void update( UnitOfWork work, AggregateRoot entity ) {}
}
}