package com.processpuzzle.litest.template;
import org.junit.Test;
import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.commons.persistence.AggregateRoot;
import com.processpuzzle.commons.persistence.Repository;
import com.processpuzzle.litest.template.GenericTestTemplate;
import com.processpuzzle.persistence.domain.DefaultUnitOfWork;
import com.processpuzzle.persistence.domain.EntityFactory;
import com.processpuzzle.persistence.domain.EntityIdentityCollitionException;
public abstract class FactoryTestTemplate<S extends EntityFactory<A>, F extends FactoryTestFixture<S,A>, A extends AggregateRoot> extends GenericTestTemplate<S, F, FactoryTestEnvironment<S, F>> {
protected Application application;
protected ProcessPuzzleContext applicationContext;
protected String configurationDescriptorPath;
protected FactoryTestTemplate( String fixtureContainerConfigurationPath ) {
super( fixtureContainerConfigurationPath, FactoryTestEnvironment.class );
}
@Override
public void beforeEachTest() {
super.beforeEachTest();
applicationContext = templatedFixture.getApplicationContext();
}
@Test public abstract void create_ForSuccess();
@Test (expected = EntityIdentityCollitionException.class ) public abstract void create_ForCollision();
@SuppressWarnings("unchecked")
protected void saveAggregateRoot( AggregateRoot aggregateRoot, ProcessPuzzleContext applicationContext ) {
Repository<A> repository = (Repository<A>) applicationContext.getRepositoryByEntityClass( aggregateRoot.getClass() );
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
repository.add( work, (A) aggregateRoot );
work.finish();
}
@SuppressWarnings("unchecked")
protected void deleteAggregateRoot( AggregateRoot aggregateRoot, ProcessPuzzleContext applicationContext ) {
Repository<A> repository = (Repository<A>) applicationContext.getRepositoryByEntityClass( aggregateRoot.getClass() );
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
repository.delete( work, (A) aggregateRoot );
work.finish();
}
}