cashpal -> buckpal

This commit is contained in:
Tom Hombergs
2019-08-19 06:33:45 +02:00
parent eab6af3485
commit 54cceee179
53 changed files with 249 additions and 145 deletions

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;

View File

@@ -1,14 +1,14 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import java.util.ArrayList;
import java.util.List;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Activity;
import io.reflectoring.cashpal.domain.Activity.ActivityId;
import io.reflectoring.cashpal.domain.ActivityWindow;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import io.reflectoring.buckpal.domain.Activity.ActivityId;
import io.reflectoring.buckpal.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money;
import org.springframework.stereotype.Component;
@Component

View File

@@ -1,16 +1,16 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import javax.persistence.EntityNotFoundException;
import java.time.LocalDateTime;
import java.util.List;
import io.reflectoring.cashpal.application.port.out.LoadAccountPort;
import io.reflectoring.cashpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.cashpal.testdata.PersistenceAdapter;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Activity;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.testdata.PersistenceAdapter;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import javax.persistence.Column;
import javax.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import java.time.LocalDateTime;
import java.util.List;

View File

@@ -1,18 +1,18 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import java.time.LocalDateTime;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.ActivityWindow;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.jdbc.Sql;
import static io.reflectoring.cashpal.testdata.AccountTestData.*;
import static io.reflectoring.cashpal.testdata.ActivityTestData.*;
import static io.reflectoring.buckpal.testdata.AccountTestData.*;
import static io.reflectoring.buckpal.testdata.ActivityTestData.*;
import static org.assertj.core.api.Assertions.*;
@DataJpaTest

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.adapter.persistence;
package io.reflectoring.buckpal.adapter.persistence;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

View File

@@ -1,6 +1,6 @@
dependencies {
implementation project(':common')
implementation project(':cashpal-application')
implementation project(':buckpal-application')
implementation 'org.springframework.boot:spring-boot-starter-web'

View File

@@ -0,0 +1,4 @@
package io.reflectoring.buckpal.adapter.web;
class AccountResource {
}

View File

@@ -1,9 +1,9 @@
package io.reflectoring.cashpal.adapter.web;
package io.reflectoring.buckpal.adapter.web;
import io.reflectoring.cashpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.cashpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,7 +1,7 @@
package io.reflectoring.cashpal.adapter.web;
package io.reflectoring.buckpal.adapter.web;
import io.reflectoring.cashpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.cashpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.adapter.web;
package io.reflectoring.buckpal.adapter.web;
import org.springframework.boot.autoconfigure.SpringBootApplication;

View File

@@ -1,4 +0,0 @@
package io.reflectoring.cashpal.adapter.web;
class AccountResource {
}

View File

@@ -17,7 +17,7 @@ dependencies {
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
testImplementation 'de.adesso:junit-insights:1.1.0'
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
testImplementation project(':cashpal-testdata')
testImplementation project(':buckpal-testdata')
}
test {

View File

@@ -0,0 +1,10 @@
package io.reflectoring.buckpal.application.port.in;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
public interface GetAccountBalanceQuery {
Money getAccountBalance(AccountId accountId);
}

View File

@@ -1,10 +1,10 @@
package io.reflectoring.cashpal.application.port.in;
package io.reflectoring.buckpal.application.port.in;
import javax.validation.constraints.NotNull;
import io.reflectoring.cashpal.testdata.SelfValidating;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.testdata.SelfValidating;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Money;
import lombok.EqualsAndHashCode;
import lombok.Value;

View File

@@ -1,6 +1,6 @@
package io.reflectoring.cashpal.application.port.out;
package io.reflectoring.buckpal.application.port.out;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.buckpal.domain.Account;
public interface AccountLock {

View File

@@ -0,0 +1,11 @@
package io.reflectoring.buckpal.application.port.out;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
public interface LoadAccountPort {
Account loadAccount(AccountId accountId, LocalDateTime baselineDate);
}

View File

@@ -0,0 +1,9 @@
package io.reflectoring.buckpal.application.port.out;
import io.reflectoring.buckpal.domain.Account;
public interface UpdateAccountStatePort {
void updateActivities(Account account);
}

View File

@@ -1,11 +1,11 @@
package io.reflectoring.cashpal.application.service;
package io.reflectoring.buckpal.application.service;
import java.time.LocalDateTime;
import io.reflectoring.cashpal.application.port.in.GetAccountBalanceQuery;
import io.reflectoring.cashpal.application.port.out.LoadAccountPort;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.application.port.in.GetAccountBalanceQuery;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor

View File

@@ -1,7 +1,7 @@
package io.reflectoring.cashpal.application.service;
package io.reflectoring.buckpal.application.service;
import io.reflectoring.cashpal.application.port.out.AccountLock;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.buckpal.application.port.out.AccountLock;
import io.reflectoring.buckpal.domain.Account.AccountId;
import org.springframework.stereotype.Component;
@Component

View File

@@ -1,15 +1,15 @@
package io.reflectoring.cashpal.application.service;
package io.reflectoring.buckpal.application.service;
import javax.transaction.Transactional;
import java.time.LocalDateTime;
import io.reflectoring.cashpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.cashpal.application.port.out.AccountLock;
import io.reflectoring.cashpal.application.port.out.LoadAccountPort;
import io.reflectoring.cashpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.testdata.UseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.out.AccountLock;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.testdata.UseCase;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.domain;
package io.reflectoring.buckpal.domain;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.domain;
package io.reflectoring.buckpal.domain;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.domain;
package io.reflectoring.buckpal.domain;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -6,7 +6,7 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Account.AccountId;
import lombok.NonNull;
/**

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.domain;
package io.reflectoring.buckpal.domain;
import java.math.BigInteger;

View File

@@ -1,16 +1,16 @@
package io.reflectoring.cashpal.application.service;
package io.reflectoring.buckpal.application.service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import io.reflectoring.cashpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.cashpal.application.port.out.AccountLock;
import io.reflectoring.cashpal.application.port.out.LoadAccountPort;
import io.reflectoring.cashpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.buckpal.application.port.out.AccountLock;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;

View File

@@ -1,9 +1,9 @@
package io.reflectoring.cashpal.domain;
package io.reflectoring.buckpal.domain;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Account.AccountId;
import org.junit.jupiter.api.Test;
import static io.reflectoring.cashpal.testdata.AccountTestData.*;
import static io.reflectoring.cashpal.testdata.ActivityTestData.*;
import static io.reflectoring.buckpal.testdata.AccountTestData.*;
import static io.reflectoring.buckpal.testdata.ActivityTestData.*;
import static org.assertj.core.api.Assertions.*;
class AccountTest {

View File

@@ -1,11 +1,11 @@
package io.reflectoring.cashpal.domain;
package io.reflectoring.buckpal.domain;
import java.time.LocalDateTime;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Account.AccountId;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import static io.reflectoring.cashpal.testdata.ActivityTestData.*;
import static io.reflectoring.buckpal.testdata.ActivityTestData.*;
class ActivityWindowTest {

View File

@@ -5,9 +5,9 @@ plugins {
dependencies {
implementation project(':common')
implementation project(':cashpal-application')
implementation project(':adapters:cashpal-persistence')
implementation project(':adapters:cashpal-web')
implementation project(':buckpal-application')
implementation project(':adapters:buckpal-persistence')
implementation project(':adapters:buckpal-web')
implementation ('org.springframework.boot:spring-boot-starter-web')
testImplementation('org.springframework.boot:spring-boot-starter-test') {

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal;
package io.reflectoring.buckpal;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal;
package io.reflectoring.buckpal;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

View File

@@ -1,7 +1,7 @@
package io.reflectoring.cashpal;
package io.reflectoring.buckpal;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import io.reflectoring.cashpal.archunit.HexagonalArchitecture;
import io.reflectoring.buckpal.archunit.HexagonalArchitecture;
import org.junit.jupiter.api.Test;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.*;
@@ -9,7 +9,7 @@ class DependencyRuleTests {
@Test
void validateRegistrationContextArchitecture() {
HexagonalArchitecture.boundedContext("io.reflectoring.cashpal")
HexagonalArchitecture.boundedContext("io.reflectoring.buckpal")
.withDomainLayer("domain")
@@ -26,7 +26,7 @@ class DependencyRuleTests {
.withConfiguration("configuration")
.check(new ClassFileImporter()
.importPackages("io.reflectoring.cashpal.."));
.importPackages("io.reflectoring.buckpal.."));
}
@Test

View File

@@ -0,0 +1,104 @@
package io.reflectoring.buckpal;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.jdbc.Sql;
import static org.assertj.core.api.BDDAssertions.*;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SendMoneySystemTest {
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private LoadAccountPort loadAccountPort;
@Test
@Sql("SendMoneySystemTest.sql")
void sendMoney() {
Money initialSourceBalance = sourceAccount().calculateBalance();
Money initialTargetBalance = targetAccount().calculateBalance();
ResponseEntity response = whenSendMoney(
sourceAccountId(),
targetAccountId(),
transferredAmount());
then(response.getStatusCode())
.isEqualTo(HttpStatus.OK);
then(sourceAccount().calculateBalance())
.isEqualTo(initialSourceBalance.minus(transferredAmount()));
then(targetAccount().calculateBalance())
.isEqualTo(initialTargetBalance.plus(transferredAmount()));
}
private Account sourceAccount() {
return loadAccount(sourceAccountId());
}
private Account targetAccount() {
return loadAccount(targetAccountId());
}
private Account loadAccount(AccountId accountId) {
return loadAccountPort.loadAccount(
accountId,
LocalDateTime.now());
}
private ResponseEntity whenSendMoney(
AccountId sourceAccountId,
AccountId targetAccountId,
Money amount) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
HttpEntity<Void> request = new HttpEntity<>(null, headers);
return restTemplate.exchange(
"/accounts/sendMoney/{sourceAccountId}/{targetAccountId}/{amount}",
HttpMethod.POST,
request,
Object.class,
sourceAccountId.getValue(),
targetAccountId.getValue(),
amount.getAmount());
}
private Money transferredAmount() {
return Money.of(500L);
}
private Money balanceOf(AccountId accountId) {
Account account = loadAccountPort.loadAccount(accountId, LocalDateTime.now());
return account.calculateBalance();
}
private AccountId sourceAccountId() {
return new AccountId(1L);
}
private AccountId targetAccountId() {
return new AccountId(2L);
}
}

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.archunit;
package io.reflectoring.buckpal.archunit;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.archunit;
package io.reflectoring.buckpal.archunit;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.archunit;
package io.reflectoring.buckpal.archunit;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.archunit;
package io.reflectoring.buckpal.archunit;
import java.util.ArrayList;
import java.util.Collections;

View File

@@ -1,9 +1,9 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.ActivityWindow;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money;
public class AccountTestData {

View File

@@ -1,11 +1,11 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import java.time.LocalDateTime;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Activity;
import io.reflectoring.cashpal.domain.Activity.ActivityId;
import io.reflectoring.cashpal.domain.Money;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import io.reflectoring.buckpal.domain.Activity.ActivityId;
import io.reflectoring.buckpal.domain.Money;
public class ActivityTestData {

View File

@@ -1,10 +0,0 @@
package io.reflectoring.cashpal.application.port.in;
import io.reflectoring.cashpal.domain.Account.AccountId;
import io.reflectoring.cashpal.domain.Money;
public interface GetAccountBalanceQuery {
Money getAccountBalance(AccountId accountId);
}

View File

@@ -1,11 +0,0 @@
package io.reflectoring.cashpal.application.port.out;
import java.time.LocalDateTime;
import io.reflectoring.cashpal.domain.Account;
import io.reflectoring.cashpal.domain.Account.AccountId;
public interface LoadAccountPort {
Account loadAccount(AccountId accountId, LocalDateTime baselineDate);
}

View File

@@ -1,9 +0,0 @@
package io.reflectoring.cashpal.application.port.out;
import io.reflectoring.cashpal.domain.Account;
public interface UpdateAccountStatePort {
void updateActivities(Account account);
}

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.cashpal.testdata;
package io.reflectoring.buckpal.testdata;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

View File

@@ -1,7 +1,7 @@
include 'common'
include 'cashpal-configuration'
include 'buckpal-configuration'
include 'adapters:cashpal-web'
include 'adapters:cashpal-persistence'
include 'cashpal-application'
include 'cashpal-testdata'
include 'adapters:buckpal-web'
include 'adapters:buckpal-persistence'
include 'buckpal-application'
include 'buckpal-testdata'