Merge pull request #22 from dartpopikyardo/wip-customer
refactored the tests
This commit is contained in:
@@ -22,7 +22,13 @@ public class AccountWorkflow {
|
|||||||
|
|
||||||
String fromAccountId = event.getDetails().getFromAccountId();
|
String fromAccountId = event.getDetails().getFromAccountId();
|
||||||
|
|
||||||
return ctx.update(Account.class, fromAccountId, new DebitAccountCommand(amount, transactionId));
|
return ctx.update(Account.class, fromAccountId, new DebitAccountCommand(amount, transactionId)).handle((x, e) -> {
|
||||||
|
if (e != null) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandlerMethod
|
@EventHandlerMethod
|
||||||
@@ -32,7 +38,13 @@ public class AccountWorkflow {
|
|||||||
String fromAccountId = event.getDetails().getToAccountId();
|
String fromAccountId = event.getDetails().getToAccountId();
|
||||||
String transactionId = ctx.getEntityId();
|
String transactionId = ctx.getEntityId();
|
||||||
|
|
||||||
return ctx.update(Account.class, fromAccountId, new CreditAccountCommand(amount, transactionId));
|
return ctx.update(Account.class, fromAccountId, new CreditAccountCommand(amount, transactionId)).handle((x, e) -> {
|
||||||
|
if (e != null) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CreateAccountRequest;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.CreateAccountRequest;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CreateAccountResponse;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.CreateAccountResponse;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts;
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.AccountService;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.AccountService;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.CreateAccountRequest;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.CreateAccountResponse;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
||||||
|
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
||||||
|
|
||||||
import com.mongodb.WriteResult;
|
import com.mongodb.WriteResult;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||||
@@ -25,7 +26,6 @@ public class AccountInfoUpdateService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void create(String accountId, String customerId, String title, BigDecimal initialBalance, String description, String version) {
|
public void create(String accountId, String customerId, String title, BigDecimal initialBalance, String description, String version) {
|
||||||
try {
|
try {
|
||||||
accountInfoRepository.save(new AccountInfo(
|
accountInfoRepository.save(new AccountInfo(
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accoun
|
|||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts.AccountDebitedEvent;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts.AccountDebitedEvent;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts.AccountOpenedEvent;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts.AccountOpenedEvent;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.transactions.MoneyTransferCreatedEvent;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.transactions.MoneyTransferCreatedEvent;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.accounts.GetAccountResponse;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.GetAccountResponse;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.acc
|
|||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountNotFoundException;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountNotFoundException;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountQueryService;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountQueryService;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountTransactionInfo;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.GetAccountResponse;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.accounts;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
|
|
||||||
|
|
||||||
public class GetAccountResponse {
|
|
||||||
private String accountId;
|
|
||||||
private BigDecimal balance;
|
|
||||||
private String title;
|
|
||||||
private String description;
|
|
||||||
|
|
||||||
public GetAccountResponse() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GetAccountResponse(String accountId, BigDecimal balance, String title, String description) {
|
|
||||||
this.accountId = accountId;
|
|
||||||
this.balance = balance;
|
|
||||||
this.title = title;
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBalance(BigDecimal balance) {
|
|
||||||
this.balance = balance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAccountId(String accountId) {
|
|
||||||
this.accountId = accountId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAccountId() {
|
|
||||||
return accountId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BigDecimal getBalance() {
|
|
||||||
return balance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitle(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription(String description) {
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,9 +7,6 @@ dependencies {
|
|||||||
compile "org.apache.httpcomponents:httpclient:4.5"
|
compile "org.apache.httpcomponents:httpclient:4.5"
|
||||||
compile "org.apache.httpcomponents:fluent-hc:4.5.1"
|
compile "org.apache.httpcomponents:fluent-hc:4.5.1"
|
||||||
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-http-stomp-spring:$eventuateClientVersion"
|
|
||||||
|
|
||||||
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
||||||
compile "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.apigateway;
|
package net.chrisrichardson.eventstore.javaexamples.banking.apigateway;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import io.eventuate.javaclient.spring.httpstomp.EventuateHttpStompClientConfiguration;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.AuthConfiguration;
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.AuthConfiguration;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
import org.apache.http.impl.client.HttpClients;
|
import org.apache.http.impl.client.HttpClients;
|
||||||
@@ -27,7 +26,7 @@ import java.util.Collections;
|
|||||||
@Configuration
|
@Configuration
|
||||||
@ComponentScan
|
@ComponentScan
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
@Import({EventuateHttpStompClientConfiguration.class, AuthConfiguration.class})
|
@Import({AuthConfiguration.class})
|
||||||
@EnableConfigurationProperties({ApiGatewayProperties.class})
|
@EnableConfigurationProperties({ApiGatewayProperties.class})
|
||||||
public class ApiGatewayServiceConfiguration extends WebMvcConfigurerAdapter {
|
public class ApiGatewayServiceConfiguration extends WebMvcConfigurerAdapter {
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ import java.io.InputStreamReader;
|
|||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.springframework.web.bind.annotation.RequestMethod.*;
|
import static org.springframework.web.bind.annotation.RequestMethod.GET;
|
||||||
|
import static org.springframework.web.bind.annotation.RequestMethod.POST;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by popikyardo on 15.01.16.
|
* Created by popikyardo on 15.01.16.
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import java.util.Enumeration;
|
|||||||
*/
|
*/
|
||||||
public class HeadersRequestTransformer extends ProxyRequestTransformer {
|
public class HeadersRequestTransformer extends ProxyRequestTransformer {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RequestBuilder transform(HttpServletRequest request) throws NoSuchRequestHandlingMethodException, URISyntaxException, IOException {
|
public RequestBuilder transform(HttpServletRequest request) throws NoSuchRequestHandlingMethodException, URISyntaxException, IOException {
|
||||||
RequestBuilder requestBuilder = predecessor.transform(request);
|
RequestBuilder requestBuilder = predecessor.transform(request);
|
||||||
|
|||||||
@@ -18,5 +18,5 @@ public abstract class ProxyRequestTransformer {
|
|||||||
|
|
||||||
public void setPredecessor(ProxyRequestTransformer transformer) {
|
public void setPredecessor(ProxyRequestTransformer transformer) {
|
||||||
this.predecessor = transformer;
|
this.predecessor = transformer;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ dependencies {
|
|||||||
testCompile project(":accounts-query-side-backend")
|
testCompile project(":accounts-query-side-backend")
|
||||||
testCompile project(":customers-command-side-backend")
|
testCompile project(":customers-command-side-backend")
|
||||||
testCompile project(":customers-query-side-backend")
|
testCompile project(":customers-query-side-backend")
|
||||||
testCompile project(":testutil-customers")
|
testCompile project(":testutil")
|
||||||
testCompile "junit:junit:4.11"
|
testCompile "junit:junit:4.11"
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
||||||
testCompile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
testCompile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
||||||
|
|
||||||
import io.eventuate.EntityWithIdAndVersion;
|
import io.eventuate.EntityWithIdAndVersion;
|
||||||
import io.eventuate.EntityWithMetadata;
|
|
||||||
import io.eventuate.EventuateAggregateStore;
|
import io.eventuate.EventuateAggregateStore;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.Account;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.Account;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.AccountService;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.AccountService;
|
||||||
@@ -9,8 +8,6 @@ import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.t
|
|||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.MoneyTransferService;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.MoneyTransferService;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.TransferState;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.TransferState;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.transactions.TransferDetails;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.transactions.TransferDetails;
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Producer;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Verifier;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -18,7 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.boot.test.IntegrationTest;
|
import org.springframework.boot.test.IntegrationTest;
|
||||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
import rx.Observable;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateCustomerInfo;
|
||||||
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateToAccountInfo;
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.await;
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.await;
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateToAccountInfo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Main on 10.02.2016.
|
* Created by Main on 10.02.2016.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ apply plugin: 'java'
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":common-auth")
|
compile project(":common-auth")
|
||||||
compile project(":common-customers")
|
compile project(":common")
|
||||||
|
|
||||||
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
||||||
compile "org.springframework.boot:spring-boot-starter-security:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-security:$springBootVersion"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":common-customers")
|
compile project(":common")
|
||||||
|
|
||||||
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
||||||
compile "org.springframework.boot:spring-boot-starter-data-mongodb:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-data-mongodb:$springBootVersion"
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package net.chrisrichardson.eventstore.javaexamples.banking.commonauth;
|
|||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.QuerySideCustomer;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.QuerySideCustomer;
|
||||||
import org.springframework.dao.EmptyResultDataAccessException;
|
import org.springframework.dao.EmptyResultDataAccessException;
|
||||||
import org.springframework.dao.IncorrectResultSizeDataAccessException;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":common-customers")
|
compile project(":common")
|
||||||
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
||||||
|
|
||||||
import io.eventuate.Aggregate;
|
|
||||||
|
|
||||||
import io.eventuate.Event;
|
import io.eventuate.Event;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
||||||
|
|
||||||
import io.eventuate.Aggregate;
|
|
||||||
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class AccountCreditedEvent extends AccountChangedEvent {
|
public class AccountCreditedEvent extends AccountChangedEvent {
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
||||||
|
|
||||||
import io.eventuate.Aggregate;
|
|
||||||
|
|
||||||
import io.eventuate.Event;
|
import io.eventuate.Event;
|
||||||
|
|
||||||
public class AccountDebitFailedDueToInsufficientFundsEvent implements Event {
|
public class AccountDebitFailedDueToInsufficientFundsEvent implements Event {
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.backend.common.accounts;
|
||||||
|
|
||||||
import io.eventuate.Aggregate;
|
|
||||||
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class AccountDebitedEvent extends AccountChangedEvent {
|
public class AccountDebitedEvent extends AccountChangedEvent {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import org.junit.Assert;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class AccountOpenEventSerializationTest {
|
public class AccountOpenEventSerializationTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by popikyardo on 24.03.16.
|
|
||||||
*/
|
|
||||||
public class AddToAccountResponse {
|
|
||||||
|
|
||||||
private String version;
|
|
||||||
|
|
||||||
public AddToAccountResponse() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AddToAccountResponse(String version) {
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getVersion() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVersion(String version) {
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
|
||||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by popikyardo on 02.02.16.
|
|
||||||
*/
|
|
||||||
public class Address {
|
|
||||||
@NotNull
|
|
||||||
private String street1;
|
|
||||||
private String street2;
|
|
||||||
@NotNull
|
|
||||||
private String city;
|
|
||||||
@NotNull
|
|
||||||
private String state;
|
|
||||||
@NotNull
|
|
||||||
private String zipCode;
|
|
||||||
|
|
||||||
public Address() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public Address(String street1, String street2, String city, String state, String zipCode) {
|
|
||||||
this.street1 = street1;
|
|
||||||
this.street2 = street2;
|
|
||||||
this.city = city;
|
|
||||||
this.state = state;
|
|
||||||
this.zipCode = zipCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStreet1() {
|
|
||||||
return street1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStreet1(String street1) {
|
|
||||||
this.street1 = street1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStreet2() {
|
|
||||||
return street2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStreet2(String street2) {
|
|
||||||
this.street2 = street2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCity() {
|
|
||||||
return city;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCity(String city) {
|
|
||||||
this.city = city;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getState() {
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setState(String state) {
|
|
||||||
this.state = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getZipCode() {
|
|
||||||
return zipCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setZipCode(String zipCode) {
|
|
||||||
this.zipCode = zipCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return EqualsBuilder.reflectionEquals(this, o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return HashCodeBuilder.reflectionHashCode(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
|
||||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by popikyardo on 03.02.16.
|
|
||||||
*/
|
|
||||||
public class CustomerInfo {
|
|
||||||
private Name name;
|
|
||||||
@NotNull
|
|
||||||
protected String email;
|
|
||||||
@NotNull
|
|
||||||
protected String ssn;
|
|
||||||
@NotNull
|
|
||||||
protected String phoneNumber;
|
|
||||||
protected Address address;
|
|
||||||
|
|
||||||
public CustomerInfo() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomerInfo(Name name, String email, String ssn, String phoneNumber, Address address) {
|
|
||||||
this.name = name;
|
|
||||||
this.email = email;
|
|
||||||
this.ssn = ssn;
|
|
||||||
this.phoneNumber = phoneNumber;
|
|
||||||
this.address = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Name getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getEmail() {
|
|
||||||
return email;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSsn() {
|
|
||||||
return ssn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPhoneNumber() {
|
|
||||||
return phoneNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Address getAddress() {
|
|
||||||
return address;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return EqualsBuilder.reflectionEquals(this, o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return HashCodeBuilder.reflectionHashCode(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
|
||||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by popikyardo on 03.02.16.
|
|
||||||
*/
|
|
||||||
public class CustomerResponse {
|
|
||||||
|
|
||||||
private String id;
|
|
||||||
private CustomerInfo customerInfo;
|
|
||||||
|
|
||||||
public CustomerResponse() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomerResponse(String id, CustomerInfo customerInfo) {
|
|
||||||
this.id = id;
|
|
||||||
this.customerInfo = customerInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomerInfo getCustomerInfo() {
|
|
||||||
return customerInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCustomerInfo(CustomerInfo customerInfo) {
|
|
||||||
this.customerInfo = customerInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return EqualsBuilder.reflectionEquals(this, o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return HashCodeBuilder.reflectionHashCode(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
|
||||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Main on 10.02.2016.
|
|
||||||
*/
|
|
||||||
public class Name {
|
|
||||||
@NotNull
|
|
||||||
private String firstName;
|
|
||||||
@NotNull
|
|
||||||
private String lastName;
|
|
||||||
|
|
||||||
public Name() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public Name(String firstName, String lastName) {
|
|
||||||
this.firstName = firstName;
|
|
||||||
this.lastName = lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFirstName() {
|
|
||||||
return firstName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFirstName(String firstName) {
|
|
||||||
this.firstName = firstName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLastName() {
|
|
||||||
return lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastName(String lastName) {
|
|
||||||
this.lastName = lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return EqualsBuilder.reflectionEquals(this, o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return HashCodeBuilder.reflectionHashCode(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Main on 05.02.2016.
|
|
||||||
*/
|
|
||||||
public class QuerySideCustomer{
|
|
||||||
private String id;
|
|
||||||
private Name name;
|
|
||||||
private String email;
|
|
||||||
private String ssn;
|
|
||||||
private String phoneNumber;
|
|
||||||
private Address address;
|
|
||||||
private Map<String, ToAccountInfo> toAccounts;
|
|
||||||
|
|
||||||
public QuerySideCustomer() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public QuerySideCustomer(String id, Name name, String email, String ssn, String phoneNumber, Address address, Map<String, ToAccountInfo> toAccounts) {
|
|
||||||
this.id = id;
|
|
||||||
this.name = name;
|
|
||||||
this.email = email;
|
|
||||||
this.ssn = ssn;
|
|
||||||
this.phoneNumber = phoneNumber;
|
|
||||||
this.address = address;
|
|
||||||
this.toAccounts = toAccounts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Name getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(Name name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getEmail() {
|
|
||||||
return email;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEmail(String email) {
|
|
||||||
this.email = email;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSsn() {
|
|
||||||
return ssn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSsn(String ssn) {
|
|
||||||
this.ssn = ssn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPhoneNumber() {
|
|
||||||
return phoneNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPhoneNumber(String phoneNumber) {
|
|
||||||
this.phoneNumber = phoneNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Address getAddress() {
|
|
||||||
return address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAddress(Address address) {
|
|
||||||
this.address = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, ToAccountInfo> getToAccounts() {
|
|
||||||
return toAccounts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setToAccounts(Map<String, ToAccountInfo> toAccounts) {
|
|
||||||
this.toAccounts = toAccounts;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
|
||||||
|
|
||||||
|
|
||||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
|
||||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Main on 08.02.2016.
|
|
||||||
*/
|
|
||||||
public class ToAccountInfo {
|
|
||||||
private String id;
|
|
||||||
private String title;
|
|
||||||
private String owner;
|
|
||||||
private String description;
|
|
||||||
|
|
||||||
public ToAccountInfo() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public ToAccountInfo(String id, String title, String owner, String description) {
|
|
||||||
this.id = id;
|
|
||||||
this.title = title;
|
|
||||||
this.owner = owner;
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(String id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitle(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getOwner() {
|
|
||||||
return owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOwner(String owner) {
|
|
||||||
this.owner = owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription(String description) {
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return EqualsBuilder.reflectionEquals(this, o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return HashCodeBuilder.reflectionHashCode(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
compile "commons-lang:commons-lang:2.6"
|
||||||
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
|
||||||
|
|
||||||
testCompile group: 'junit', name: 'junit', version: '4.11'
|
testCompile group: 'junit', name: 'junit', version: '4.11'
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.accounts;
|
||||||
|
|
||||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.accounts;
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import javax.validation.constraints.DecimalMin;
|
import javax.validation.constraints.DecimalMin;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class CreateAccountRequest {
|
public class CreateAccountRequest {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts;
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.accounts;
|
||||||
|
|
||||||
|
|
||||||
public class CreateAccountResponse {
|
public class CreateAccountResponse {
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.accounts;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
|
||||||
|
public class GetAccountResponse {
|
||||||
|
private String accountId;
|
||||||
|
private BigDecimal balance;
|
||||||
|
private String title;
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public GetAccountResponse() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public GetAccountResponse(String accountId, BigDecimal balance, String title, String description) {
|
||||||
|
this.accountId = accountId;
|
||||||
|
this.balance = balance;
|
||||||
|
this.title = title;
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBalance(BigDecimal balance) {
|
||||||
|
this.balance = balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountId(String accountId) {
|
||||||
|
this.accountId = accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountId() {
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getBalance() {
|
||||||
|
return balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by popikyardo on 24.03.16.
|
||||||
|
*/
|
||||||
|
public class AddToAccountResponse {
|
||||||
|
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
public AddToAccountResponse() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddToAccountResponse(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||||
|
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by popikyardo on 02.02.16.
|
||||||
|
*/
|
||||||
|
public class Address {
|
||||||
|
@NotNull
|
||||||
|
private String street1;
|
||||||
|
private String street2;
|
||||||
|
@NotNull
|
||||||
|
private String city;
|
||||||
|
@NotNull
|
||||||
|
private String state;
|
||||||
|
@NotNull
|
||||||
|
private String zipCode;
|
||||||
|
|
||||||
|
public Address() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address(String street1, String street2, String city, String state, String zipCode) {
|
||||||
|
this.street1 = street1;
|
||||||
|
this.street2 = street2;
|
||||||
|
this.city = city;
|
||||||
|
this.state = state;
|
||||||
|
this.zipCode = zipCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStreet1() {
|
||||||
|
return street1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStreet1(String street1) {
|
||||||
|
this.street1 = street1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStreet2() {
|
||||||
|
return street2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStreet2(String street2) {
|
||||||
|
this.street2 = street2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCity() {
|
||||||
|
return city;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCity(String city) {
|
||||||
|
this.city = city;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(String state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getZipCode() {
|
||||||
|
return zipCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setZipCode(String zipCode) {
|
||||||
|
this.zipCode = zipCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return EqualsBuilder.reflectionEquals(this, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||||
|
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by popikyardo on 03.02.16.
|
||||||
|
*/
|
||||||
|
public class CustomerInfo {
|
||||||
|
private Name name;
|
||||||
|
@NotNull
|
||||||
|
protected String email;
|
||||||
|
@NotNull
|
||||||
|
protected String ssn;
|
||||||
|
@NotNull
|
||||||
|
protected String phoneNumber;
|
||||||
|
protected Address address;
|
||||||
|
|
||||||
|
public CustomerInfo() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomerInfo(Name name, String email, String ssn, String phoneNumber, Address address) {
|
||||||
|
this.name = name;
|
||||||
|
this.email = email;
|
||||||
|
this.ssn = ssn;
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Name getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSsn() {
|
||||||
|
return ssn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return EqualsBuilder.reflectionEquals(this, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||||
|
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by popikyardo on 03.02.16.
|
||||||
|
*/
|
||||||
|
public class CustomerResponse {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private CustomerInfo customerInfo;
|
||||||
|
|
||||||
|
public CustomerResponse() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomerResponse(String id, CustomerInfo customerInfo) {
|
||||||
|
this.id = id;
|
||||||
|
this.customerInfo = customerInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomerInfo getCustomerInfo() {
|
||||||
|
return customerInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomerInfo(CustomerInfo customerInfo) {
|
||||||
|
this.customerInfo = customerInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return EqualsBuilder.reflectionEquals(this, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||||
|
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Main on 10.02.2016.
|
||||||
|
*/
|
||||||
|
public class Name {
|
||||||
|
@NotNull
|
||||||
|
private String firstName;
|
||||||
|
@NotNull
|
||||||
|
private String lastName;
|
||||||
|
|
||||||
|
public Name() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Name(String firstName, String lastName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return EqualsBuilder.reflectionEquals(this, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Main on 05.02.2016.
|
||||||
|
*/
|
||||||
|
public class QuerySideCustomer {
|
||||||
|
private String id;
|
||||||
|
private Name name;
|
||||||
|
private String email;
|
||||||
|
private String ssn;
|
||||||
|
private String phoneNumber;
|
||||||
|
private Address address;
|
||||||
|
private Map<String, ToAccountInfo> toAccounts;
|
||||||
|
|
||||||
|
public QuerySideCustomer() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public QuerySideCustomer(String id, Name name, String email, String ssn, String phoneNumber, Address address, Map<String, ToAccountInfo> toAccounts) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
this.email = email;
|
||||||
|
this.ssn = ssn;
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
this.address = address;
|
||||||
|
this.toAccounts = toAccounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Name getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(Name name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSsn() {
|
||||||
|
return ssn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSsn(String ssn) {
|
||||||
|
this.ssn = ssn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhoneNumber(String phoneNumber) {
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(Address address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, ToAccountInfo> getToAccounts() {
|
||||||
|
return toAccounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setToAccounts(Map<String, ToAccountInfo> toAccounts) {
|
||||||
|
this.toAccounts = toAccounts;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.customers;
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||||
|
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Main on 08.02.2016.
|
||||||
|
*/
|
||||||
|
public class ToAccountInfo {
|
||||||
|
private String id;
|
||||||
|
private String title;
|
||||||
|
private String owner;
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public ToAccountInfo() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ToAccountInfo(String id, String title, String owner, String description) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.owner = owner;
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOwner(String owner) {
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
return EqualsBuilder.reflectionEquals(this, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions;
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.transactions;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import javax.validation.constraints.NotNull;
|
|
||||||
import javax.validation.constraints.DecimalMin;
|
import javax.validation.constraints.DecimalMin;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
public class CreateMoneyTransferRequest {
|
public class CreateMoneyTransferRequest {
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions;
|
package net.chrisrichardson.eventstore.javaexamples.banking.common.transactions;
|
||||||
|
|
||||||
|
|
||||||
public class CreateMoneyTransferResponse {
|
public class CreateMoneyTransferResponse {
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":common-customers")
|
compile project(":common")
|
||||||
compile project(":common-backend")
|
compile project(":common-backend")
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
||||||
|
|
||||||
testCompile project(":testutil-customers")
|
testCompile project(":testutil")
|
||||||
testCompile "junit:junit:4.11"
|
testCompile "junit:junit:4.11"
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
||||||
testCompile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
testCompile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateCustomerInfo;
|
||||||
|
|
||||||
public class CustomerTest {
|
public class CustomerTest {
|
||||||
|
|
||||||
@@ -26,4 +26,6 @@ public class CustomerTest {
|
|||||||
customer.applyEvent(events.get(0));
|
customer.applyEvent(events.get(0));
|
||||||
Assert.assertEquals(customerInfo, customer.getCustomerInfo());
|
Assert.assertEquals(customerInfo, customer.getCustomerInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,6 @@ dependencies {
|
|||||||
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-http-stomp-spring:$eventuateClientVersion"
|
compile "io.eventuate.client.java:eventuate-client-java-http-stomp-spring:$eventuateClientVersion"
|
||||||
|
|
||||||
testCompile project(":testutil-customers")
|
testCompile project(":testutil")
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test"
|
testCompile "org.springframework.boot:spring-boot-starter-test"
|
||||||
}
|
}
|
||||||
@@ -24,6 +24,4 @@ public class CustomersCommandSideServiceConfiguration {
|
|||||||
HttpMessageConverter<?> additional = new MappingJackson2HttpMessageConverter();
|
HttpMessageConverter<?> additional = new MappingJackson2HttpMessageConverter();
|
||||||
return new HttpMessageConverters(additional);
|
return new HttpMessageConverters(additional);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|||||||
import org.springframework.test.context.web.WebAppConfiguration;
|
import org.springframework.test.context.web.WebAppConfiguration;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateCustomerInfo;
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@SpringApplicationConfiguration(classes = CustomersCommandSideServiceTestConfiguration.class)
|
@SpringApplicationConfiguration(classes = CustomersCommandSideServiceTestConfiguration.class)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":common-customers")
|
compile project(":common")
|
||||||
compile project(":customers-command-side-backend")
|
compile project(":customers-command-side-backend")
|
||||||
|
|
||||||
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import org.slf4j.LoggerFactory;
|
|||||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
public class QuerySideDependencyChecker {
|
public class QuerySideDependencyChecker {
|
||||||
private Logger logger = LoggerFactory.getLogger(getClass());
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ dependencies {
|
|||||||
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-http-stomp-spring:$eventuateClientVersion"
|
compile "io.eventuate.client.java:eventuate-client-java-http-stomp-spring:$eventuateClientVersion"
|
||||||
|
|
||||||
testCompile project(":testutil-customers")
|
testCompile project(":testutil")
|
||||||
testCompile project(":customers-command-side-service")
|
testCompile project(":customers-command-side-service")
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test"
|
testCompile "org.springframework.boot:spring-boot-starter-test"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.*;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.*;
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Producer;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils;
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Verifier;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -18,8 +16,7 @@ import rx.Observable;
|
|||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateCustomerInfo;
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@SpringApplicationConfiguration(classes = CustomersQuerySideServiceTestConfiguration.class)
|
@SpringApplicationConfiguration(classes = CustomersQuerySideServiceTestConfiguration.class)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.dao.EmptyResultDataAccessException;
|
import org.springframework.dao.EmptyResultDataAccessException;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ dependencies {
|
|||||||
testCompile project(":transactions-command-side-web")
|
testCompile project(":transactions-command-side-web")
|
||||||
testCompile project(":accounts-query-side-web")
|
testCompile project(":accounts-query-side-web")
|
||||||
|
|
||||||
testCompile project(":testutil-customers")
|
testCompile project(":testutil")
|
||||||
testCompile project(":common-auth")
|
testCompile project(":common-auth")
|
||||||
testCompile "junit:junit:4.11"
|
testCompile "junit:junit:4.11"
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
||||||
|
|||||||
@@ -1,187 +1,39 @@
|
|||||||
package net.chrisrichardson.eventstore.examples.bank.web;
|
package net.chrisrichardson.eventstore.examples.bank.web;
|
||||||
|
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountTransactionInfo;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.AbstractRestAPITest;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.AuthenticatedRestTemplate;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerResponse;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.utils.BasicAuthUtils;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CreateAccountRequest;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CreateAccountResponse;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CreateMoneyTransferRequest;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CreateMoneyTransferResponse;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.accounts.GetAccountResponse;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Producer;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Verifier;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.springframework.core.ParameterizedTypeReference;
|
|
||||||
import org.springframework.http.HttpEntity;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
public class EndToEndTest extends AbstractRestAPITest {
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
public class EndToEndTest {
|
|
||||||
|
|
||||||
private String getenv(String name, String defaultValue) {
|
private String getenv(String name, String defaultValue) {
|
||||||
String x = System.getenv(name);
|
String x = System.getenv(name);
|
||||||
return x == null ? defaultValue : x;
|
return x == null ? defaultValue : x;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String makeBaseUrl(int port, String path) {
|
|
||||||
return "http://" + getenv("SERVICE_HOST", "localhost") + ":" + port + "/" + path;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String accountsCommandSideBaseUrl(String path) {
|
|
||||||
return makeBaseUrl(8080, path);
|
|
||||||
}
|
|
||||||
private String accountsQuerySideBaseUrl(String path) {
|
|
||||||
return makeBaseUrl(8081, path);
|
|
||||||
}
|
|
||||||
private String transactionsCommandSideBaseUrl(String path) {
|
|
||||||
return makeBaseUrl(8082, path);
|
|
||||||
}
|
|
||||||
private String customersCommandSideBaseUrl(String path) {
|
|
||||||
return makeBaseUrl(8083, path);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String customersQuerySideBaseUrl(String path) {
|
|
||||||
return makeBaseUrl(8084, path);
|
|
||||||
}
|
|
||||||
|
|
||||||
RestTemplate restTemplate = new RestTemplate();
|
RestTemplate restTemplate = new RestTemplate();
|
||||||
|
|
||||||
CustomersTestUtils customersTestUtils = new CustomersTestUtils(restTemplate, customersQuerySideBaseUrl("/customers/"));
|
CustomersTestUtils customersTestUtils = new CustomersTestUtils(restTemplate, baseUrl("/customers/"));
|
||||||
|
|
||||||
|
public String baseUrl(String path) {
|
||||||
@Test
|
return "http://" + getenv("SERVICE_HOST", "localhost") + ":" + 8080 + "/" + path;
|
||||||
public void shouldCreateCustomerAndAccountsAndTransferMoney() {
|
|
||||||
CustomerInfo customerInfo = generateCustomerInfo();
|
|
||||||
|
|
||||||
BigDecimal initialFromAccountBalance = new BigDecimal(500);
|
|
||||||
BigDecimal initialToAccountBalance = new BigDecimal(100);
|
|
||||||
BigDecimal amountToTransfer = new BigDecimal(150);
|
|
||||||
|
|
||||||
BigDecimal finalFromAccountBalance = initialFromAccountBalance.subtract(amountToTransfer);
|
|
||||||
BigDecimal finalToAccountBalance = initialToAccountBalance.add(amountToTransfer);
|
|
||||||
|
|
||||||
final CustomerResponse customerResponse = restTemplate.postForEntity(customersCommandSideBaseUrl("/customers"),customerInfo, CustomerResponse.class).getBody();
|
|
||||||
final String customerId = customerResponse.getId();
|
|
||||||
|
|
||||||
customersTestUtils.assertCustomerResponse(customerId, customerInfo);
|
|
||||||
|
|
||||||
|
|
||||||
final CreateAccountResponse fromAccount = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
accountsCommandSideBaseUrl("/accounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateAccountResponse.class,
|
|
||||||
new CreateAccountRequest(customerId, "My #1 Account", "", initialFromAccountBalance)
|
|
||||||
);
|
|
||||||
final String fromAccountId = fromAccount.getAccountId();
|
|
||||||
|
|
||||||
CreateAccountResponse toAccount = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
accountsCommandSideBaseUrl("/accounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateAccountResponse.class,
|
|
||||||
new CreateAccountRequest(customerId, "My #2 Account", "", initialToAccountBalance)
|
|
||||||
);
|
|
||||||
|
|
||||||
String toAccountId = toAccount.getAccountId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(fromAccountId);
|
|
||||||
Assert.assertNotNull(toAccountId);
|
|
||||||
|
|
||||||
assertAccountBalance(fromAccountId, initialFromAccountBalance);
|
|
||||||
assertAccountBalance(toAccountId, initialToAccountBalance);
|
|
||||||
|
|
||||||
|
|
||||||
final CreateMoneyTransferResponse moneyTransfer = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
transactionsCommandSideBaseUrl("/transfers"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateMoneyTransferResponse.class,
|
|
||||||
new CreateMoneyTransferRequest(fromAccountId, toAccountId, amountToTransfer, "")
|
|
||||||
);
|
|
||||||
|
|
||||||
assertAccountBalance(fromAccountId, finalFromAccountBalance);
|
|
||||||
assertAccountBalance(toAccountId, finalToAccountBalance);
|
|
||||||
|
|
||||||
// TOOD - check state of money transfer
|
|
||||||
|
|
||||||
List<AccountTransactionInfo> transactionInfoList = restTemplate.exchange(accountsQuerySideBaseUrl("/accounts/"+fromAccountId+"/history"),
|
|
||||||
HttpMethod.GET,
|
|
||||||
new HttpEntity(BasicAuthUtils.basicAuthHeaders("test_user@mail.com")),
|
|
||||||
new ParameterizedTypeReference<List<AccountTransactionInfo>>() {}).getBody();
|
|
||||||
|
|
||||||
assertTrue(transactionInfoList.stream().filter(ti -> ti.getTransactionId().equals(moneyTransfer.getMoneyTransferId()) &&
|
|
||||||
ti.getFromAccountId().equals(fromAccountId) &&
|
|
||||||
ti.getToAccountId().equals(toAccountId) &&
|
|
||||||
ti.getAmount() == toCents(amountToTransfer).longValue()).findFirst().isPresent());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldCreateAccountsAndGetByCustomer() {
|
|
||||||
BigDecimal initialFromAccountBalance = new BigDecimal(500);
|
|
||||||
CustomerInfo customerInfo = generateCustomerInfo();
|
|
||||||
|
|
||||||
final CustomerResponse customerResponse = restTemplate.postForEntity(customersCommandSideBaseUrl("/customers"), customerInfo, CustomerResponse.class).getBody();
|
|
||||||
final String customerId = customerResponse.getId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(customerId);
|
|
||||||
Assert.assertEquals(customerInfo, customerResponse.getCustomerInfo());
|
|
||||||
|
|
||||||
customersTestUtils.assertCustomerResponse(customerId, customerInfo);
|
|
||||||
|
|
||||||
final CreateAccountResponse account = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
accountsCommandSideBaseUrl("/accounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateAccountResponse.class,
|
|
||||||
new CreateAccountRequest(customerId, "My 1 Account", "", initialFromAccountBalance)
|
|
||||||
);
|
|
||||||
final String accountId = account.getAccountId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(accountId);
|
|
||||||
|
|
||||||
assertAccountBalance(accountId, initialFromAccountBalance);
|
|
||||||
|
|
||||||
List<GetAccountResponse> accountResponseList = restTemplate.exchange(accountsQuerySideBaseUrl("/accounts?customerId="+customerId),
|
|
||||||
HttpMethod.GET,
|
|
||||||
new HttpEntity(BasicAuthUtils.basicAuthHeaders("test_user@mail.com")),
|
|
||||||
new ParameterizedTypeReference<List<GetAccountResponse>>() {}).getBody();
|
|
||||||
|
|
||||||
assertTrue(accountResponseList.stream().filter(acc -> acc.getAccountId().equals(accountId)).findFirst().isPresent());
|
|
||||||
}
|
|
||||||
|
|
||||||
private BigDecimal toCents(BigDecimal dollarAmount) {
|
|
||||||
return dollarAmount.multiply(new BigDecimal(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertAccountBalance(final String fromAccountId, final BigDecimal expectedBalanceInDollars) {
|
|
||||||
final BigDecimal inCents = toCents(expectedBalanceInDollars);
|
|
||||||
eventually(
|
|
||||||
new Producer<GetAccountResponse>() {
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<GetAccountResponse> produce() {
|
public CustomersTestUtils getCustomersTestUtils() {
|
||||||
return CompletableFuture.completedFuture(BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
return customersTestUtils;
|
||||||
accountsQuerySideBaseUrl("/accounts/" + fromAccountId),
|
|
||||||
HttpMethod.GET,
|
|
||||||
GetAccountResponse.class));
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
new Verifier<GetAccountResponse>() {
|
|
||||||
@Override
|
@Override
|
||||||
public void verify(GetAccountResponse accountInfo) {
|
public AuthenticatedRestTemplate getAuthenticatedRestTemplate() {
|
||||||
Assert.assertEquals(fromAccountId, accountInfo.getAccountId());
|
return new AuthenticatedRestTemplate(restTemplate);
|
||||||
Assert.assertEquals(inCents, accountInfo.getBalance());
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
@Override
|
||||||
|
public RestTemplate getRestTemplate() {
|
||||||
|
return restTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ eventuateMavenRepoUrl=http://mavenrepo.eventuate.io/release
|
|||||||
|
|
||||||
springBootVersion=1.3.5.RELEASE
|
springBootVersion=1.3.5.RELEASE
|
||||||
|
|
||||||
eventuateClientVersion=0.2.0.RELEASE
|
eventuateClientVersion=0.4.0.RELEASE
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ dependencies {
|
|||||||
compile "org.springframework.boot:spring-boot-starter-web"
|
compile "org.springframework.boot:spring-boot-starter-web"
|
||||||
compile "org.springframework.boot:spring-boot-starter-actuator"
|
compile "org.springframework.boot:spring-boot-starter-actuator"
|
||||||
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
compile "io.eventuate.client.java:eventuate-client-java-http-stomp-spring:$eventuateClientVersion"
|
||||||
|
|
||||||
testCompile project(":testutil-customers")
|
testCompile project(":testutil")
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test"
|
testCompile "org.springframework.boot:spring-boot-starter-test"
|
||||||
|
testCompile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
task copyWebStatic(type: Copy) {
|
task copyWebStatic(type: Copy) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
||||||
|
|
||||||
|
import io.eventuate.javaclient.spring.httpstomp.EventuateHttpStompClientConfiguration;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.AuthConfiguration;
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.AuthConfiguration;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonswagger.CommonSwaggerConfiguration;
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonswagger.CommonSwaggerConfiguration;
|
||||||
import io.eventuate.javaclient.spring.jdbc.EventuateJdbcEventStoreConfiguration;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CommandSideWebAccountsConfiguration;
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CommandSideWebAccountsConfiguration;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.customers.CustomersCommandSideWebConfiguration;
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.customers.CustomersCommandSideWebConfiguration;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CommandSideWebTransactionsConfiguration;
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CommandSideWebTransactionsConfiguration;
|
||||||
@@ -20,7 +20,7 @@ import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
|||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@Import({CommandSideWebAccountsConfiguration.class, CommandSideWebTransactionsConfiguration.class, EventuateJdbcEventStoreConfiguration.class, QuerySideWebConfiguration.class, CustomersQuerySideWebConfiguration.class, CustomersCommandSideWebConfiguration.class, AuthConfiguration.class, CommonSwaggerConfiguration.class})
|
@Import({CommandSideWebAccountsConfiguration.class, CommandSideWebTransactionsConfiguration.class, EventuateHttpStompClientConfiguration.class, QuerySideWebConfiguration.class, CustomersQuerySideWebConfiguration.class, CustomersCommandSideWebConfiguration.class, AuthConfiguration.class, CommonSwaggerConfiguration.class})
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
@ComponentScan
|
@ComponentScan
|
||||||
public class BankingWebConfiguration extends WebMvcConfigurerAdapter {
|
public class BankingWebConfiguration extends WebMvcConfigurerAdapter {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.Cust
|
|||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerResponse;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerResponse;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.QuerySideCustomer;
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.QuerySideCustomer;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model.AuthRequest;
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.model.AuthRequest;
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -18,7 +18,7 @@ import org.springframework.web.client.RestTemplate;
|
|||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateCustomerInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Main on 15.02.2016.
|
* Created by Main on 15.02.2016.
|
||||||
|
|||||||
@@ -1,57 +1,28 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.AccountTransactionInfo;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.AbstractRestAPITest;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.*;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.AuthenticatedRestTemplate;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.utils.BasicAuthUtils;
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CreateAccountRequest;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CreateAccountResponse;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CreateMoneyTransferRequest;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CreateMoneyTransferResponse;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.accounts.GetAccountResponse;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Producer;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Verifier;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.test.IntegrationTest;
|
import org.springframework.boot.test.IntegrationTest;
|
||||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||||
import org.springframework.core.ParameterizedTypeReference;
|
|
||||||
import org.springframework.http.HttpEntity;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
import org.springframework.test.context.web.WebAppConfiguration;
|
import org.springframework.test.context.web.WebAppConfiguration;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
import javax.annotation.PostConstruct;
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
|
|
||||||
import java.util.List;
|
import javax.annotation.PostConstruct;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateCustomerInfo;
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.customers.CustomersTestUtils.generateToAccountInfo;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@SpringApplicationConfiguration(classes = BankingWebTestConfiguration.class)
|
@SpringApplicationConfiguration(classes = BankingWebTestConfiguration.class)
|
||||||
@WebAppConfiguration
|
@WebAppConfiguration
|
||||||
@IntegrationTest({"server.port=0", "management.port=0"})
|
@IntegrationTest({"server.port=0", "management.port=0"})
|
||||||
public class BankingWebIntegrationTest {
|
public class BankingWebIntegrationTest extends AbstractRestAPITest {
|
||||||
|
|
||||||
@Value("${local.server.port}")
|
@Value("${local.server.port}")
|
||||||
private int port;
|
private int port;
|
||||||
|
|
||||||
private String baseUrl(String path) {
|
|
||||||
return "http://localhost:" + port + "/" + path;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
RestTemplate restTemplate;
|
|
||||||
|
|
||||||
CustomersTestUtils customersTestUtils;
|
CustomersTestUtils customersTestUtils;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
@@ -59,168 +30,26 @@ public class BankingWebIntegrationTest {
|
|||||||
customersTestUtils = new CustomersTestUtils(restTemplate, baseUrl("/customers/"));
|
customersTestUtils = new CustomersTestUtils(restTemplate, baseUrl("/customers/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldCreateAccountsAndTransferMoney() {
|
|
||||||
BigDecimal initialFromAccountBalance = new BigDecimal(500);
|
|
||||||
BigDecimal initialToAccountBalance = new BigDecimal(100);
|
|
||||||
BigDecimal amountToTransfer = new BigDecimal(150);
|
|
||||||
|
|
||||||
BigDecimal finalFromAccountBalance = initialFromAccountBalance.subtract(amountToTransfer);
|
|
||||||
BigDecimal finalToAccountBalance = initialToAccountBalance.add(amountToTransfer);
|
|
||||||
|
|
||||||
final CreateAccountResponse fromAccount = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
baseUrl("/accounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateAccountResponse.class,
|
|
||||||
new CreateAccountRequest("00000000-00000000", "My 1 Account", "", initialFromAccountBalance)
|
|
||||||
);
|
|
||||||
final String fromAccountId = fromAccount.getAccountId();
|
|
||||||
|
|
||||||
CreateAccountResponse toAccount = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
baseUrl("/accounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateAccountResponse.class,
|
|
||||||
new CreateAccountRequest("00000000-00000000", "My 2 Account", "", initialToAccountBalance)
|
|
||||||
);
|
|
||||||
|
|
||||||
String toAccountId = toAccount.getAccountId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(fromAccountId);
|
|
||||||
Assert.assertNotNull(toAccountId);
|
|
||||||
|
|
||||||
assertAccountBalance(fromAccountId, initialFromAccountBalance);
|
|
||||||
assertAccountBalance(toAccountId, initialToAccountBalance);
|
|
||||||
|
|
||||||
final CreateMoneyTransferResponse moneyTransfer = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
baseUrl("/transfers"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateMoneyTransferResponse.class,
|
|
||||||
new CreateMoneyTransferRequest(fromAccountId, toAccountId, amountToTransfer, "")
|
|
||||||
);
|
|
||||||
|
|
||||||
assertAccountBalance(fromAccountId, finalFromAccountBalance);
|
|
||||||
assertAccountBalance(toAccountId, finalToAccountBalance);
|
|
||||||
|
|
||||||
List<AccountTransactionInfo> transactionInfoList = restTemplate.exchange(baseUrl("/accounts/"+fromAccountId+"/history"),
|
|
||||||
HttpMethod.GET,
|
|
||||||
new HttpEntity(BasicAuthUtils.basicAuthHeaders("test_user@mail.com")),
|
|
||||||
new ParameterizedTypeReference<List<AccountTransactionInfo>>() {}).getBody();
|
|
||||||
|
|
||||||
|
|
||||||
Optional<AccountTransactionInfo> first = transactionInfoList.stream().filter(ti -> ti.getTransactionId().equals(moneyTransfer.getMoneyTransferId())).findFirst();
|
|
||||||
|
|
||||||
assertTrue(first.isPresent());
|
|
||||||
|
|
||||||
AccountTransactionInfo ti = first.get();
|
|
||||||
|
|
||||||
assertEquals(fromAccountId, ti.getFromAccountId());
|
|
||||||
assertEquals(toAccountId, ti.getToAccountId());
|
|
||||||
assertEquals(toAccountId, ti.getToAccountId());
|
|
||||||
assertEquals(fromAccountId, ti.getFromAccountId());
|
|
||||||
assertEquals(toCents(amountToTransfer).longValue(), ti.getAmount());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldCreateAccountsAndGetByCustomer() {
|
|
||||||
BigDecimal initialFromAccountBalance = new BigDecimal(500);
|
|
||||||
CustomerInfo customerInfo = generateCustomerInfo();
|
|
||||||
|
|
||||||
final CustomerResponse customerResponse = restTemplate.postForEntity(baseUrl("/customers"), customerInfo, CustomerResponse.class).getBody();
|
|
||||||
final String customerId = customerResponse.getId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(customerId);
|
|
||||||
assertEquals(customerInfo, customerResponse.getCustomerInfo());
|
|
||||||
|
|
||||||
customersTestUtils.assertCustomerResponse(customerId, customerInfo);
|
|
||||||
|
|
||||||
final CreateAccountResponse account = BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
baseUrl("/accounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
CreateAccountResponse.class,
|
|
||||||
new CreateAccountRequest(customerId, "My 1 Account", "", initialFromAccountBalance)
|
|
||||||
);
|
|
||||||
final String accountId = account.getAccountId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(accountId);
|
|
||||||
|
|
||||||
assertAccountBalance(accountId, initialFromAccountBalance);
|
|
||||||
|
|
||||||
List<GetAccountResponse> accountResponseList = restTemplate.exchange(baseUrl("/accounts?customerId="+customerId),
|
|
||||||
HttpMethod.GET,
|
|
||||||
new HttpEntity(BasicAuthUtils.basicAuthHeaders("test_user@mail.com")),
|
|
||||||
new ParameterizedTypeReference<List<GetAccountResponse>>() {}).getBody();
|
|
||||||
|
|
||||||
assertTrue(accountResponseList.stream().filter(acc -> acc.getAccountId().equals(accountId)).findFirst().isPresent());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldCreateCustomersAndAddToAccount() {
|
|
||||||
CustomerInfo customerInfo = generateCustomerInfo();
|
|
||||||
|
|
||||||
final CustomerResponse customerResponse = restTemplate.postForEntity(baseUrl("/customers"), customerInfo, CustomerResponse.class).getBody();
|
|
||||||
final String customerId = customerResponse.getId();
|
|
||||||
|
|
||||||
Assert.assertNotNull(customerId);
|
|
||||||
assertEquals(customerInfo, customerResponse.getCustomerInfo());
|
|
||||||
|
|
||||||
customersTestUtils.assertCustomerResponse(customerId, customerInfo);
|
|
||||||
|
|
||||||
ToAccountInfo toAccountInfo = generateToAccountInfo();
|
|
||||||
|
|
||||||
BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
baseUrl("/customers/"+customerId+"/toaccounts"),
|
|
||||||
HttpMethod.POST,
|
|
||||||
null,
|
|
||||||
toAccountInfo
|
|
||||||
);
|
|
||||||
|
|
||||||
assertToAccountsContains(customerId, toAccountInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
private BigDecimal toCents(BigDecimal dollarAmount) {
|
|
||||||
return dollarAmount.multiply(new BigDecimal(100));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertAccountBalance(final String fromAccountId, final BigDecimal expectedBalanceInDollars) {
|
|
||||||
final BigDecimal inCents = toCents(expectedBalanceInDollars);
|
|
||||||
eventually(
|
|
||||||
new Producer<GetAccountResponse>() {
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<GetAccountResponse> produce() {
|
public String baseUrl(String path) {
|
||||||
return CompletableFuture.completedFuture(BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
return "http://localhost:" + port + "/" + path;
|
||||||
baseUrl("/accounts/" + fromAccountId),
|
|
||||||
HttpMethod.GET,
|
|
||||||
GetAccountResponse.class));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Verifier<GetAccountResponse>() {
|
|
||||||
@Override
|
|
||||||
public void verify(GetAccountResponse accountInfo) {
|
|
||||||
assertEquals(fromAccountId, accountInfo.getAccountId());
|
|
||||||
assertEquals(inCents, accountInfo.getBalance());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertToAccountsContains(final String customerId, final ToAccountInfo toAccountInfo) {
|
|
||||||
eventually(
|
|
||||||
new Producer<QuerySideCustomer>() {
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<QuerySideCustomer> produce() {
|
public CustomersTestUtils getCustomersTestUtils() {
|
||||||
return CompletableFuture.completedFuture(BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
return customersTestUtils;
|
||||||
baseUrl("/customers/" + customerId),
|
|
||||||
HttpMethod.GET,
|
|
||||||
QuerySideCustomer.class));
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
new Verifier<QuerySideCustomer>() {
|
@Autowired
|
||||||
|
RestTemplate restTemplate;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void verify(QuerySideCustomer customerResponse) {
|
public AuthenticatedRestTemplate getAuthenticatedRestTemplate() {
|
||||||
assertEquals(customerId, customerResponse.getId());
|
return new AuthenticatedRestTemplate(restTemplate);
|
||||||
assertTrue(customerResponse.getToAccounts().values().stream().anyMatch(t -> t.equals(toAccountInfo)));
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
@Override
|
||||||
|
public RestTemplate getRestTemplate() {
|
||||||
|
return restTemplate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,40 @@
|
|||||||
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
package net.chrisrichardson.eventstore.javaexamples.banking.web;
|
||||||
|
|
||||||
import org.junit.Test;
|
import io.eventuate.javaclient.spring.jdbc.EventuateJdbcEventStoreConfiguration;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.AuthConfiguration;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonswagger.CommonSwaggerConfiguration;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CommandSideWebAccountsConfiguration;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.customers.CustomersCommandSideWebConfiguration;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CommandSideWebTransactionsConfiguration;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.customers.queryside.CustomersQuerySideWebConfiguration;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.QuerySideWebConfiguration;
|
||||||
|
import net.chrisrichardson.eventstorestore.javaexamples.testutil.RestTemplateErrorHandler;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
|
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
|
||||||
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@Import(BankingWebConfiguration.class)
|
@Import({CommandSideWebAccountsConfiguration.class, CommandSideWebTransactionsConfiguration.class, EventuateJdbcEventStoreConfiguration.class, QuerySideWebConfiguration.class, CustomersQuerySideWebConfiguration.class, CustomersCommandSideWebConfiguration.class, AuthConfiguration.class, CommonSwaggerConfiguration.class})
|
||||||
public class BankingWebTestConfiguration {
|
@EnableAutoConfiguration
|
||||||
|
@ComponentScan
|
||||||
|
public class BankingWebTestConfiguration extends WebMvcConfigurerAdapter {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public HttpMessageConverters customConverters() {
|
||||||
|
HttpMessageConverter<?> additional = new MappingJackson2HttpMessageConverter();
|
||||||
|
return new HttpMessageConverters(additional);
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public RestTemplate restTemplate(HttpMessageConverters converters) {
|
public RestTemplate restTemplate(HttpMessageConverters converters) {
|
||||||
@@ -25,6 +42,8 @@ public class BankingWebTestConfiguration {
|
|||||||
HttpMessageConverter<?> httpMessageConverter = converters.getConverters().get(0);
|
HttpMessageConverter<?> httpMessageConverter = converters.getConverters().get(0);
|
||||||
List<? extends HttpMessageConverter<?>> httpMessageConverters = Arrays.asList(new MappingJackson2HttpMessageConverter());
|
List<? extends HttpMessageConverter<?>> httpMessageConverters = Arrays.asList(new MappingJackson2HttpMessageConverter());
|
||||||
restTemplate.setMessageConverters((List<HttpMessageConverter<?>>) httpMessageConverters);
|
restTemplate.setMessageConverters((List<HttpMessageConverter<?>>) httpMessageConverters);
|
||||||
|
|
||||||
|
restTemplate.setErrorHandler(new RestTemplateErrorHandler());
|
||||||
return restTemplate;
|
return restTemplate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,35 @@
|
|||||||
include 'testutil'
|
include 'testutil'
|
||||||
|
include 'common'
|
||||||
|
include 'common-backend'
|
||||||
|
include 'common-auth'
|
||||||
|
include 'common-auth-web'
|
||||||
include 'common-swagger'
|
include 'common-swagger'
|
||||||
|
|
||||||
include 'common-backend'
|
|
||||||
|
|
||||||
include 'accounts-command-side-backend'
|
include 'accounts-command-side-backend'
|
||||||
include 'transactions-command-side-backend'
|
|
||||||
include 'accounts-command-side-web'
|
include 'accounts-command-side-web'
|
||||||
include 'transactions-command-side-web'
|
include 'accounts-command-side-service'
|
||||||
|
|
||||||
|
|
||||||
include 'accounts-query-side-backend'
|
include 'accounts-query-side-backend'
|
||||||
include 'accounts-query-side-web'
|
include 'accounts-query-side-web'
|
||||||
|
include 'accounts-query-side-service'
|
||||||
|
|
||||||
include 'backend-integration-tests'
|
include 'transactions-command-side-backend'
|
||||||
|
include 'transactions-command-side-web'
|
||||||
|
include 'transactions-command-side-service'
|
||||||
|
|
||||||
|
include 'customers-command-side-backend'
|
||||||
|
include 'customers-command-side-web'
|
||||||
|
include 'customers-command-side-service'
|
||||||
|
|
||||||
|
include 'customers-query-side-backend'
|
||||||
|
include 'customers-query-side-web'
|
||||||
|
include 'customers-query-side-service'
|
||||||
|
|
||||||
|
include 'api-gateway-service'
|
||||||
|
|
||||||
include 'monolithic-service'
|
include 'monolithic-service'
|
||||||
|
|
||||||
include 'accounts-command-side-service'
|
include 'backend-integration-tests'
|
||||||
include 'accounts-query-side-service'
|
|
||||||
include 'transactions-command-side-service'
|
|
||||||
|
|
||||||
include 'e2e-test'
|
include 'e2e-test'
|
||||||
|
|
||||||
rootProject.name = 'java-spring-event-sourcing-example'
|
rootProject.name = 'java-spring-event-sourcing-example'
|
||||||
include 'common-auth'
|
|
||||||
include 'customers-command-side-backend'
|
|
||||||
include 'customers-command-side-web'
|
|
||||||
include 'customers-query-side-backend'
|
|
||||||
include 'customers-query-side-web'
|
|
||||||
include 'common-customers'
|
|
||||||
include 'customers-command-side-service'
|
|
||||||
include 'customers-query-side-service'
|
|
||||||
include 'common-auth-web'
|
|
||||||
include 'api-gateway-service'
|
|
||||||
include 'testutil-customers'
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
apply plugin: 'java'
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compile project(":testutil")
|
|
||||||
compile project(":common-auth")
|
|
||||||
compile project(":common-customers")
|
|
||||||
|
|
||||||
compile "io.reactivex:rxjava:1.1.5"
|
|
||||||
compile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
package net.chrisrichardson.eventstorestore.javaexamples.testutil.customers;
|
|
||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.*;
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.utils.BasicAuthUtils;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Producer;
|
|
||||||
import net.chrisrichardson.eventstorestore.javaexamples.testutil.Verifier;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by popikyardo on 02.03.16.
|
|
||||||
*/
|
|
||||||
public class CustomersTestUtils {
|
|
||||||
|
|
||||||
private RestTemplate restTemplate;
|
|
||||||
private String customersBaseUrl;
|
|
||||||
|
|
||||||
public CustomersTestUtils(RestTemplate restTemplate, String customersBaseUrl) {
|
|
||||||
this.restTemplate = restTemplate;
|
|
||||||
this.customersBaseUrl = customersBaseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertCustomerResponse(final String customerId, final CustomerInfo customerInfo) {
|
|
||||||
eventually(
|
|
||||||
new Producer<QuerySideCustomer>() {
|
|
||||||
@Override
|
|
||||||
public CompletableFuture<QuerySideCustomer> produce() {
|
|
||||||
return CompletableFuture.completedFuture(BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
|
||||||
customersBaseUrl + customerId,
|
|
||||||
HttpMethod.GET,
|
|
||||||
QuerySideCustomer.class));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Verifier<QuerySideCustomer>() {
|
|
||||||
@Override
|
|
||||||
public void verify(QuerySideCustomer querySideCustomer) {
|
|
||||||
Assert.assertEquals(customerId, querySideCustomer.getId());
|
|
||||||
assertQuerySideCustomerEqualscCustomerInfo(querySideCustomer, customerInfo);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertQuerySideCustomerEqualscCustomerInfo(QuerySideCustomer querySideCustomer, CustomerInfo customerInfo) {
|
|
||||||
Assert.assertEquals(querySideCustomer.getName(), customerInfo.getName());
|
|
||||||
Assert.assertEquals(querySideCustomer.getEmail(), customerInfo.getEmail());
|
|
||||||
Assert.assertEquals(querySideCustomer.getPhoneNumber(), customerInfo.getPhoneNumber());
|
|
||||||
Assert.assertEquals(querySideCustomer.getSsn(), customerInfo.getSsn());
|
|
||||||
Assert.assertEquals(querySideCustomer.getAddress(), customerInfo.getAddress());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CustomerInfo generateCustomerInfo() {
|
|
||||||
return generateCustomerInfo("current@email.com");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CustomerInfo generateCustomerInfo(String email) {
|
|
||||||
return new CustomerInfo(
|
|
||||||
new Name("John", "Doe"),
|
|
||||||
email,
|
|
||||||
"000-00-0000",
|
|
||||||
"1-111-111-1111",
|
|
||||||
new Address("street 1",
|
|
||||||
"street 2",
|
|
||||||
"City",
|
|
||||||
"State",
|
|
||||||
"1111111")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ToAccountInfo generateToAccountInfo() {
|
|
||||||
return new ToAccountInfo("11111111-11111111", "New Account", "John Doe","");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
compile project(":common")
|
||||||
|
compile project(":common-auth")
|
||||||
|
|
||||||
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
compile "io.eventuate.client.java:eventuate-client-java-spring:$eventuateClientVersion"
|
||||||
|
compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
|
||||||
|
|
||||||
compile "junit:junit:4.11"
|
compile "junit:junit:4.11"
|
||||||
compile "io.reactivex:rxjava:1.1.5"
|
compile "io.reactivex:rxjava:1.1.5"
|
||||||
|
|
||||||
testCompile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
|
||||||
testCompile "io.eventuate.client.java:eventuate-client-java-jdbc:$eventuateClientVersion"
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,198 @@
|
|||||||
|
package net.chrisrichardson.eventstorestore.javaexamples.testutil;
|
||||||
|
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.CreateAccountRequest;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.CreateAccountResponse;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.GetAccountResponse;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerInfo;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.CustomerResponse;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.QuerySideCustomer;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.ToAccountInfo;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.transactions.CreateMoneyTransferRequest;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.transactions.CreateMoneyTransferResponse;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateCustomerInfo;
|
||||||
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.CustomersTestUtils.generateToAccountInfo;
|
||||||
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public abstract class AbstractRestAPITest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldCreateAccountsAndTransferMoney() {
|
||||||
|
BigDecimal initialFromAccountBalance = new BigDecimal(500);
|
||||||
|
BigDecimal initialToAccountBalance = new BigDecimal(100);
|
||||||
|
BigDecimal amountToTransfer = new BigDecimal(150);
|
||||||
|
|
||||||
|
BigDecimal finalFromAccountBalance = initialFromAccountBalance.subtract(amountToTransfer);
|
||||||
|
BigDecimal finalToAccountBalance = initialToAccountBalance.add(amountToTransfer);
|
||||||
|
|
||||||
|
final CreateAccountResponse fromAccount = getAuthenticatedRestTemplate().postForEntity(baseUrl("/accounts"),
|
||||||
|
new CreateAccountRequest("00000000-00000000", "My 1 Account", "", initialFromAccountBalance),
|
||||||
|
CreateAccountResponse.class);
|
||||||
|
|
||||||
|
final String fromAccountId = fromAccount.getAccountId();
|
||||||
|
|
||||||
|
CreateAccountResponse toAccount = getAuthenticatedRestTemplate().postForEntity(baseUrl("/accounts"),
|
||||||
|
new CreateAccountRequest("00000000-00000000", "My 2 Account", "", initialToAccountBalance),
|
||||||
|
CreateAccountResponse.class);
|
||||||
|
|
||||||
|
String toAccountId = toAccount.getAccountId();
|
||||||
|
|
||||||
|
Assert.assertNotNull(fromAccountId);
|
||||||
|
Assert.assertNotNull(toAccountId);
|
||||||
|
|
||||||
|
assertAccountBalance(fromAccountId, initialFromAccountBalance);
|
||||||
|
assertAccountBalance(toAccountId, initialToAccountBalance);
|
||||||
|
|
||||||
|
final CreateMoneyTransferResponse moneyTransfer = getAuthenticatedRestTemplate().postForEntity(baseUrl("/transfers"),
|
||||||
|
new CreateMoneyTransferRequest(fromAccountId, toAccountId, amountToTransfer, ""),
|
||||||
|
CreateMoneyTransferResponse.class);
|
||||||
|
|
||||||
|
assertAccountBalance(fromAccountId, finalFromAccountBalance);
|
||||||
|
assertAccountBalance(toAccountId, finalToAccountBalance);
|
||||||
|
|
||||||
|
eventually(
|
||||||
|
new Producer<AccountTransactionInfo[]>() {
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<AccountTransactionInfo[]> produce() {
|
||||||
|
return CompletableFuture.completedFuture(getAuthenticatedRestTemplate().getForEntity(baseUrl("/accounts/" + fromAccountId + "/history"),
|
||||||
|
AccountTransactionInfo[].class));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new Verifier<AccountTransactionInfo[]>() {
|
||||||
|
@Override
|
||||||
|
public void verify(AccountTransactionInfo[] transactionInfos) {
|
||||||
|
Optional<AccountTransactionInfo> first = Arrays.asList(transactionInfos).stream().filter(ti -> ti.getTransactionId().equals(moneyTransfer.getMoneyTransferId())).findFirst();
|
||||||
|
|
||||||
|
assertTrue(first.isPresent());
|
||||||
|
|
||||||
|
AccountTransactionInfo ti = first.get();
|
||||||
|
|
||||||
|
assertEquals(fromAccountId, ti.getFromAccountId());
|
||||||
|
assertEquals(toAccountId, ti.getToAccountId());
|
||||||
|
assertEquals(toAccountId, ti.getToAccountId());
|
||||||
|
assertEquals(fromAccountId, ti.getFromAccountId());
|
||||||
|
assertEquals(toCents(amountToTransfer).longValue(), ti.getAmount());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldCreateAccountsAndGetByCustomer() {
|
||||||
|
BigDecimal initialFromAccountBalance = new BigDecimal(500);
|
||||||
|
CustomerInfo customerInfo = generateCustomerInfo();
|
||||||
|
|
||||||
|
final CustomerResponse customerResponse = getRestTemplate().postForEntity(baseUrl("/customers"), customerInfo, CustomerResponse.class).getBody();
|
||||||
|
final String customerId = customerResponse.getId();
|
||||||
|
|
||||||
|
Assert.assertNotNull(customerId);
|
||||||
|
assertEquals(customerInfo, customerResponse.getCustomerInfo());
|
||||||
|
|
||||||
|
getCustomersTestUtils().assertCustomerResponse(customerId, customerInfo);
|
||||||
|
|
||||||
|
final CreateAccountResponse account = getAuthenticatedRestTemplate().postForEntity(baseUrl("/accounts"),
|
||||||
|
new CreateAccountRequest(customerId, "My 1 Account", "", initialFromAccountBalance),
|
||||||
|
CreateAccountResponse.class);
|
||||||
|
|
||||||
|
final String accountId = account.getAccountId();
|
||||||
|
|
||||||
|
Assert.assertNotNull(accountId);
|
||||||
|
|
||||||
|
assertAccountBalance(accountId, initialFromAccountBalance);
|
||||||
|
|
||||||
|
eventually(
|
||||||
|
new Producer<GetAccountResponse[]>() {
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<GetAccountResponse[]> produce() {
|
||||||
|
return CompletableFuture.completedFuture(getAuthenticatedRestTemplate().getForEntity(baseUrl("/accounts?customerId=" + customerId),
|
||||||
|
GetAccountResponse[].class));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new Verifier<GetAccountResponse[]>() {
|
||||||
|
@Override
|
||||||
|
public void verify(GetAccountResponse[] accountResponses) {
|
||||||
|
assertTrue(Arrays.asList(accountResponses).stream().filter(acc -> acc.getAccountId().equals(accountId)).findFirst().isPresent());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldCreateCustomersAndAddToAccount() {
|
||||||
|
CustomerInfo customerInfo = generateCustomerInfo();
|
||||||
|
|
||||||
|
final CustomerResponse customerResponse = getRestTemplate().postForEntity(baseUrl("/customers"), customerInfo, CustomerResponse.class).getBody();
|
||||||
|
final String customerId = customerResponse.getId();
|
||||||
|
|
||||||
|
Assert.assertNotNull(customerId);
|
||||||
|
assertEquals(customerInfo, customerResponse.getCustomerInfo());
|
||||||
|
|
||||||
|
getCustomersTestUtils().assertCustomerResponse(customerId, customerInfo);
|
||||||
|
|
||||||
|
ToAccountInfo toAccountInfo = generateToAccountInfo();
|
||||||
|
|
||||||
|
getAuthenticatedRestTemplate().postForEntity(baseUrl("/customers/" + customerId + "/toaccounts"),
|
||||||
|
toAccountInfo,
|
||||||
|
null);
|
||||||
|
|
||||||
|
assertToAccountsContains(customerId, toAccountInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigDecimal toCents(BigDecimal dollarAmount) {
|
||||||
|
return dollarAmount.multiply(new BigDecimal(100));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertAccountBalance(final String fromAccountId, final BigDecimal expectedBalanceInDollars) {
|
||||||
|
final BigDecimal inCents = toCents(expectedBalanceInDollars);
|
||||||
|
eventually(
|
||||||
|
new Producer<GetAccountResponse>() {
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<GetAccountResponse> produce() {
|
||||||
|
return CompletableFuture.completedFuture(getAuthenticatedRestTemplate().getForEntity(baseUrl("/accounts/" + fromAccountId),
|
||||||
|
GetAccountResponse.class));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new Verifier<GetAccountResponse>() {
|
||||||
|
@Override
|
||||||
|
public void verify(GetAccountResponse accountInfo) {
|
||||||
|
assertEquals(fromAccountId, accountInfo.getAccountId());
|
||||||
|
assertEquals(inCents, accountInfo.getBalance());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertToAccountsContains(final String customerId, final ToAccountInfo toAccountInfo) {
|
||||||
|
eventually(
|
||||||
|
new Producer<QuerySideCustomer>() {
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<QuerySideCustomer> produce() {
|
||||||
|
return CompletableFuture.completedFuture(getAuthenticatedRestTemplate().getForEntity(baseUrl("/customers/" + customerId),
|
||||||
|
QuerySideCustomer.class));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new Verifier<QuerySideCustomer>() {
|
||||||
|
@Override
|
||||||
|
public void verify(QuerySideCustomer customerResponse) {
|
||||||
|
assertEquals(customerId, customerResponse.getId());
|
||||||
|
assertTrue(customerResponse.getToAccounts().values().stream().anyMatch(t -> t.equals(toAccountInfo)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract AuthenticatedRestTemplate getAuthenticatedRestTemplate();
|
||||||
|
|
||||||
|
public abstract RestTemplate getRestTemplate();
|
||||||
|
|
||||||
|
public abstract String baseUrl(String path);
|
||||||
|
|
||||||
|
public abstract CustomersTestUtils getCustomersTestUtils();
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package net.chrisrichardson.eventstorestore.javaexamples.testutil;
|
||||||
|
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.commonauth.utils.BasicAuthUtils;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
public class AuthenticatedRestTemplate {
|
||||||
|
|
||||||
|
private RestTemplate restTemplate;
|
||||||
|
|
||||||
|
public AuthenticatedRestTemplate(RestTemplate restTemplate) {
|
||||||
|
this.restTemplate = restTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T getForEntity(String url, Class<T> clazz) {
|
||||||
|
return BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
||||||
|
url,
|
||||||
|
HttpMethod.GET,
|
||||||
|
clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T postForEntity(String url, Object requestObject, Class<T> clazz) {
|
||||||
|
return BasicAuthUtils.doBasicAuthenticatedRequest(restTemplate,
|
||||||
|
url,
|
||||||
|
HttpMethod.POST,
|
||||||
|
clazz,
|
||||||
|
requestObject
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package net.chrisrichardson.eventstorestore.javaexamples.testutil;
|
||||||
|
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.customers.*;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
import static net.chrisrichardson.eventstorestore.javaexamples.testutil.TestUtil.eventually;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by popikyardo on 02.03.16.
|
||||||
|
*/
|
||||||
|
public class CustomersTestUtils {
|
||||||
|
|
||||||
|
private RestTemplate restTemplate;
|
||||||
|
private String customersBaseUrl;
|
||||||
|
|
||||||
|
public CustomersTestUtils(RestTemplate restTemplate, String customersBaseUrl) {
|
||||||
|
this.restTemplate = restTemplate;
|
||||||
|
this.customersBaseUrl = customersBaseUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void assertCustomerResponse(final String customerId, final CustomerInfo customerInfo) {
|
||||||
|
AuthenticatedRestTemplate art = new AuthenticatedRestTemplate(restTemplate);
|
||||||
|
eventually(
|
||||||
|
new Producer<QuerySideCustomer>() {
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<QuerySideCustomer> produce() {
|
||||||
|
return CompletableFuture.completedFuture(art.getForEntity(customersBaseUrl + customerId, QuerySideCustomer.class));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new Verifier<QuerySideCustomer>() {
|
||||||
|
@Override
|
||||||
|
public void verify(QuerySideCustomer querySideCustomer) {
|
||||||
|
Assert.assertEquals(customerId, querySideCustomer.getId());
|
||||||
|
assertQuerySideCustomerEqualscCustomerInfo(querySideCustomer, customerInfo);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void assertQuerySideCustomerEqualscCustomerInfo(QuerySideCustomer querySideCustomer, CustomerInfo customerInfo) {
|
||||||
|
Assert.assertEquals(querySideCustomer.getName(), customerInfo.getName());
|
||||||
|
Assert.assertEquals(querySideCustomer.getEmail(), customerInfo.getEmail());
|
||||||
|
Assert.assertEquals(querySideCustomer.getPhoneNumber(), customerInfo.getPhoneNumber());
|
||||||
|
Assert.assertEquals(querySideCustomer.getSsn(), customerInfo.getSsn());
|
||||||
|
Assert.assertEquals(querySideCustomer.getAddress(), customerInfo.getAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CustomerInfo generateCustomerInfo() {
|
||||||
|
return generateCustomerInfo("current@email.com");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CustomerInfo generateCustomerInfo(String email) {
|
||||||
|
return new CustomerInfo(
|
||||||
|
new Name("John", "Doe"),
|
||||||
|
email,
|
||||||
|
"000-00-0000",
|
||||||
|
"1-111-111-1111",
|
||||||
|
new Address("street 1",
|
||||||
|
"street 2",
|
||||||
|
"City",
|
||||||
|
"State",
|
||||||
|
"1111111")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ToAccountInfo generateToAccountInfo() {
|
||||||
|
return new ToAccountInfo("11111111-11111111", "New Account", "John Doe", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
package net.chrisrichardson.eventstorestore.javaexamples.testutil;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.http.client.ClientHttpResponse;
|
||||||
|
import org.springframework.web.client.ResponseErrorHandler;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class RestTemplateErrorHandler implements ResponseErrorHandler {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(RestTemplateErrorHandler.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleError(ClientHttpResponse response) throws IOException {
|
||||||
|
log.error("Response error: {} {}", response.getStatusCode(), response.getStatusText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasError(ClientHttpResponse response) throws IOException {
|
||||||
|
return RestUtil.isError(response.getStatusCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package net.chrisrichardson.eventstorestore.javaexamples.testutil;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
public class RestUtil {
|
||||||
|
|
||||||
|
public static boolean isError(HttpStatus status) {
|
||||||
|
HttpStatus.Series series = status.series();
|
||||||
|
return (HttpStatus.Series.CLIENT_ERROR.equals(series)
|
||||||
|
|| HttpStatus.Series.SERVER_ERROR.equals(series));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@ package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.tran
|
|||||||
|
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.MoneyTransferService;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.MoneyTransferService;
|
||||||
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.transactions.TransferDetails;
|
import net.chrisrichardson.eventstore.javaexamples.banking.backend.common.transactions.TransferDetails;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.transactions.CreateMoneyTransferRequest;
|
||||||
|
import net.chrisrichardson.eventstore.javaexamples.banking.common.transactions.CreateMoneyTransferResponse;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@@ -10,9 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/transfers")
|
@RequestMapping("/transfers")
|
||||||
|
|||||||
Reference in New Issue
Block a user