TSK-1882: test-api now uses one database with different schema names

Co-authored-by: ryzheboka <25465835+ryzheboka@users.noreply.github.com>
This commit is contained in:
Mustapha Zorgati 2022-07-19 13:17:55 +02:00
parent 83890ddd16
commit 045ef3c7a1
2 changed files with 101 additions and 69 deletions

View File

@ -11,13 +11,10 @@ import java.util.Optional;
import java.util.UUID;
import javax.sql.DataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ExtensionContext.Store;
import org.junit.jupiter.api.extension.InvocationInterceptor;
import org.junit.jupiter.api.extension.ReflectiveInvocationContext;
import org.junit.platform.commons.support.AnnotationSupport;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.JdbcDatabaseContainer;
import pro.taskana.common.internal.configuration.DB;
@ -25,12 +22,25 @@ import pro.taskana.testapi.CleanTaskanaContext;
import pro.taskana.testapi.TaskanaEngineConfigurationModifier;
import pro.taskana.testapi.WithServiceProvider;
public class TestContainerExtension implements AfterAllCallback, InvocationInterceptor {
public class TestContainerExtension implements InvocationInterceptor {
public static final String STORE_DATA_SOURCE = "datasource";
public static final String STORE_CONTAINER = "container";
public static final String STORE_SCHEMA_NAME = "schemaName";
public static final DataSource DATA_SOURCE;
public static final DB EXECUTION_DATABASE = retrieveDatabaseFromEnv();
static {
Optional<JdbcDatabaseContainer<?>> container = createDockerContainer(EXECUTION_DATABASE);
if (container.isPresent()) {
container.get().start();
DATA_SOURCE = createDataSource(container.get());
} else {
DATA_SOURCE = createDataSourceForH2();
}
}
@Override
public <T> T interceptTestClassConstructor(
Invocation<T> invocation,
@ -40,18 +50,8 @@ public class TestContainerExtension implements AfterAllCallback, InvocationInter
Class<?> testClass = extensionContext.getRequiredTestClass();
if (isTopLevelClass(testClass) || isAnnotated(testClass, CleanTaskanaContext.class)) {
Store store = getClassLevelStore(extensionContext);
DB db = retrieveDatabaseFromEnv();
store.put(STORE_SCHEMA_NAME, determineSchemaName(db));
createDockerContainer(db)
.ifPresentOrElse(
container -> {
container.start();
store.put(STORE_DATA_SOURCE, createDataSource(container));
store.put(STORE_CONTAINER, container);
},
() -> store.put(STORE_DATA_SOURCE, createDataSourceForH2()));
store.put(STORE_SCHEMA_NAME, determineSchemaName());
store.put(STORE_DATA_SOURCE, DATA_SOURCE);
} else if (TaskanaEngineConfigurationModifier.class.isAssignableFrom(testClass)
|| isAnnotated(testClass, WithServiceProvider.class)) {
// since the implementation of TaskanaEngineConfigurationModifier implies the generation of a
@ -66,24 +66,14 @@ public class TestContainerExtension implements AfterAllCallback, InvocationInter
return invocation.proceed();
}
@Override
public void afterAll(ExtensionContext context) {
Class<?> testClass = context.getRequiredTestClass();
if (isTopLevelClass(testClass)
|| AnnotationSupport.isAnnotated(testClass, CleanTaskanaContext.class)) {
Optional.ofNullable(getClassLevelStore(context).get(STORE_CONTAINER))
.map(JdbcDatabaseContainer.class::cast)
.ifPresent(GenericContainer::stop);
}
}
private static void copyValue(String key, Store source, Store destination) {
Object value = source.get(key);
destination.put(key, value);
}
private static String determineSchemaName(DB db) {
return db == DB.POSTGRES ? "taskana" : "TASKANA";
private static String determineSchemaName() {
String uniqueId = "A" + UUID.randomUUID().toString().replace("-", "_");
return EXECUTION_DATABASE == DB.POSTGRES ? uniqueId.toLowerCase() : uniqueId;
}
private static DB retrieveDatabaseFromEnv() {
@ -102,11 +92,7 @@ public class TestContainerExtension implements AfterAllCallback, InvocationInter
new PooledDataSource(
Thread.currentThread().getContextClassLoader(),
"org.h2.Driver",
"jdbc:h2:mem:"
+ UUID.randomUUID()
+ ";LOCK_MODE=0;"
+ "INIT=CREATE SCHEMA IF NOT EXISTS TASKANA\\;"
+ "SET COLLATION DEFAULT_de_DE ",
"jdbc:h2:mem:taskana;LOCK_MODE=0;INIT=SET COLLATION DEFAULT_de_DE",
"sa",
"sa");
ds.setPoolTimeToWait(50);

View File

@ -2,7 +2,6 @@ package pro.taskana.testapi.tests;
import static org.assertj.core.api.Assertions.assertThat;
import java.sql.Connection;
import javax.sql.DataSource;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@ -23,12 +22,19 @@ class TestContainerExtensionTest {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration;
@Test
void should_CreateNewDataSource_For_TopLevelTestClass() {
void should_CreateDataSource_For_TopLevelTestClass() {
DataSource datasource = taskanaEngineConfiguration.getDatasource();
assertThat(datasource).isNotNull();
}
@Test
void should_CreateSchemaName_For_TopLevelTestClass() {
String schemaName = taskanaEngineConfiguration.getSchemaName();
assertThat(schemaName).isNotNull();
}
@Nested
@TestInstance(Lifecycle.PER_CLASS)
class NestedTestClass {
@ -43,6 +49,15 @@ class TestContainerExtensionTest {
assertThat(nestedDataSource).isSameAs(topLevelDataSource).isNotNull();
}
@Test
void should_ReuseSchemaName_For_NestedTestClass() {
String nestedSchemaName = taskanaEngineConfiguration.getSchemaName();
String topLevelSchemaName =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getSchemaName();
assertThat(nestedSchemaName).isNotNull().isEqualTo(topLevelSchemaName);
}
}
@Nested
@ -64,6 +79,15 @@ class TestContainerExtensionTest {
assertThat(nestedDataSource).isSameAs(topLevelDataSource).isNotNull();
}
@Test
void should_ReuseSchemaName_For_NestedTestClassWhichImplementsConfigurationModifier() {
String nestedSchemaName = taskanaEngineConfiguration.getSchemaName();
String topLevelSchemaName =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getSchemaName();
assertThat(nestedSchemaName).isNotNull().isEqualTo(topLevelSchemaName);
}
}
@CleanTaskanaContext
@ -74,21 +98,21 @@ class TestContainerExtensionTest {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration;
@Test
void should_CreateNewDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext()
throws Exception {
void should_ReuseDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() {
DataSource nestedDataSource = taskanaEngineConfiguration.getDatasource();
DataSource topLevelDataSource =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getDatasource();
String nestedDataSourceUrl;
String topLevelDataSourceUrl;
try (Connection connection = nestedDataSource.getConnection()) {
nestedDataSourceUrl = connection.getMetaData().getURL();
}
try (Connection connection = topLevelDataSource.getConnection()) {
topLevelDataSourceUrl = connection.getMetaData().getURL();
}
assertThat(nestedDataSourceUrl).isNotEqualTo(topLevelDataSourceUrl).isNotNull();
assertThat(nestedDataSource).isNotNull().isSameAs(topLevelDataSource);
}
@Test
void should_GenerateNewSchemaName_For_NestedTestAnnotatedWithCleanTaskanaContext() {
String nestedSchemaName = taskanaEngineConfiguration.getSchemaName();
String topLevelSchemaName =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getSchemaName();
assertThat(nestedSchemaName).isNotNull().isNotEqualTo(topLevelSchemaName);
}
@CleanTaskanaContext
@ -99,31 +123,35 @@ class TestContainerExtensionTest {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration;
@Test
void should_CreateNewDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext()
throws Exception {
void should_ReuseDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() {
DataSource nestedNestedDataSource = taskanaEngineConfiguration.getDatasource();
DataSource nestedDataSource =
NestedTestClassAnnotatedWithCleanTaskanaContext.this.taskanaEngineConfiguration
NestedNestedTestClassAnnotatedWithCleanTaskanaContext.this.taskanaEngineConfiguration
.getDatasource();
DataSource topLevelDataSource =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getDatasource();
String nestedNestedDataSourceUrl;
String nestedDataSourceUrl;
String topLevelDataSourceUrl;
try (Connection connection = nestedNestedDataSource.getConnection()) {
nestedNestedDataSourceUrl = connection.getMetaData().getURL();
}
try (Connection connection = nestedDataSource.getConnection()) {
nestedDataSourceUrl = connection.getMetaData().getURL();
}
try (Connection connection = topLevelDataSource.getConnection()) {
topLevelDataSourceUrl = connection.getMetaData().getURL();
}
assertThat(nestedNestedDataSourceUrl)
.isNotEqualTo(nestedDataSourceUrl)
.isNotEqualTo(topLevelDataSourceUrl)
.isNotNull();
assertThat(nestedNestedDataSource)
.isNotNull()
.isSameAs(topLevelDataSource)
.isSameAs(nestedDataSource);
}
@Test
void should_GenerateNewSchemaName_For_NestedTestAnnotatedWithCleanTaskanaContext() {
String nestedNestedSchemaName = taskanaEngineConfiguration.getSchemaName();
String nestedSchemaName =
NestedTestClassAnnotatedWithCleanTaskanaContext.this.taskanaEngineConfiguration
.getSchemaName();
String topLevelSchemaName =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getSchemaName();
assertThat(nestedSchemaName).isNotNull().isNotEqualTo(topLevelSchemaName);
assertThat(nestedNestedSchemaName)
.isNotNull()
.isNotEqualTo(nestedSchemaName)
.isNotEqualTo(topLevelSchemaName);
}
}
}
@ -142,12 +170,21 @@ class TestContainerExtensionTest {
}
@Test
void should_CreateNewDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() {
void should_ReuseNewDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() {
DataSource nestedDataSource = taskanaEngineConfiguration.getDatasource();
DataSource topLevelDataSource =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getDatasource();
assertThat(nestedDataSource).isNotSameAs(topLevelDataSource).isNotNull();
assertThat(nestedDataSource).isNotNull().isSameAs(topLevelDataSource);
}
@Test
void should_GenerateNewSchemaName_For_NestedTestAnnotatedWithCleanTaskanaContext() {
String nestedSchemaName = taskanaEngineConfiguration.getSchemaName();
String topLevelSchemaName =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getSchemaName();
assertThat(nestedSchemaName).isNotNull().isNotEqualTo(topLevelSchemaName);
}
}
@ -168,5 +205,14 @@ class TestContainerExtensionTest {
assertThat(nestedDataSource).isSameAs(topLevelDataSource).isNotNull();
}
@Test
void should_ReuseSchemaName_For_NestedTestClassWithServiceProvider() {
String nestedSchemaName = taskanaEngineConfiguration.getSchemaName();
String topLevelSchemaName =
TestContainerExtensionTest.this.taskanaEngineConfiguration.getSchemaName();
assertThat(nestedSchemaName).isNotNull().isEqualTo(topLevelSchemaName);
}
}
}