From 5c18cc9b4a914d05688c50012c058c026f51ce1e Mon Sep 17 00:00:00 2001 From: Oliver Koch Date: Fri, 29 Jul 2022 13:32:52 +0200 Subject: [PATCH] TSK-1924: added test for the dependency hierarchy of TASKANA --- .../java/acceptance/ArchitectureTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/lib/taskana-core-test/src/test/java/acceptance/ArchitectureTest.java b/lib/taskana-core-test/src/test/java/acceptance/ArchitectureTest.java index 7fd889385..94126ad9a 100644 --- a/lib/taskana-core-test/src/test/java/acceptance/ArchitectureTest.java +++ b/lib/taskana-core-test/src/test/java/acceptance/ArchitectureTest.java @@ -16,6 +16,7 @@ import static com.tngtech.archunit.library.GeneralCodingRules.USE_JODATIME; import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.slices; import static com.tngtech.archunit.library.freeze.FreezingArchRule.freeze; import static java.util.function.Predicate.not; +import static java.util.stream.Collectors.toCollection; import static org.assertj.core.api.Assertions.assertThat; import com.tngtech.archunit.base.DescribedPredicate; @@ -57,6 +58,7 @@ import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.function.ThrowingConsumer; +import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.exceptions.ErrorCode; import pro.taskana.common.api.exceptions.TaskanaException; @@ -252,6 +254,40 @@ class ArchitectureTest { .check(importedClasses); } + @Test + void moduleTaskShouldOnlyDependOn() { + // FIXME should not depend on spi + moduleShouldOnlyDependOn("task", List.of("workbasket", "classification", "common", "spi")); + } + + @Test + void moduleClassificationShouldOnlyDependOn() { + moduleShouldOnlyDependOn("workbasket", List.of("common")); + } + + @Test + void moduleWorkbasketShouldOnlyDependOn() { + moduleShouldOnlyDependOn("workbasket", List.of("common")); + } + + @Test + @Disabled("Test is failing for an unknown reason") + void moduleMonitorShouldOnlyDependOn() { + // FIXME fails for some unknown reason... + moduleShouldOnlyDependOn("monitor", List.of("common", "classification", "task", "workbasket")); + } + + @Test + void moduleUserShouldOnlyDependOn() { + moduleShouldOnlyDependOn("user", List.of("common")); + } + + @Test + void moduleSpiShouldOnlyDependOn() { + // FIXME should not depend on task, classification and workbasket + moduleShouldOnlyDependOn("spi", List.of("common", "task", "classification", "workbasket")); + } + @TestFactory Stream rootModulesShouldExist() { Function descriptionProvider = p -> String.format("Package '%s' exists", p); @@ -393,6 +429,38 @@ class ArchitectureTest { // region Helper Methods + /** + * Test the dependencies of the packages. Adds the prefix pro.taskana to every given + * value. + * + * @param module the module which should be tested + * @param dependentModules the expected dependent modules + */ + private void moduleShouldOnlyDependOn(String module, List dependentModules) { + + String moduleTemplate = "pro.taskana.%s.."; + + String moduleUndertest = String.format(moduleTemplate, module); + + List dependentModulesList = + dependentModules.stream() + .map(dp -> String.format(moduleTemplate, dp)) + .collect(toCollection(ArrayList::new)); + dependentModulesList.addAll(List.of("java..", "org..")); + dependentModulesList.add(moduleUndertest); + + classes() + .that() + .resideInAPackage(moduleUndertest) + .should() + .onlyAccessClassesThat() + .resideInAnyPackage(dependentModulesList.toArray(new String[0])) + .orShould() + .dependOnClassesThat() + .areAssignableTo(TaskanaEngineConfiguration.class) + .check(importedClasses); + } + private static ArchCondition implementToString() { return new ArchCondition<>("implement toString()") { @Override