Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closes #512 - Test KadaiEngine with different ConnectionManagementModes #530

Draft
wants to merge 10 commits into
base: master
Choose a base branch
from
6 changes: 6 additions & 0 deletions lib/kadai-core-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.kadai</groupId>
<artifactId>kadai-spring</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
package acceptance.common;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;

import acceptance.common.TestUserMapper.TestUser;
import io.kadai.KadaiConfiguration;
import io.kadai.common.api.KadaiEngine;
import io.kadai.common.api.KadaiEngine.ConnectionManagementMode;
import io.kadai.common.internal.SpringKadaiEngine;
import io.kadai.testapi.KadaiEngineProxy;
import io.kadai.testapi.extensions.TestContainerExtension;
import java.sql.Connection;
import javax.sql.DataSource;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;

public class KadaiEngineModesTest {

@Nested
@TestInstance(Lifecycle.PER_CLASS)
public class KadaiEngineParticipateModeTest {

private KadaiEngineProxy thisKadaiEngineProxy;
private KadaiEngineProxy thatKadaiEngineProxy;
private TransactionTemplate transactionTemplate;

@BeforeEach
public void setupKadaiEngines() throws Exception {
String schemaName = TestContainerExtension.determineSchemaName();
DataSource dataSource = TestContainerExtension.DATA_SOURCE;
KadaiConfiguration kadaiConfiguration =
new KadaiConfiguration.Builder(dataSource, true, schemaName, false)
.initKadaiProperties()
.build();
thisKadaiEngineProxy =
new KadaiEngineProxy(
SpringKadaiEngine.buildKadaiEngine(
kadaiConfiguration, ConnectionManagementMode.PARTICIPATE));
thisKadaiEngineProxy.getSqlSession().getConfiguration().addMapper(TestUserMapper.class);
transactionTemplate = new TransactionTemplate(new DataSourceTransactionManager(dataSource));

thatKadaiEngineProxy = new KadaiEngineProxy(KadaiEngine.buildKadaiEngine(kadaiConfiguration));
thatKadaiEngineProxy.getSqlSession().getConfiguration().addMapper(TestUserMapper.class);
}

@Test
void should_RetrieveCreated_When_ParticipatingTransactionSucceeded() {
TestUserMapper thisMapper =
thisKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUserMapper thatMapper =
thatKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUser expected =
new TestUser("teamlead-42", "Max", "Mustermann", "Long name of teamlead-42");

transactionTemplate.execute(
status -> {
thisKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thisMapper.insert(expected));
return new Object();
});

TestUser actual =
thatKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thatMapper.findById(expected.getId()));

assertThat(actual).isEqualTo(expected);
}

@Test
void should_NotRetrieveCreated_When_ParticipatingTransactionFailed() {
TestUserMapper thisMapper =
thisKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUserMapper thatMapper =
thatKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUser expected =
new TestUser("teamlead-42", "Max", "Mustermann", "Long name of teamlead-42");

final IllegalStateException expectedException = new IllegalStateException();

ThrowingCallable call =
() ->
transactionTemplate.execute(
status -> {
status.setRollbackOnly();
thisKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thisMapper.insert(expected));
throw expectedException;
});

assertThatExceptionOfType(IllegalStateException.class)
.isThrownBy(call)
.isSameAs(expectedException);

TestUser actual =
thatKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thatMapper.findById(expected.getId()));

assertThat(actual).isNull();
}
}

@Nested
@TestInstance(Lifecycle.PER_CLASS)
class KadaiEngineAutocommitModeTest {

private KadaiEngineProxy thisKadaiEngineProxy;
private KadaiEngineProxy thatKadaiEngineProxy;

@BeforeEach
public void setupKadaiEngines() throws Exception {
String schemaName = TestContainerExtension.determineSchemaName();
DataSource dataSource = TestContainerExtension.DATA_SOURCE;
KadaiConfiguration kadaiConfiguration =
new KadaiConfiguration.Builder(dataSource, false, schemaName, false)
.initKadaiProperties()
.build();
thisKadaiEngineProxy =
new KadaiEngineProxy(
KadaiEngine.buildKadaiEngine(
kadaiConfiguration, ConnectionManagementMode.AUTOCOMMIT));
thisKadaiEngineProxy.getSqlSession().getConfiguration().addMapper(TestUserMapper.class);

thatKadaiEngineProxy = new KadaiEngineProxy(KadaiEngine.buildKadaiEngine(kadaiConfiguration));
thatKadaiEngineProxy.getSqlSession().getConfiguration().addMapper(TestUserMapper.class);
}

@Test
void should_RetrieveCreated_When_NotManuallyCommited() {
TestUserMapper thisMapper =
thisKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUserMapper thatMapper =
thatKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUser expected =
new TestUser("teamlead-42", "Max", "Mustermann", "Long name of teamlead-42");

thisKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thisMapper.insert(expected));

TestUser actual =
thatKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thatMapper.findById(expected.getId()));

assertThat(actual).isEqualTo(expected);
}
}

@Nested
@TestInstance(Lifecycle.PER_CLASS)
class KadaiEngineExplicitModeTest {

private Connection thisConnection;
private KadaiEngineProxy thisKadaiEngineProxy;
private KadaiEngineProxy thatKadaiEngineProxy;

@BeforeEach
public void setupKadaiEngines() throws Exception {
String schemaName = TestContainerExtension.determineSchemaName();
DataSource dataSource = TestContainerExtension.DATA_SOURCE;
KadaiConfiguration kadaiConfiguration =
new KadaiConfiguration.Builder(dataSource, false, schemaName, false)
.initKadaiProperties()
.build();
thisKadaiEngineProxy =
new KadaiEngineProxy(
KadaiEngine.buildKadaiEngine(kadaiConfiguration, ConnectionManagementMode.EXPLICIT));
thisKadaiEngineProxy.getSqlSession().getConfiguration().addMapper(TestUserMapper.class);
thisConnection = dataSource.getConnection();
thisKadaiEngineProxy.getEngine().getEngine().setConnection(thisConnection);

thatKadaiEngineProxy = new KadaiEngineProxy(KadaiEngine.buildKadaiEngine(kadaiConfiguration));
thatKadaiEngineProxy.getSqlSession().getConfiguration().addMapper(TestUserMapper.class);
}

@AfterEach
void cleanConnections() {
thisKadaiEngineProxy.getEngine().getEngine().closeConnection();
}

@Test
void should_RetrieveCreated_When_Committed() throws Exception {
TestUserMapper thisMapper =
thisKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUserMapper thatMapper =
thatKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUser expected =
new TestUser("teamlead-42", "Max", "Mustermann", "Long name of teamlead-42");

thisKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thisMapper.insert(expected));
thisConnection.commit();

TestUser actual =
thatKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thatMapper.findById(expected.getId()));

assertThat(actual).isEqualTo(expected);
}

@Test
void should_NotRetrieveCreated_When_NotCommitted() {
TestUserMapper thisMapper =
thisKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUserMapper thatMapper =
thatKadaiEngineProxy.getSqlSession().getMapper(TestUserMapper.class);
TestUser expected =
new TestUser("teamlead-42", "Max", "Mustermann", "Long name of teamlead-42");

thisKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thisMapper.insert(expected));

TestUser actual =
thatKadaiEngineProxy
.getEngine()
.executeInDatabaseConnection(() -> thatMapper.findById(expected.getId()));

assertThat(actual).isNull();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,61 @@
import io.kadai.common.api.KadaiEngine.ConnectionManagementMode;
import io.kadai.common.internal.configuration.DbSchemaCreator;
import io.kadai.testapi.extensions.TestContainerExtension;
import javax.sql.DataSource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;

class KadaiEngineTest {

@ParameterizedTest
@EnumSource(ConnectionManagementMode.class)
void should_CreateKadaiEngine_When_GivenConnectionManagementModeIsActive(
ConnectionManagementMode connectionManagementMode) throws Exception {
private KadaiEngine kadaiEngine;

@BeforeEach
public void setupKadaiEngine() throws Exception {
String schemaName = TestContainerExtension.determineSchemaName();

DataSource dataSource = TestContainerExtension.DATA_SOURCE;
KadaiConfiguration kadaiConfiguration =
new KadaiConfiguration.Builder(TestContainerExtension.DATA_SOURCE, false, schemaName, true)
new KadaiConfiguration.Builder(dataSource, false, schemaName, false)
.initKadaiProperties()
.build();
this.kadaiEngine = KadaiEngine.buildKadaiEngine(kadaiConfiguration);
}

KadaiEngine.buildKadaiEngine(kadaiConfiguration, connectionManagementMode);
@Test
void should_DefaultToParticipateMode_When_BuildingKadaiEngineJustByConfiguration() {
assertThat(kadaiEngine.getConnectionManagementMode())
.isEqualTo(ConnectionManagementMode.PARTICIPATE);
}

@ParameterizedTest
@EnumSource(ConnectionManagementMode.class)
void should_CreateKadaiEngine_For_ConnectionManagementMode(ConnectionManagementMode mode) {
kadaiEngine.setConnectionManagementMode(mode);

DbSchemaCreator dsc =
new DbSchemaCreator(kadaiConfiguration.getDataSource(), kadaiConfiguration.getSchemaName());
new DbSchemaCreator(
kadaiEngine.getConfiguration().getDataSource(),
kadaiEngine.getConfiguration().getSchemaName());

assertThat(dsc.isValidSchemaVersion(KadaiEngine.MINIMAL_KADAI_SCHEMA_VERSION)).isTrue();
}

@ParameterizedTest
@EnumSource(ConnectionManagementMode.class)
void should_SetModeExplicit_When_SetConnection(ConnectionManagementMode mode) throws Exception {
kadaiEngine.setConnectionManagementMode(mode);
kadaiEngine.setConnection(kadaiEngine.getConfiguration().getDataSource().getConnection());

assertThat(kadaiEngine.getConnectionManagementMode())
.isEqualTo(ConnectionManagementMode.EXPLICIT);
}

@Test
void should_SetModeParticipate_When_CloseConnectionForModeExplicit() {
kadaiEngine.closeConnection();

assertThat(kadaiEngine.getConnectionManagementMode())
.isEqualTo(ConnectionManagementMode.PARTICIPATE);
}
}
Loading
Loading