added architecture tests

This commit is contained in:
Peter Straßer
2021-04-19 22:29:17 +02:00
parent 3ff3a0cde4
commit 498be70a19
60 changed files with 292 additions and 160 deletions

View File

@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

View File

@@ -1,8 +1,8 @@
package de.strasser.peter.hexagonal.addressvalidation;
import de.strasser.peter.hexagonal.application.customer.domain.Address;
import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
import de.strasser.peter.hexagonal.application.domain.Address;
import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
import de.strasser.peter.hexagonal.common.Adapter;
import lombok.extern.slf4j.Slf4j;

View File

@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.addressvalidation;
import de.strasser.peter.hexagonal.application.customer.exception.BusinessException;
import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
import de.strasser.peter.hexagonal.application.exception.BusinessException;
import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
public class InvalidAddressExc extends BusinessException {
public InvalidAddressExc(ValidateAddressCommand validateAddressCommand) {

View File

@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

View File

@@ -1,9 +1,9 @@
package de.strasser.peter.hexagonal.persistence;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.customer.port.in.QueryAllCustomersCRUD;
import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.application.port.in.QueryAllCustomersCRUD;
import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.persistence.errors.CustomerDoesNotExistExc;
import de.strasser.peter.hexagonal.persistence.mapper.CustomerMapper;
import de.strasser.peter.hexagonal.persistence.model.CustomerEntity;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.persistence.errors;
import de.strasser.peter.hexagonal.application.customer.exception.BusinessException;
import de.strasser.peter.hexagonal.application.exception.BusinessException;
import java.math.BigInteger;

View File

@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.persistence.mapper;
import de.strasser.peter.hexagonal.application.customer.domain.Address;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.domain.Address;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.persistence.model.CustomerEntity;
import org.mapstruct.Mapper;
import org.springframework.core.convert.converter.Converter;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.persistence;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.persistence.mapper.CustomerMapperImpl;
import de.strasser.peter.hexagonal.persistence.repository.CustomerRepository;
import org.junit.jupiter.api.AfterEach;

8
adapter/web/mvnw vendored
View File

@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

View File

@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.web;
import de.strasser.peter.hexagonal.application.customer.port.in.AddAddressUseCase;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.port.in.AddAddressUseCase;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.common.Adapter;
import de.strasser.peter.hexagonal.web.dto.request.AddAddressRequest;
import de.strasser.peter.hexagonal.web.mapper.AddAddressWebMapper;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web;
import de.strasser.peter.hexagonal.application.customer.port.in.QueryAllCustomersCRUD;
import de.strasser.peter.hexagonal.application.port.in.QueryAllCustomersCRUD;
import de.strasser.peter.hexagonal.common.Adapter;
import de.strasser.peter.hexagonal.web.dto.response.CustomerResponse;
import de.strasser.peter.hexagonal.web.mapper.CustomerWebMapper;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web;
import de.strasser.peter.hexagonal.application.customer.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.application.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.common.Adapter;
import de.strasser.peter.hexagonal.web.dto.request.RegisterCustomerRequest;
import de.strasser.peter.hexagonal.web.mapper.RegisterCustomerWebMapper;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.errors;
import de.strasser.peter.hexagonal.application.customer.exception.BusinessException;
import de.strasser.peter.hexagonal.application.exception.BusinessException;
import lombok.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.mapper;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.web.dto.request.AddAddressRequest;
import org.mapstruct.Mapper;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.mapper;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.web.dto.response.CustomerResponse;
import org.mapstruct.Mapper;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.web.mapper;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.web.dto.request.RegisterCustomerRequest;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

View File

@@ -1,8 +1,8 @@
package de.strasser.peter.hexagonal.web;
import de.strasser.peter.hexagonal.application.customer.port.in.AddAddressUseCase;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.common.validators.ReadStringResources;
import de.strasser.peter.hexagonal.application.port.in.AddAddressUseCase;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.common.ReadStringResources;
import de.strasser.peter.hexagonal.web.mapper.AddAddressWebMapperImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

View File

@@ -1,8 +1,8 @@
package de.strasser.peter.hexagonal.web;
import de.strasser.peter.hexagonal.application.customer.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.common.validators.ReadStringResources;
import de.strasser.peter.hexagonal.application.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.common.ReadStringResources;
import de.strasser.peter.hexagonal.web.mapper.RegisterCustomerWebMapperImpl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

8
application/mvnw vendored
View File

@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

View File

@@ -51,6 +51,10 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
</dependency>
</dependencies>
<build>

View File

@@ -1,10 +0,0 @@
package de.strasser.peter.hexagonal.application.customer.mapper;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
import org.mapstruct.Mapper;
@Mapper
public interface AddAddressMapper {
ValidateAddressCommand toOutCmd(AddAddressCommand addAddressCommand);
}

View File

@@ -1,9 +0,0 @@
package de.strasser.peter.hexagonal.application.customer.port.in;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import java.util.List;
public interface QueryAllCustomersCRUD {
List<Customer> getAll();
}

View File

@@ -1,9 +0,0 @@
package de.strasser.peter.hexagonal.application.customer.port.in;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
import javax.validation.Valid;
public interface RegisterCustomerUseCase {
void register(@Valid RegisterCustomerCommand registerCustomerCommand);
}

View File

@@ -1,8 +0,0 @@
package de.strasser.peter.hexagonal.application.customer.port.out;
import de.strasser.peter.hexagonal.application.customer.domain.Address;
import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
public interface AddressValidatorPort {
Address validate(ValidateAddressCommand validateAddressCommand);
}

View File

@@ -1,9 +0,0 @@
package de.strasser.peter.hexagonal.application.customer.port.out;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import java.math.BigInteger;
public interface LoadCustomerPort {
Customer findById(BigInteger id);
}

View File

@@ -1,7 +0,0 @@
package de.strasser.peter.hexagonal.application.customer.port.out;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
public interface SaveCustomerPort {
void upsert(Customer customer);
}

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.application.customer.domain;
package de.strasser.peter.hexagonal.application.domain;
import de.strasser.peter.hexagonal.application.customer.exception.AddressTypeDoesNotExistsExc;
import de.strasser.peter.hexagonal.application.exception.AddressTypeDoesNotExistsExc;
import lombok.Value;
@Value

View File

@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.application.customer.domain;
package de.strasser.peter.hexagonal.application.domain;
import de.strasser.peter.hexagonal.application.customer.exception.TooOldToDeactivateExc;
import de.strasser.peter.hexagonal.application.customer.exception.TooYoungExc;
import de.strasser.peter.hexagonal.application.exception.TooOldToDeactivateExc;
import de.strasser.peter.hexagonal.application.exception.TooYoungExc;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.exception;
package de.strasser.peter.hexagonal.application.exception;
public class AddressTypeDoesNotExistsExc extends BusinessException {
public AddressTypeDoesNotExistsExc(String type) {

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.exception;
package de.strasser.peter.hexagonal.application.exception;
public abstract class BusinessException extends IllegalStateException {
public BusinessException(String error) {

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.exception;
package de.strasser.peter.hexagonal.application.exception;
public class DefaultAdressRequiredToActivateExc extends BusinessException {

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.exception;
package de.strasser.peter.hexagonal.application.exception;
public class TooOldToDeactivateExc extends BusinessException {
public TooOldToDeactivateExc(int age) {

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.exception;
package de.strasser.peter.hexagonal.application.exception;
import java.text.MessageFormat;

View File

@@ -0,0 +1,10 @@
package de.strasser.peter.hexagonal.application.mapper;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
import org.mapstruct.Mapper;
@Mapper
public interface AddAddressMapper {
ValidateAddressCommand toOutCmd(AddAddressCommand addAddressCommand);
}

View File

@@ -0,0 +1,8 @@
package de.strasser.peter.hexagonal.application.mapper;
import lombok.Value;
@Value
public class Test {
private String test;
}

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.application.customer.port.in;
package de.strasser.peter.hexagonal.application.port.in;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import javax.validation.Valid;
import javax.validation.constraints.Min;

View File

@@ -0,0 +1,9 @@
package de.strasser.peter.hexagonal.application.port.in;
import de.strasser.peter.hexagonal.application.domain.Customer;
import java.util.List;
public interface QueryAllCustomersCRUD {
List<Customer> getAll();
}

View File

@@ -0,0 +1,9 @@
package de.strasser.peter.hexagonal.application.port.in;
import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
import javax.validation.Valid;
public interface RegisterCustomerUseCase {
void register(@Valid RegisterCustomerCommand registerCustomerCommand);
}

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.port.in.commands;
package de.strasser.peter.hexagonal.application.port.in.commands;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.application.customer.port.in.commands;
package de.strasser.peter.hexagonal.application.port.in.commands;
import de.strasser.peter.hexagonal.application.customer.validator.SecurePassword;
import de.strasser.peter.hexagonal.application.validator.SecurePassword;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@@ -0,0 +1,8 @@
package de.strasser.peter.hexagonal.application.port.out;
import de.strasser.peter.hexagonal.application.domain.Address;
import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
public interface AddressValidatorPort {
Address validate(ValidateAddressCommand validateAddressCommand);
}

View File

@@ -0,0 +1,9 @@
package de.strasser.peter.hexagonal.application.port.out;
import de.strasser.peter.hexagonal.application.domain.Customer;
import java.math.BigInteger;
public interface LoadCustomerPort {
Customer findById(BigInteger id);
}

View File

@@ -0,0 +1,7 @@
package de.strasser.peter.hexagonal.application.port.out;
import de.strasser.peter.hexagonal.application.domain.Customer;
public interface SaveCustomerPort {
void upsert(Customer customer);
}

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.port.out.commands;
package de.strasser.peter.hexagonal.application.port.out.commands;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@@ -1,16 +1,18 @@
package de.strasser.peter.hexagonal.application.customer.service;
package de.strasser.peter.hexagonal.application.service;
import de.strasser.peter.hexagonal.application.customer.domain.Address;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.customer.mapper.AddAddressMapper;
import de.strasser.peter.hexagonal.application.customer.port.in.AddAddressUseCase;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.application.domain.Address;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.application.mapper.AddAddressMapper;
import de.strasser.peter.hexagonal.application.mapper.Test;
import de.strasser.peter.hexagonal.application.port.in.AddAddressUseCase;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.common.UseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
@@ -19,7 +21,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@UseCase
@Transactional
@RequiredArgsConstructor
class AddressService implements AddAddressUseCase {
private final SaveCustomerPort saveCustomerAdapter;
@@ -36,7 +39,7 @@ class AddressService implements AddAddressUseCase {
addAddressCmds.forEach(addAddressCommand -> validateAndAddToMap(addresses, addAddressCommand));
customer.addAddresses(addresses);
new Test("he");
saveCustomerAdapter.upsert(customer);
}

View File

@@ -1,19 +1,19 @@
package de.strasser.peter.hexagonal.application.customer.service;
package de.strasser.peter.hexagonal.application.service;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.customer.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.application.port.in.RegisterCustomerUseCase;
import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.common.UseCase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.transaction.Transactional;
import javax.validation.Valid;
@Slf4j
@Service
@UseCase
@Validated
@Transactional
@RequiredArgsConstructor
class RegisterCustomerService implements RegisterCustomerUseCase {
private final SaveCustomerPort saveUser;

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.application.customer.validator;
package de.strasser.peter.hexagonal.application.validator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

View File

@@ -1,6 +1,6 @@
package de.strasser.peter.hexagonal.application;
import de.strasser.peter.hexagonal.application.customer.mapper.AddAddressMapper;
import de.strasser.peter.hexagonal.application.mapper.AddAddressMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.mock.mockito.SpyBean;

View File

@@ -1,7 +1,7 @@
package de.strasser.peter.hexagonal.application.customer.domain;
package de.strasser.peter.hexagonal.application.domain;
import de.strasser.peter.hexagonal.application.customer.exception.TooOldToDeactivateExc;
import de.strasser.peter.hexagonal.application.customer.exception.TooYoungExc;
import de.strasser.peter.hexagonal.application.exception.TooOldToDeactivateExc;
import de.strasser.peter.hexagonal.application.exception.TooYoungExc;
import org.junit.jupiter.api.Test;
import java.time.LocalDate;

View File

@@ -1,12 +1,12 @@
package de.strasser.peter.hexagonal.application.customer.service;
package de.strasser.peter.hexagonal.application.service;
import de.strasser.peter.hexagonal.application.customer.domain.Address;
import de.strasser.peter.hexagonal.application.customer.domain.Customer;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.application.customer.port.out.commands.ValidateAddressCommand;
import de.strasser.peter.hexagonal.application.domain.Address;
import de.strasser.peter.hexagonal.application.domain.Customer;
import de.strasser.peter.hexagonal.application.port.in.commands.AddAddressCommand;
import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.application.port.out.commands.ValidateAddressCommand;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

View File

@@ -1,9 +1,9 @@
package de.strasser.peter.hexagonal.application.customer.service;
package de.strasser.peter.hexagonal.application.service;
import de.strasser.peter.hexagonal.application.customer.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.application.customer.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.customer.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.customer.port.out.SaveCustomerPort;
import de.strasser.peter.hexagonal.application.port.in.commands.RegisterCustomerCommand;
import de.strasser.peter.hexagonal.application.port.out.AddressValidatorPort;
import de.strasser.peter.hexagonal.application.port.out.LoadCustomerPort;
import de.strasser.peter.hexagonal.application.port.out.SaveCustomerPort;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

8
config/mvnw vendored
View File

@@ -316,7 +316,7 @@ export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

View File

@@ -48,7 +48,11 @@
<groupId>de.strasser.peter.hexagonal</groupId>
<artifactId>persistence</artifactId>
</dependency>
<dependency>
<groupId>com.tngtech.archunit</groupId>
<artifactId>archunit-junit5</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -0,0 +1,20 @@
package de.strasser.peter.hexagonal;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
@AnalyzeClasses(packages = "de.strasser.peter.hexagonal")
public class DomainArchitectureTest {
@ArchTest
static final ArchRule should_OnlyDependOnLombokAndExceptions =
classes()
.that()
.resideInAPackage("..domain..")
.should()
.onlyDependOnClassesThat()
.resideInAnyPackage("..lombok..", "..domain..", "java..", "..exception..");
}

View File

@@ -1,4 +1,4 @@
package de.strasser.peter.hexagonal.config;
package de.strasser.peter.hexagonal;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

View File

@@ -0,0 +1,25 @@
package de.strasser.peter.hexagonal;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.library.Architectures.onionArchitecture;
@AnalyzeClasses(packages = "de.strasser.peter.hexagonal")
public class HexagonalArchitectureTest {
/**
* See diagram at https://www.archunit.org/userguide/html/000_Index.html#Onion%20Architecture for
* what rules this enforces.
*/
@ArchTest
static final ArchRule should_FollowHexagonalRules =
onionArchitecture()
.domainModels("de.strasser.peter.hexagonal.application.domain..")
.domainServices("de.strasser.peter.hexagonal.application.service..")
.applicationServices("de.strasser.peter.hexagonal..")
.adapter("web", "de.strasser.peter.hexagonal.web..")
.adapter("persistence", "de.strasser.peter.hexagonal.persistence..")
.adapter("addressvalidation", "de.strasser.peter.hexagonal.addressvalidation..");
}

View File

@@ -0,0 +1,29 @@
package de.strasser.peter.hexagonal;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
@AnalyzeClasses(packages = "de.strasser.peter.hexagonal.application.port")
public class PortsArchitectureTest {
@ArchTest
static final ArchRule should_EndWithUseCaseOrCRUD_When_IsInPort =
classes()
.that()
.resideInAPackage("..in")
.should()
.haveSimpleNameEndingWith("UseCase")
.orShould()
.haveSimpleNameEndingWith("CRUD");
@ArchTest
static final ArchRule should_EndWithPort_When_IsOutPort =
classes().that().resideInAPackage("..out").should().haveSimpleNameEndingWith("Port");
@ArchTest
static final ArchRule should_EndWithCommand_When_IsCommandModel =
classes().that().resideInAPackage("..commands").should().haveSimpleNameEndingWith("Command");
}

View File

@@ -0,0 +1,42 @@
package de.strasser.peter.hexagonal;
import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import de.strasser.peter.hexagonal.common.UseCase;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
@AnalyzeClasses(packages = "de.strasser.peter.hexagonal")
public class UseCaseArchitectureTest {
static final DescribedPredicate<JavaClass> portInterface =
JavaClass.Predicates.simpleNameEndingWith("UseCase");
@ArchTest
static final ArchRule should_BePackageVisibility_When_IsUsecase =
classes().that().areAnnotatedWith(UseCase.class).should().bePackagePrivate();
@ArchTest
static final ArchRule should_BeInPackageService_When_IsUsecase =
classes().that().areAnnotatedWith(UseCase.class).should().resideInAPackage("..service..");
@ArchTest
static final ArchRule should_ImplementOnlyPorts_When_IsUsecase =
classes().that().areAnnotatedWith(UseCase.class).should().implement(portInterface);
@ArchTest
static final ArchRule should_NotDependOnAdapters_When_IsUsecase =
noClasses()
.that()
.areAnnotatedWith(UseCase.class)
.should()
.dependOnClassesThat()
.resideInAPackage("..persistence..")
.orShould()
.dependOnClassesThat()
.resideInAPackage("..web..");
}

View File

@@ -1,3 +0,0 @@
package de.strasser.peter.hexagonal.config;
public class ArchitectureTest {}

View File

@@ -81,7 +81,7 @@
<dependency>
<groupId>com.tngtech.archunit</groupId>
<artifactId>archunit</artifactId>
<artifactId>archunit-junit5</artifactId>
<version>${archunit.version}</version>
<scope>test</scope>
</dependency>