From 09a1e3e380c6bfe777e662599efa153037498228 Mon Sep 17 00:00:00 2001 From: XXNitram Date: Mon, 9 Mar 2020 16:47:16 +0100 Subject: [PATCH 1/2] Add Architecture Tests with ArchUnit --- .../gruppen2/architecture/ArchUnitTest.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/test/java/mops/gruppen2/architecture/ArchUnitTest.java diff --git a/src/test/java/mops/gruppen2/architecture/ArchUnitTest.java b/src/test/java/mops/gruppen2/architecture/ArchUnitTest.java new file mode 100644 index 0000000..2d0b315 --- /dev/null +++ b/src/test/java/mops/gruppen2/architecture/ArchUnitTest.java @@ -0,0 +1,91 @@ +package mops.gruppen2.architecture; + +import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchIgnore; +import com.tngtech.archunit.junit.ArchTest; +import com.tngtech.archunit.lang.ArchRule; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Controller; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; + +@AnalyzeClasses(packages = "mops.gruppen2") +public class ArchUnitTest { + + @ArchTest + public static final ArchRule controllerClassesShouldBeAnnotatedWithControllerOrRestControllerAnnotation = classes() + .that().haveSimpleNameEndingWith("Controller") + .should().beAnnotatedWith(Controller.class) + .orShould().beAnnotatedWith(RestController.class); + + @ArchTest + public static final ArchRule controllerClassesShouldHaveControllerInName = classes() + .that().areAnnotatedWith(Controller.class) + .or().areAnnotatedWith(RestController.class) + .should().haveSimpleNameEndingWith("Controller"); + + @ArchTest + public static final ArchRule controllerClassesShouldBeInControllerPackage = classes() + .that().areAnnotatedWith(Controller.class) + .or().areAnnotatedWith(RestController.class) + .should().resideInAPackage("..controller.."); + + @ArchTest + public static final ArchRule noClassesWithControllerOrRestControllerAnnotationShouldResideOutsideOfControllerPackage = noClasses() + .that().areAnnotatedWith(Controller.class) + .or().areAnnotatedWith(RestController.class) + .should().resideOutsideOfPackage("..controller.."); + + @ArchTest + public static final ArchRule controllerClassesShouldHaveRequestMappingAnnotation = classes() + .that().resideInAPackage("..controller..") + .and().haveSimpleNameEndingWith("Controller") + .and().areAnnotatedWith(Controller.class) + .or().areAnnotatedWith(RestController.class) + .should().beAnnotatedWith(RequestMapping.class); + + @ArchTest + public static final ArchRule controllerClassesShouldNotDependOnEachOther = noClasses() + .that().haveSimpleNameEndingWith("Controller") + .should().dependOnClassesThat().haveNameMatching("Controller"); + + @ArchTest + public static final ArchRule serviceClassesShouldHaveServiceInName = classes() + .that().areAnnotatedWith(Service.class) + .should().haveSimpleNameEndingWith("Service"); + + @ArchTest + public static final ArchRule serviceClassesShouldBeAnnotatedWithService = classes() + .that().haveSimpleNameEndingWith("Service") + .should().beAnnotatedWith(Service.class); + + @ArchTest + public static final ArchRule serviceClassesShouldBeInServicePackage = classes() + .that().areAnnotatedWith(Service.class) + .should().resideInAPackage("..service.."); + + @ArchTest + public static final ArchRule serviceClassesShouldOnlyBeAccessedByControllerOrServiceClasses = classes() + .that().resideInAPackage("..service..") + .should().onlyBeAccessed().byAnyPackage("..controller..", "..service.."); + + @ArchTest + public static final ArchRule domainClassesShouldNotAccessOtherClasses = noClasses() + .that().resideInAPackage("..domain..") + .should().accessClassesThat().resideInAnyPackage("..controller..", "..repository..", "..security..", "..service.."); + + @ArchTest + public static final ArchRule repositoryClassesThatImplementCrudRepositoryShouldBeNamedRepository = classes() + .that().implement(CrudRepository.class) + .should().haveSimpleNameEndingWith("Repository"); + + @ArchTest + public static final ArchRule repositoryClassesShouldBeInRepositoryPackage = classes() + .that().haveSimpleNameEndingWith("Repository") + .should().resideInAPackage("..repository.."); + +} From 8e41d114a58478f3f4a1b0d61083552d2da8fdb8 Mon Sep 17 00:00:00 2001 From: Christoph <46786696+ChUrl@users.noreply.github.com> Date: Mon, 9 Mar 2020 16:54:58 +0100 Subject: [PATCH 2/2] Update and rename SwaggerAPIControllerExample.java to SwaggerAPIController.java --- ...aggerAPIControllerExample.java => SwaggerAPIController.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/mops/gruppen2/controller/{SwaggerAPIControllerExample.java => SwaggerAPIController.java} (96%) diff --git a/src/main/java/mops/gruppen2/controller/SwaggerAPIControllerExample.java b/src/main/java/mops/gruppen2/controller/SwaggerAPIController.java similarity index 96% rename from src/main/java/mops/gruppen2/controller/SwaggerAPIControllerExample.java rename to src/main/java/mops/gruppen2/controller/SwaggerAPIController.java index b186b9e..a0b2253 100644 --- a/src/main/java/mops/gruppen2/controller/SwaggerAPIControllerExample.java +++ b/src/main/java/mops/gruppen2/controller/SwaggerAPIController.java @@ -15,7 +15,7 @@ import java.util.List; */ @RestController @RequestMapping("/products") -public class SwaggerAPIControllerExample { +public class SwaggerAPIController { private final Faker faker = new Faker(); private final List products = new ArrayList<>();