diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index f0dd31427..bafd6bcc5 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -274,15 +274,13 @@ jobs: with: name: ${{ env.ARTIFACTS_TASKANA_JARS_NAME }} path: ${{ env.ARTIFACTS_TASKANA_JARS_PATH }} - - name: Prepare database - run: docker-databases/prepare_db.sh ${{ matrix.database }} - name: Generate JavaDoc for Rest Documentation if: matrix.module == 'taskana-simplehistory-rest-spring' run: ./mvnw -B validate -pl :taskana-rest-spring - name: Test run: ./mvnw -B verify -pl :${{matrix.module}} -Dcheckstyle.skip env: - db.type: ${{ matrix.database }} + DB: ${{ matrix.database }} - name: Upload JaCoCo Report if: matrix.database == 'H2' uses: actions/upload-artifact@v2 diff --git a/.run/All in taskana-core DB2.run.xml b/.run/All in taskana-core DB2.run.xml new file mode 100644 index 000000000..3e19523f9 --- /dev/null +++ b/.run/All in taskana-core DB2.run.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/.run/All in taskana-core POSTGRES.run.xml b/.run/All in taskana-core POSTGRES.run.xml new file mode 100644 index 000000000..5ce665c07 --- /dev/null +++ b/.run/All in taskana-core POSTGRES.run.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/.run/Run ArchitectureTest.run.xml b/.run/Run ArchitectureTest.run.xml new file mode 100644 index 000000000..0a630c7bd --- /dev/null +++ b/.run/Run ArchitectureTest.run.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/taskana-common-test/pom.xml b/common/taskana-common-test/pom.xml index 17e7decb1..13a3d0566 100644 --- a/common/taskana-common-test/pom.xml +++ b/common/taskana-common-test/pom.xml @@ -106,6 +106,28 @@ org.springframework spring-webmvc + + org.testcontainers + db2 + ${version.testcontainers} + + + junit + junit + + + + + org.testcontainers + postgresql + ${version.testcontainers} + + + junit + junit + + + diff --git a/lib/taskana-core/src/test/java/testapi/util/DockerContainerCreator.java b/common/taskana-common-test/src/main/java/pro/taskana/common/test/DockerContainerCreator.java similarity index 98% rename from lib/taskana-core/src/test/java/testapi/util/DockerContainerCreator.java rename to common/taskana-common-test/src/main/java/pro/taskana/common/test/DockerContainerCreator.java index 6f03cac78..630655c3c 100644 --- a/lib/taskana-core/src/test/java/testapi/util/DockerContainerCreator.java +++ b/common/taskana-common-test/src/main/java/pro/taskana/common/test/DockerContainerCreator.java @@ -1,4 +1,4 @@ -package testapi.util; +package pro.taskana.common.test; import static java.time.temporal.ChronoUnit.SECONDS; diff --git a/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/DataSourceGenerator.java b/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/DataSourceGenerator.java index 8e88f270c..a6c63d7aa 100644 --- a/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/DataSourceGenerator.java +++ b/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/DataSourceGenerator.java @@ -1,14 +1,12 @@ package pro.taskana.common.test.config; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; +import java.util.Optional; import javax.sql.DataSource; import org.apache.ibatis.datasource.pooled.PooledDataSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.testcontainers.containers.JdbcDatabaseContainer; + +import pro.taskana.common.internal.configuration.DB; +import pro.taskana.common.test.DockerContainerCreator; /** * The DataSourceGenerator provides the proper {@linkplain DataSource} for all Integration tests. @@ -23,22 +21,22 @@ import org.slf4j.LoggerFactory; */ public final class DataSourceGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceGenerator.class); private static final DataSource DATA_SOURCE; private static final String SCHEMA_NAME; - private static final String DEFAULT_SCHEMA_NAME = "TASKANA"; private static final int POOL_TIME_TO_WAIT = 50; static { - String propertiesFileName = System.getProperty("user.home") + "/taskanaUnitTest.properties"; - File f = new File(propertiesFileName); - if (f.exists() && !f.isDirectory()) { - DATA_SOURCE = createDataSourceFromProperties(propertiesFileName); - SCHEMA_NAME = getSchemaNameFromPropertiesObject(propertiesFileName); + DB db = retrieveDatabaseFromEnv(); + Optional> dockerContainer = + DockerContainerCreator.createDockerContainer(db); + + SCHEMA_NAME = determineSchemaName(db); + if (dockerContainer.isPresent()) { + dockerContainer.get().start(); + DATA_SOURCE = DockerContainerCreator.createDataSource(dockerContainer.get()); } else { DATA_SOURCE = createDataSourceForH2(); - SCHEMA_NAME = DEFAULT_SCHEMA_NAME; } } @@ -52,84 +50,19 @@ public final class DataSourceGenerator { return SCHEMA_NAME; } - private static DataSource createDataSourceFromProperties(String propertiesFileName) { - DataSource ds; - try (InputStream input = new FileInputStream(propertiesFileName)) { - Properties prop = new Properties(); - prop.load(input); - boolean propertiesFileIsComplete = true; - String warningMessage = ""; - String jdbcDriver = prop.getProperty("jdbcDriver"); - if (jdbcDriver == null || jdbcDriver.length() == 0) { - propertiesFileIsComplete = false; - warningMessage += ", jdbcDriver property missing"; - } - String jdbcUrl = prop.getProperty("jdbcUrl"); - if (jdbcUrl == null || jdbcUrl.length() == 0) { - propertiesFileIsComplete = false; - warningMessage += ", jdbcUrl property missing"; - } - String dbUserName = prop.getProperty("dbUserName"); - if (dbUserName == null || dbUserName.length() == 0) { - propertiesFileIsComplete = false; - warningMessage += ", dbUserName property missing"; - } - String dbPassword = prop.getProperty("dbPassword"); - if (dbPassword == null || dbPassword.length() == 0) { - propertiesFileIsComplete = false; - warningMessage += ", dbPassword property missing"; - } - - if (propertiesFileIsComplete) { - ds = - new PooledDataSource( - Thread.currentThread().getContextClassLoader(), - jdbcDriver, - jdbcUrl, - dbUserName, - dbPassword); - ((PooledDataSource) ds) - .forceCloseAll(); // otherwise, the MyBatis pool is not initialized correctly - } else { - LOGGER.warn("propertiesFile {} is incomplete {}", propertiesFileName, warningMessage); - LOGGER.warn("Using default Datasource for Test"); - ds = createDataSourceForH2(); - } - - } catch (IOException e) { - LOGGER.warn("createDataSourceFromProperties caught Exception ", e); - LOGGER.warn("Using default Datasource for Test"); - ds = createDataSourceForH2(); - } - - return ds; + private static String determineSchemaName(DB db) { + return db == DB.POSTGRES ? "taskana" : "TASKANA"; } - private static String getSchemaNameFromPropertiesObject(String propertiesFileName) { - String schemaName = DEFAULT_SCHEMA_NAME; - try (InputStream input = new FileInputStream(propertiesFileName)) { - Properties prop = new Properties(); - prop.load(input); - boolean propertiesFileIsComplete = true; - String warningMessage = ""; - schemaName = prop.getProperty("schemaName"); - if (schemaName == null || schemaName.length() == 0) { - propertiesFileIsComplete = false; - warningMessage += ", schemaName property missing"; - } - - if (!propertiesFileIsComplete) { - LOGGER.warn("propertiesFile {} is incomplete {}", propertiesFileName, warningMessage); - LOGGER.warn("Using default Datasource for Test"); - schemaName = DEFAULT_SCHEMA_NAME; - } - - } catch (IOException e) { - LOGGER.warn("getSchemaNameFromPropertiesObject caught Exception ", e); - LOGGER.warn("Using default schemaName for Test"); + private static DB retrieveDatabaseFromEnv() { + String property = System.getenv("DB"); + DB db; + try { + db = DB.valueOf(property); + } catch (Exception ex) { + db = DB.H2; } - - return schemaName; + return db; } private static DataSource createDataSourceForH2() { diff --git a/lib/taskana-core/pom.xml b/lib/taskana-core/pom.xml index 6c865ed41..9a5e862e7 100644 --- a/lib/taskana-core/pom.xml +++ b/lib/taskana-core/pom.xml @@ -111,7 +111,7 @@ ${version.archunit} test - + org.testcontainers db2 ${version.testcontainers} diff --git a/lib/taskana-core/src/test/java/acceptance/jobs/helper/TaskUpdatePriorityWorkerAccTest.java b/lib/taskana-core/src/test/java/acceptance/jobs/helper/TaskUpdatePriorityWorkerAccTest.java index 4cfe1da82..1394d0ae3 100644 --- a/lib/taskana-core/src/test/java/acceptance/jobs/helper/TaskUpdatePriorityWorkerAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/jobs/helper/TaskUpdatePriorityWorkerAccTest.java @@ -28,8 +28,10 @@ import pro.taskana.task.api.models.TaskSummary; import pro.taskana.task.internal.builder.TaskBuilder; import pro.taskana.task.internal.jobs.helper.TaskUpdatePriorityWorker; import pro.taskana.task.internal.models.TaskImpl; +import pro.taskana.workbasket.api.WorkbasketPermission; import pro.taskana.workbasket.api.WorkbasketService; import pro.taskana.workbasket.api.models.WorkbasketSummary; +import pro.taskana.workbasket.internal.builder.WorkbasketAccessItemBuilder; @TaskanaIntegrationTest class TaskUpdatePriorityWorkerAccTest { @@ -42,18 +44,29 @@ class TaskUpdatePriorityWorkerAccTest { TaskSummary task1; TaskSummary task2; Task completedTask; + ClassificationSummary classificationSummary; + WorkbasketSummary workbasketSummary; @WithAccessId(user = "admin") @BeforeAll void setUp(ClassificationService classificationService, WorkbasketService workbasketService) throws Exception { - ClassificationSummary classificationSummary = + classificationSummary = DefaultTestEntities.defaultTestClassification() .buildAndStore(classificationService) .asSummary(); - WorkbasketSummary workbasketSummary = + workbasketSummary = DefaultTestEntities.defaultTestWorkbasket().buildAndStore(workbasketService).asSummary(); + // Currently, we have a bug: TSK-1736 + // Because of that we need at least one WorkbasketAccessItem with the correct permissions. + // Otherwise, the DB2 will not work. + WorkbasketAccessItemBuilder.newWorkbasketAccessItem() + .workbasketId(workbasketSummary.getId()) + .accessId("whatever") + .permission(WorkbasketPermission.READ) + .buildAndStore(workbasketService); + TaskBuilder taskBuilder = TaskBuilder.newTask() .classificationSummary(classificationSummary) @@ -127,16 +140,8 @@ class TaskUpdatePriorityWorkerAccTest { @Test @WithAccessId(user = "admin") - void should_executeBatch( - WorkbasketService workbasketService, ClassificationService classificationService) - throws Exception { + void should_executeBatch() throws Exception { // given - ClassificationSummary classificationSummary = - DefaultTestEntities.defaultTestClassification() - .buildAndStore(classificationService) - .asSummary(); - WorkbasketSummary workbasketSummary = - DefaultTestEntities.defaultTestWorkbasket().buildAndStore(workbasketService).asSummary(); Task oldTask = TaskBuilder.newTask() .classificationSummary(classificationSummary) diff --git a/lib/taskana-core/src/test/java/testapi/extensions/TestContainerExtension.java b/lib/taskana-core/src/test/java/testapi/extensions/TestContainerExtension.java index 9c43437a4..b2e451414 100644 --- a/lib/taskana-core/src/test/java/testapi/extensions/TestContainerExtension.java +++ b/lib/taskana-core/src/test/java/testapi/extensions/TestContainerExtension.java @@ -1,7 +1,8 @@ package testapi.extensions; import static org.junit.platform.commons.support.AnnotationSupport.isAnnotated; -import static testapi.util.DockerContainerCreator.createDockerContainer; +import static pro.taskana.common.test.DockerContainerCreator.createDataSource; +import static pro.taskana.common.test.DockerContainerCreator.createDockerContainer; import static testapi.util.ExtensionCommunicator.getClassLevelStore; import static testapi.util.ExtensionCommunicator.isTopLevelClass; @@ -21,7 +22,6 @@ import org.testcontainers.containers.JdbcDatabaseContainer; import testapi.CleanTaskanaContext; import testapi.TaskanaEngineConfigurationModifier; import testapi.WithServiceProvider; -import testapi.util.DockerContainerCreator; import pro.taskana.common.internal.configuration.DB; @@ -47,7 +47,7 @@ public class TestContainerExtension implements AfterAllCallback, InvocationInter .ifPresentOrElse( container -> { container.start(); - store.put(STORE_DATA_SOURCE, DockerContainerCreator.createDataSource(container)); + store.put(STORE_DATA_SOURCE, createDataSource(container)); store.put(STORE_CONTAINER, container); }, () -> store.put(STORE_DATA_SOURCE, createDataSourceForH2())); @@ -87,7 +87,7 @@ public class TestContainerExtension implements AfterAllCallback, InvocationInter } private static DB retrieveDatabaseFromEnv() { - String property = System.getenv("db.type"); + String property = System.getenv("DB"); DB db; try { db = DB.valueOf(property);