/core/src/test/java/org/jobrunr/architecture/PackageDependenciesTest.java

https://github.com/jobrunr/jobrunr · Java · 154 lines · 129 code · 25 blank · 0 comment · 0 complexity · 0fe2d6b841658077feec1666a66cfd99 MD5 · raw file

  1. package org.jobrunr.architecture;
  2. import com.tngtech.archunit.core.importer.ImportOption;
  3. import com.tngtech.archunit.core.importer.ImportOption.DoNotIncludeTests;
  4. import com.tngtech.archunit.core.importer.Location;
  5. import com.tngtech.archunit.junit.AnalyzeClasses;
  6. import com.tngtech.archunit.junit.ArchTest;
  7. import com.tngtech.archunit.lang.ArchRule;
  8. import org.jobrunr.JobRunrException;
  9. import org.jobrunr.architecture.PackageDependenciesTest.DoNotIncludeTestFixtures;
  10. import org.jobrunr.server.BackgroundJobPerformer;
  11. import org.jobrunr.server.dashboard.DashboardNotification;
  12. import org.jobrunr.utils.reflection.autobox.InstantForOracleTypeAutoboxer;
  13. import static com.tngtech.archunit.core.domain.JavaClass.Predicates.assignableFrom;
  14. import static com.tngtech.archunit.core.domain.JavaClass.Predicates.equivalentTo;
  15. import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAnyPackage;
  16. import static com.tngtech.archunit.lang.conditions.ArchPredicates.are;
  17. import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
  18. import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
  19. @AnalyzeClasses(packages = "org.jobrunr", importOptions = {DoNotIncludeTests.class, DoNotIncludeTestFixtures.class})
  20. class PackageDependenciesTest {
  21. static class DoNotIncludeTestFixtures implements ImportOption {
  22. @Override
  23. public boolean includes(Location location) {
  24. return !location.toString().contains("test-fixtures");
  25. }
  26. }
  27. @ArchTest
  28. ArchRule jobRunrConfigurationDependenciesTest = classes()
  29. .that().resideInAPackage("org.jobrunr.configuration..")
  30. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "java..");
  31. @ArchTest
  32. ArchRule jobRunrDashboardClassesDependenciesTest = classes()
  33. .that().resideInAPackage("org.jobrunr.dashboard..")
  34. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "com.sun..", "org.slf4j..", "java..");
  35. @ArchTest
  36. ArchRule jobDashboardClassesShouldNotDependOnServerClasses = noClasses()
  37. .that().resideInAPackage("org.jobrunr.dashboard..")
  38. .should().onlyDependOnClassesThat(
  39. resideInAnyPackage("org.jobrunr.server..")
  40. .or(are(assignableFrom(DashboardNotification.class)))
  41. );
  42. @ArchTest
  43. ArchRule jobRunrJobsClassesDependenciesTest = classes()
  44. .that().resideInAPackage("org.jobrunr.jobs..")
  45. .and().resideOutsideOfPackage("org.jobrunr.jobs.details..")
  46. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "org.slf4j..", "java..")
  47. .orShould().beAnonymousClasses(); // needed to make switch case work.
  48. @ArchTest
  49. ArchRule jobRunrJobsDetailsClassesDependenciesTest = classes()
  50. .that().resideInAPackage("org.jobrunr.jobs.details..")
  51. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "org.objectweb.asm..", "org.slf4j..", "java..");
  52. @ArchTest
  53. ArchRule jobRunrSchedulingClassesDependenciesTest = classes()
  54. .that().resideInAPackage("org.jobrunr.scheduling..")
  55. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "org.slf4j..", "java..");
  56. @ArchTest
  57. ArchRule jobSchedulingClassesShouldNotDependOnServerClasses = noClasses()
  58. .that().resideInAPackage("org.jobrunr.scheduling..")
  59. .should().dependOnClassesThat().resideInAnyPackage("org.jobrunr.server..");
  60. @ArchTest
  61. ArchRule jobRunrServerClassesDependenciesTest = classes()
  62. .that().resideInAPackage("org.jobrunr.server..")
  63. .and().resideOutsideOfPackage("org.jobrunr.server.jmx..")
  64. .and().resideOutsideOfPackage("org.jobrunr.server.metrics..")
  65. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "org.slf4j..", "java..");
  66. @ArchTest
  67. ArchRule jobRunrServerJmxClassesDependenciesTest = classes()
  68. .that().resideInAPackage("org.jobrunr.server.jmx..")
  69. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "java..", "javax.management..");
  70. @ArchTest
  71. ArchRule jobServerClassesShouldNotDependOnSchedulingClasses = noClasses()
  72. .that().resideInAPackage("org.jobrunr.server..").and().areNotAssignableFrom(BackgroundJobPerformer.class)
  73. .should().dependOnClassesThat().resideInAnyPackage("org.jobrunr.scheduling..");
  74. @ArchTest
  75. ArchRule jobServerClassesShouldNotDependOnDashboardClasses = noClasses()
  76. .that().resideInAPackage("org.jobrunr.server..")
  77. .should().dependOnClassesThat().resideInAnyPackage("org.jobrunr.dashboard..");
  78. @ArchTest
  79. ArchRule jobRunrStorageClassesDependenciesTest = classes()
  80. .that().resideInAPackage("org.jobrunr.storage")
  81. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr.jobs..", "org.jobrunr.storage..", "org.jobrunr.utils..", "org.jobrunr.server.jmx..", "org.slf4j..", "java..");
  82. @ArchTest
  83. ArchRule jobRunrStorageElasticSearchClassesDependenciesTest = classes()
  84. .that().resideInAPackage("org.jobrunr.storage.nosql.elasticsearch..")
  85. .should().onlyDependOnClassesThat(
  86. resideInAnyPackage("org.jobrunr.jobs..", "org.jobrunr.storage..", "org.jobrunr.utils..", "org.elasticsearch..", "org.apache.http..", "org.slf4j..", "java..")
  87. .or(are(equivalentTo(JobRunrException.class)))
  88. );
  89. @ArchTest
  90. ArchRule jobRunrStorageMongoClassesDependenciesTest = classes()
  91. .that().resideInAPackage("org.jobrunr.storage.nosql.mongo..")
  92. .should().onlyDependOnClassesThat(
  93. resideInAnyPackage("org.jobrunr.jobs..", "org.jobrunr.storage..", "org.jobrunr.utils..", "com.mongodb..", "org.bson..", "org.slf4j..", "java..", "")
  94. .or(are(equivalentTo(JobRunrException.class)))
  95. ); // see https://github.com/TNG/ArchUnit/issues/519
  96. @ArchTest
  97. ArchRule jobRunrStorageRedisJedisClassesDependenciesTest = classes()
  98. .that().resideInAPackage("org.jobrunr.storage.nosql.redis..")
  99. .and().haveSimpleNameStartingWith("Jedis")
  100. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr.jobs..", "org.jobrunr.storage..", "org.jobrunr.utils..", "redis.clients..", "org.slf4j..", "java..");
  101. @ArchTest
  102. ArchRule jobRunrStorageRedisLettuceClassesDependenciesTest = classes()
  103. .that().resideInAPackage("org.jobrunr.storage.nosql.redis..")
  104. .and().haveSimpleNameStartingWith("Lettuce")
  105. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr.jobs..", "org.jobrunr.storage..", "org.jobrunr.utils..", "io.lettuce..", "org.apache.commons.pool2..", "org.slf4j..", "java..");
  106. @ArchTest
  107. ArchRule jobRunrStorageSqlClassesDependenciesTest = classes()
  108. .that().resideInAnyPackage("org.jobrunr.storage.sql..")
  109. .and().resideOutsideOfPackage("org.jobrunr.storage.sql.common..")
  110. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr.jobs..", "org.jobrunr.storage..", "org.jobrunr.utils..", "javax.sql..", "org.slf4j..", "java..");
  111. @ArchTest
  112. ArchRule jobRunrUtilsClassesDependenciesTest = classes()
  113. .that().resideInAPackage("org.jobrunr.utils..")
  114. .and().resideOutsideOfPackage("org.jobrunr.utils.mapper..")
  115. .and().doNotHaveFullyQualifiedName(InstantForOracleTypeAutoboxer.class.getName())
  116. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "org.slf4j..", "java..");
  117. @ArchTest
  118. ArchRule jobRunrUtilsGsonMapperClassesDependenciesTest = classes()
  119. .that().resideInAPackage("org.jobrunr.utils.mapper.gson..")
  120. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "com.google.gson..", "java..", "");
  121. @ArchTest
  122. ArchRule jobRunrUtilsJacksonMapperClassesDependenciesTest = classes()
  123. .that().resideInAPackage("org.jobrunr.utils.mapper.jackson..")
  124. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "com.fasterxml..", "java..");
  125. @ArchTest
  126. ArchRule jobRunrUtilsJsonBMapperClassesDependenciesTest = classes()
  127. .that().resideInAPackage("org.jobrunr.utils.mapper.jsonb..")
  128. .should().onlyDependOnClassesThat().resideInAnyPackage("org.jobrunr..", "javax.json..", "java..");
  129. }