package com.tngtech.archunit.integration;
import com.tngtech.archunit.example.SomeMediator;
import com.tngtech.archunit.example.controller.one.UseCaseOneController;
import com.tngtech.archunit.example.controller.two.UseCaseTwoController;
import com.tngtech.archunit.example.persistence.layerviolation.DaoCallingService;
import com.tngtech.archunit.example.service.ServiceViolatingLayerRules;
import com.tngtech.archunit.exampletest.LayerDependencyRulesTest;
import com.tngtech.archunit.junit.ExpectedViolation;
import org.junit.Rule;
import org.junit.Test;
import static com.tngtech.archunit.example.SomeMediator.violateLayerRulesIndirectly;
import static com.tngtech.archunit.example.controller.one.UseCaseOneController.someString;
import static com.tngtech.archunit.example.controller.two.UseCaseTwoController.doSomethingTwo;
import static com.tngtech.archunit.example.persistence.layerviolation.DaoCallingService.violateLayerRules;
import static com.tngtech.archunit.example.service.ServiceViolatingLayerRules.illegalAccessToController;
import static com.tngtech.archunit.junit.ExpectedViolation.from;
public class LayerDependencyRulesIntegrationTest extends LayerDependencyRulesTest {
@Rule
public final ExpectedViolation expectViolation = ExpectedViolation.none();
@Test
@Override
public void services_should_not_access_controllers() {
expectViolationByAccessFromServiceToController(expectViolation);
super.services_should_not_access_controllers();
}
static void expectViolationByAccessFromServiceToController(ExpectedViolation expectViolation) {
expectViolation.ofRule("no classes that reside in a package '..service..' " +
"should access classes that reside in a package '..controller..'")
.byAccess(from(ServiceViolatingLayerRules.class, illegalAccessToController)
.getting().field(UseCaseOneController.class, someString)
.inLine(11))
.byCall(from(ServiceViolatingLayerRules.class, illegalAccessToController)
.toConstructor(UseCaseTwoController.class)
.inLine(12))
.byCall(from(ServiceViolatingLayerRules.class, illegalAccessToController)
.toMethod(UseCaseTwoController.class, doSomethingTwo)
.inLine(13));
}
@Test
@Override
public void persistence_should_not_access_services() {
expectViolationByAccessFromPersistenceToService(expectViolation);
super.persistence_should_not_access_services();
}
static void expectViolationByAccessFromPersistenceToService(ExpectedViolation expectViolation) {
expectViolation.ofRule("no classes that reside in a package '..persistence..' should " +
"access classes that reside in a package '..service..'")
.byCall(from(DaoCallingService.class, violateLayerRules)
.toMethod(ServiceViolatingLayerRules.class, ServiceViolatingLayerRules.doSomething)
.inLine(13));
}
@Test
@Override
public void services_should_only_be_accessed_by_controllers_or_other_services() {
expectViolationByIllegalAccessToService(expectViolation);
super.services_should_only_be_accessed_by_controllers_or_other_services();
}
static void expectViolationByIllegalAccessToService(ExpectedViolation expectViolation) {
expectViolation.ofRule("classes that reside in a package '..service..' should " +
"only be accessed by any package ['..controller..', '..service..']")
.byCall(from(DaoCallingService.class, violateLayerRules)
.toMethod(ServiceViolatingLayerRules.class, ServiceViolatingLayerRules.doSomething)
.inLine(13))
.byCall(from(SomeMediator.class, violateLayerRulesIndirectly)
.toMethod(ServiceViolatingLayerRules.class, ServiceViolatingLayerRules.doSomething)
.inLine(15));
}
}