package mops.gruppen2.architecture;

import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.library.Architectures;

@AnalyzeClasses(packages = "mops.gruppen2", importOptions = ImportOption.DoNotIncludeTests.class)
public class LayeredArchitectureTest {

    private static final Architectures.LayeredArchitecture layeredArchitecture = Architectures
            .layeredArchitecture()
            .layer("Domain").definedBy("..domain..")
            .layer("Service").definedBy("..service")
            .layer("Controller").definedBy("..controller..")
            .layer("Repository").definedBy("..repository..")
            .layer("Config").definedBy("..config..");

    @ArchTest
    public static final ArchRule domainLayerShouldOnlyBeAccessedByServiceAndControllerLayer = layeredArchitecture
            .whereLayer("Domain")
            .mayOnlyBeAccessedByLayers("Service", "Controller", "Config");

    @ArchTest
    public static final ArchRule serviceLayerShouldOnlyBeAccessedByControllerLayer = layeredArchitecture
            .whereLayer("Service")
            .mayOnlyBeAccessedByLayers("Controller", "Config");

    @ArchTest
    public static final ArchRule repositoryLayerShouldOnlyBeAccessedByServiceLayer = layeredArchitecture
            .whereLayer("Repository")
            .mayOnlyBeAccessedByLayers("Service");

    @ArchTest
    public static final ArchRule controllerLayerShouldNotBeAccessedByAnyLayer = layeredArchitecture
            .whereLayer("Controller")
            .mayNotBeAccessedByAnyLayer();

}
