package com.processpuzzle.fitnesse.persistence;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.sameInstance;
import static org.hamcrest.Matchers.typeCompatibleWith;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeThat;
import static org.mockito.Mockito.verify;
import fit.RowFixture;
import org.junit.Before;
import org.junit.Test;
import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext;
import com.processpuzzle.commons.persistence.Repository;
import com.processpuzzle.fundamental_types.domain.ParameterValueList;
import com.processpuzzle.litest.testcase.GenericTestSuite;
import com.processpuzzle.persistence.domain.TestEntityRepository;
import com.processpuzzle.sharedfixtures.domaintier.MockProcessPuzzleContext;
public class RepositoryTesterTest extends GenericTestSuite<RepositoryTester, RepositoryTesterFixture>{
private static final String containerConfigurationPath = "classpath:com/processpuzzle/fitnesse/sharedfixtures/fixtures.xml";
private MockProcessPuzzleContext applicationContextFixture;
private InstantiatedRepositoryTester repositoryTesterFixture;
private TestEntityRepository repository;
public RepositoryTesterTest() {
super( containerConfigurationPath );
}
@SuppressWarnings("unchecked")
@Before
public void beforeEachTests() throws ClassNotFoundException {
applicationContextFixture = fixture.getFixture( MockProcessPuzzleContext.class );
repositoryTesterFixture = fixture.getFixture( InstantiatedRepositoryTester.class );
ProcessPuzzleContext applicationContext = applicationContextFixture.getApplicationContext();
assumeThat( applicationContext.getRepository( TestEntityRepository.class ), notNullValue() );
assumeThat( applicationContext.getRepository( TestEntityRepository.class ), equalTo( applicationContextFixture.getMockTestEntityRepository() ) );
Class<? extends Repository<?>> repositoryClass = (Class<? extends Repository<?>>) Class.forName( repositoryTesterFixture.getRepositoryClassName() );
Repository<?> repository = applicationContext.getRepository( repositoryClass );
assumeThat( repository, instanceOf( TestEntityRepository.class ));
sut.useRepository( repositoryTesterFixture.getRepositoryClassName() );
}
@Test
public void useRepository_LazyInitializesTester() {
assertThat( sut.getApplicationContext(), notNullValue() );
assertThat( sut.getApplicationContext(), sameInstance( applicationContextFixture.getApplicationContext() ));
}
@Test
public void useRepository_DeterminesRepository() {
assertThat( sut.getRepositoryClass().equals( TestEntityRepository.class ), is( true ));
assertThat( sut.getRepository(), notNullValue() );
}
@Test
public void execute_ParsesParameterString() throws NoSuchRepositoryMethodException, RepositoryMethodExecutionException, ClassNotFoundException, InstantiationException, IllegalAccessException {
sut.executeWithParameter( InstantiatedRepositoryTester.REPOSITORY_METHOD_NAME, InstantiatedRepositoryTester.METHOD_PARAMETERS );
ParameterValueList parameterList = sut.getParameterValueList();
assertThat( parameterList.size(), is( 1 ));
}
@Test
public void execute_invokesRepositoryMethod() throws NoSuchRepositoryMethodException, RepositoryMethodExecutionException, ClassNotFoundException, InstantiationException, IllegalAccessException {
sut.executeWithParameter( InstantiatedRepositoryTester.REPOSITORY_METHOD_NAME, InstantiatedRepositoryTester.METHOD_PARAMETERS );
repository = (TestEntityRepository) sut.getRepository();
verify( repository ).findTestEntityByName( InstantiatedRepositoryTester.METHOD_PARAMETER_VALUE );
assertThat( sut.getRepositoryResultSet().size(), is( 1 ));
}
@Test
public void expectedResultSet_ContainsPreviouslyRetrievedAggregateRoots() throws Exception {
sut.executeWithParameter( InstantiatedRepositoryTester.REPOSITORY_METHOD_NAME, InstantiatedRepositoryTester.METHOD_PARAMETERS );
RowFixture expectedResultSet = sut.expectedResultSet();
assertThat( expectedResultSet, instanceOf( RowFixture.class ));
assertThat( expectedResultSet.getTargetClass(), typeCompatibleWith( PersistentObjectWrapper.class ));
assertThat( expectedResultSet.query().length, equalTo( 1 ));
}
}