diff --git a/.gitignore b/.gitignore index e2cf1c9..5679128 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ .gradle build/ out/ +.DS_Store +src/.DS_Store +src/main/.DS_Store +src/test/.DS_Store diff --git a/build.gradle b/build.gradle index dd91bd7..ea0ba68 100644 --- a/build.gradle +++ b/build.gradle @@ -1,44 +1,55 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE") + } +} + group = 'org.springframework.samples' version = '1.0.0.SNAPSHOT' apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' -apply from: 'src/build/admin-tasks.gradle' +apply plugin: 'org.springframework.boot' +//apply from: 'src/build/admin-tasks.gradle' repositories { - //mavenRepo urls: 'http://maven.springframework.org/milestone' mavenCentral() } dependencies { - //compile 'org.springframework:spring-context:3.1.0.M1' - // https://mvnrepository.com/artifact/org.springframework/spring-context + // tag::jetty[] + compile("org.springframework.boot:spring-boot-starter-web") { + exclude module: "spring-boot-starter-tomcat" + } + compile("org.springframework.boot:spring-boot-starter-jetty") + // end::jetty[] + // tag::actuator[] + compile("org.springframework.boot:spring-boot-starter-actuator") + // end::actuator[] compile group: 'org.springframework', name: 'spring-context', version: '3.1.0.RELEASE' - // https://mvnrepository.com/artifact/org.springframework/spring-jdbc compile group: 'org.springframework', name: 'spring-jdbc', version: '3.1.0.RELEASE' - //compile 'org.springframework:spring-jdbc:3.1.0.M1' compile 'cglib:cglib-nodep:2.2' compile 'hsqldb:hsqldb:1.8.0.10' compile 'commons-logging:commons-logging:1.1.1' - compile 'log4j:log4j:1.2.16' + //compile 'log4j:log4j:1.2.16' compile 'javax.inject:javax.inject:1' - //testCompile 'org.springframework:spring-test:3.1.0.M1' testCompile 'junit:junit:4.7' } [compileJava, compileTestJava]*.options*.compilerArgs = ['-Xlint:all'] -sourceCompatibility = 1.6 -targetCompatibility = 1.6 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 task wee(type: Wrapper) { gradleVersion = '2.10' //we want gradle 2.10 to run this project } - -// consolidate source directories for ease of browsing sourceSets { main { java { srcDir 'src/main' } diff --git a/src/main/java/com/bank/Application.java b/src/main/java/com/bank/Application.java new file mode 100644 index 0000000..02a4429 --- /dev/null +++ b/src/main/java/com/bank/Application.java @@ -0,0 +1,33 @@ +package com.bank; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + +import java.util.Arrays; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Bean + public CommandLineRunner commandLineRunner(ApplicationContext ctx) { + return args -> { + + System.out.println("Let's inspect the beans provided by Spring Boot:"); + + String[] beanNames = ctx.getBeanDefinitionNames(); + Arrays.sort(beanNames); + for (String beanName : beanNames) { + System.out.println(beanName); + } + + }; + } + +} \ No newline at end of file diff --git a/src/main/java/com/bank/controller/TransferController.java b/src/main/java/com/bank/controller/TransferController.java new file mode 100644 index 0000000..65f675f --- /dev/null +++ b/src/main/java/com/bank/controller/TransferController.java @@ -0,0 +1,14 @@ +package com.bank.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TransferController { + + @RequestMapping("/") + public String index() { + return "Greetings from Spring Boot!"; + } + +} \ No newline at end of file diff --git a/src/main/com/bank/domain/Account.java b/src/main/java/com/bank/domain/Account.java similarity index 100% rename from src/main/com/bank/domain/Account.java rename to src/main/java/com/bank/domain/Account.java diff --git a/src/main/java/com/bank/domain/DefaultTransferWindow.java b/src/main/java/com/bank/domain/DefaultTransferWindow.java new file mode 100644 index 0000000..932b3e7 --- /dev/null +++ b/src/main/java/com/bank/domain/DefaultTransferWindow.java @@ -0,0 +1,23 @@ +package com.bank.domain; + +import java.time.LocalTime; + +public class DefaultTransferWindow { + private LocalTime open; + private LocalTime close; + public DefaultTransferWindow(String open, String close) { + this.open = LocalTime.parse(open); + this.close = LocalTime.parse(close); + } + + public boolean isValidTimeForTransferMoney(LocalTime transactionTime) { + return (transactionTime.isAfter(open))&&(transactionTime.isBefore(close)); + } + + public LocalTime getOpen() { + return this.open; + } + public LocalTime getClose() { + return this.close; + } +} diff --git a/src/main/com/bank/domain/DepositReceipt.java b/src/main/java/com/bank/domain/DepositReceipt.java similarity index 100% rename from src/main/com/bank/domain/DepositReceipt.java rename to src/main/java/com/bank/domain/DepositReceipt.java diff --git a/src/main/com/bank/domain/InsufficientFundsException.java b/src/main/java/com/bank/domain/InsufficientFundsException.java similarity index 100% rename from src/main/com/bank/domain/InsufficientFundsException.java rename to src/main/java/com/bank/domain/InsufficientFundsException.java diff --git a/src/main/com/bank/domain/InvalidDepositAmountException.java b/src/main/java/com/bank/domain/InvalidDepositAmountException.java similarity index 100% rename from src/main/com/bank/domain/InvalidDepositAmountException.java rename to src/main/java/com/bank/domain/InvalidDepositAmountException.java diff --git a/src/main/java/com/bank/domain/LocalTimeWrapper.java b/src/main/java/com/bank/domain/LocalTimeWrapper.java new file mode 100644 index 0000000..3758081 --- /dev/null +++ b/src/main/java/com/bank/domain/LocalTimeWrapper.java @@ -0,0 +1,23 @@ +package com.bank.domain; + +import org.omg.CORBA.Current; + +import java.time.LocalTime; + +public class LocalTimeWrapper { + + private String specificTime = null; + public LocalTimeWrapper(String initial){ + this.specificTime = initial; + } + + public LocalTimeWrapper() { + + } + + public LocalTime getCurrentTime() { + if(this.specificTime != null) + return LocalTime.parse(this.specificTime); + return LocalTime.now(); + } +} diff --git a/src/main/com/bank/domain/TransferReceipt.java b/src/main/java/com/bank/domain/TransferReceipt.java similarity index 94% rename from src/main/com/bank/domain/TransferReceipt.java rename to src/main/java/com/bank/domain/TransferReceipt.java index f6b3ae0..bb1d6bc 100644 --- a/src/main/com/bank/domain/TransferReceipt.java +++ b/src/main/java/com/bank/domain/TransferReceipt.java @@ -15,6 +15,8 @@ */ package com.bank.domain; +import java.time.LocalTime; + import static java.lang.String.format; public class TransferReceipt { @@ -25,6 +27,12 @@ public class TransferReceipt { private Account initialDestinationAccountCopy; private Account finalSourceAccountCopy; private Account finalDestinationAccountCopy; + private LocalTime transactionTime; + + + public TransferReceipt(LocalTime transactionTime) { + this.transactionTime = transactionTime; + } public void setTransferAmount(double transferAmount) { this.transferAmount = transferAmount; diff --git a/src/main/com/bank/repository/AccountNotFoundException.java b/src/main/java/com/bank/repository/AccountNotFoundException.java similarity index 100% rename from src/main/com/bank/repository/AccountNotFoundException.java rename to src/main/java/com/bank/repository/AccountNotFoundException.java diff --git a/src/main/com/bank/repository/AccountRepository.java b/src/main/java/com/bank/repository/AccountRepository.java similarity index 100% rename from src/main/com/bank/repository/AccountRepository.java rename to src/main/java/com/bank/repository/AccountRepository.java diff --git a/src/main/com/bank/repository/internal/JdbcAccountRepository.java b/src/main/java/com/bank/repository/internal/JdbcAccountRepository.java similarity index 100% rename from src/main/com/bank/repository/internal/JdbcAccountRepository.java rename to src/main/java/com/bank/repository/internal/JdbcAccountRepository.java diff --git a/src/main/com/bank/repository/internal/SimpleAccountRepository.java b/src/main/java/com/bank/repository/internal/SimpleAccountRepository.java similarity index 100% rename from src/main/com/bank/repository/internal/SimpleAccountRepository.java rename to src/main/java/com/bank/repository/internal/SimpleAccountRepository.java diff --git a/src/main/com/bank/service/DepositService.java b/src/main/java/com/bank/service/DepositService.java similarity index 100% rename from src/main/com/bank/service/DepositService.java rename to src/main/java/com/bank/service/DepositService.java diff --git a/src/main/com/bank/service/FeePolicy.java b/src/main/java/com/bank/service/FeePolicy.java similarity index 100% rename from src/main/com/bank/service/FeePolicy.java rename to src/main/java/com/bank/service/FeePolicy.java diff --git a/src/main/com/bank/service/TransferService.java b/src/main/java/com/bank/service/TransferService.java similarity index 88% rename from src/main/com/bank/service/TransferService.java rename to src/main/java/com/bank/service/TransferService.java index 3b886d5..05d5a1b 100644 --- a/src/main/com/bank/service/TransferService.java +++ b/src/main/java/com/bank/service/TransferService.java @@ -17,11 +17,12 @@ import com.bank.domain.InsufficientFundsException; import com.bank.domain.TransferReceipt; +import com.bank.service.internal.InvalidTransferWindow; public interface TransferService { TransferReceipt transfer(double amount, String srcAcctId, String destAcctId) - throws InsufficientFundsException; + throws InsufficientFundsException, InvalidTransferWindow; void setMinimumTransferAmount(double minimumTransferAmount); } diff --git a/src/main/com/bank/service/internal/DefaultDepositService.java b/src/main/java/com/bank/service/internal/DefaultDepositService.java similarity index 100% rename from src/main/com/bank/service/internal/DefaultDepositService.java rename to src/main/java/com/bank/service/internal/DefaultDepositService.java diff --git a/src/main/com/bank/service/internal/DefaultTransferService.java b/src/main/java/com/bank/service/internal/DefaultTransferService.java similarity index 64% rename from src/main/com/bank/service/internal/DefaultTransferService.java rename to src/main/java/com/bank/service/internal/DefaultTransferService.java index 63c4c06..f2f254f 100644 --- a/src/main/com/bank/service/internal/DefaultTransferService.java +++ b/src/main/java/com/bank/service/internal/DefaultTransferService.java @@ -17,24 +17,31 @@ import static java.lang.String.format; +import com.bank.domain.*; import org.springframework.transaction.annotation.Transactional; -import com.bank.domain.Account; -import com.bank.domain.InsufficientFundsException; -import com.bank.domain.TransferReceipt; import com.bank.repository.AccountRepository; import com.bank.service.FeePolicy; import com.bank.service.TransferService; +import java.time.LocalTime; + public class DefaultTransferService implements TransferService { private final AccountRepository accountRepository; private final FeePolicy feePolicy; private double minimumTransferAmount = 1.00; + private LocalTimeWrapper localTimeWrapper; + private DefaultTransferWindow defaultTransferWindow; - public DefaultTransferService(AccountRepository accountRepository, FeePolicy feePolicy) { + public DefaultTransferService(AccountRepository accountRepository, + FeePolicy feePolicy, + LocalTimeWrapper localTimeWrapper, + DefaultTransferWindow transferWindow) { this.accountRepository = accountRepository; this.feePolicy = feePolicy; + this.localTimeWrapper = localTimeWrapper; + this.defaultTransferWindow = transferWindow; } @Override @@ -44,36 +51,47 @@ public void setMinimumTransferAmount(double minimumTransferAmount) { @Override @Transactional - public TransferReceipt transfer(double amount, String srcAcctId, String dstAcctId) throws InsufficientFundsException { - if (amount < minimumTransferAmount) { - throw new IllegalArgumentException(format("transfer amount must be at least $%.2f", minimumTransferAmount)); - } + public TransferReceipt transfer(double amount, String srcAcctId, String dstAcctId) + throws InsufficientFundsException, InvalidTransferWindow { - TransferReceipt receipt = new TransferReceipt(); + LocalTime transactionTime = this.localTimeWrapper.getCurrentTime(); + checkEligibility(amount, transactionTime); Account srcAcct = accountRepository.findById(srcAcctId); Account dstAcct = accountRepository.findById(dstAcctId); - receipt.setInitialSourceAccount(srcAcct); - receipt.setInitialDestinationAccount(dstAcct); - double fee = feePolicy.calculateFee(amount); if (fee > 0) { srcAcct.debit(fee); } - - receipt.setTransferAmount(amount); - receipt.setFeeAmount(fee); - srcAcct.debit(amount); dstAcct.credit(amount); accountRepository.updateBalance(srcAcct); accountRepository.updateBalance(dstAcct); + return getTransferReceipt(amount, transactionTime, srcAcct, dstAcct, fee); + } + + private TransferReceipt getTransferReceipt(double amount, LocalTime transactionTime, Account srcAcct, Account dstAcct, double fee) { + TransferReceipt receipt = new TransferReceipt(transactionTime); + receipt.setInitialSourceAccount(srcAcct); + receipt.setInitialDestinationAccount(dstAcct); + receipt.setTransferAmount(amount); + receipt.setFeeAmount(fee); receipt.setFinalSourceAccount(srcAcct); receipt.setFinalDestinationAccount(dstAcct); - return receipt; } + + private void checkEligibility(double amount, LocalTime transactionTime) throws InvalidTransferWindow { + if (amount < minimumTransferAmount) { + throw new IllegalArgumentException(format("transfer amount must be at least $%.2f", minimumTransferAmount)); + } + + + if(!defaultTransferWindow.isValidTimeForTransferMoney(transactionTime)) { + throw new InvalidTransferWindow("We only allow to transfer between " + defaultTransferWindow.getOpen() + " and " + defaultTransferWindow.getClose()); + } + } } diff --git a/src/main/com/bank/service/internal/FlatFeePolicy.java b/src/main/java/com/bank/service/internal/FlatFeePolicy.java similarity index 100% rename from src/main/com/bank/service/internal/FlatFeePolicy.java rename to src/main/java/com/bank/service/internal/FlatFeePolicy.java diff --git a/src/main/java/com/bank/service/internal/InvalidTransferWindow.java b/src/main/java/com/bank/service/internal/InvalidTransferWindow.java new file mode 100644 index 0000000..8bd8da6 --- /dev/null +++ b/src/main/java/com/bank/service/internal/InvalidTransferWindow.java @@ -0,0 +1,6 @@ +package com.bank.service.internal; + +public class InvalidTransferWindow extends Throwable { + public InvalidTransferWindow(String s) { + } +} diff --git a/src/main/com/bank/service/internal/VariableFeePolicy.java b/src/main/java/com/bank/service/internal/VariableFeePolicy.java similarity index 100% rename from src/main/com/bank/service/internal/VariableFeePolicy.java rename to src/main/java/com/bank/service/internal/VariableFeePolicy.java diff --git a/src/main/com/bank/service/internal/ZeroFeePolicy.java b/src/main/java/com/bank/service/internal/ZeroFeePolicy.java similarity index 100% rename from src/main/com/bank/service/internal/ZeroFeePolicy.java rename to src/main/java/com/bank/service/internal/ZeroFeePolicy.java diff --git a/src/main/com/bank/config/sql/schema.sql b/src/main/resources/sql/schema.sql similarity index 100% rename from src/main/com/bank/config/sql/schema.sql rename to src/main/resources/sql/schema.sql diff --git a/src/main/com/bank/config/sql/test-data.sql b/src/main/resources/sql/test-data.sql similarity index 100% rename from src/main/com/bank/config/sql/test-data.sql rename to src/main/resources/sql/test-data.sql diff --git a/src/main/com/bank/config/xml/transfer-service-config.xml b/src/main/resources/xml/transfer-service-config.xml similarity index 70% rename from src/main/com/bank/config/xml/transfer-service-config.xml rename to src/main/resources/xml/transfer-service-config.xml index 7d16453..b5a49b5 100644 --- a/src/main/com/bank/config/xml/transfer-service-config.xml +++ b/src/main/resources/xml/transfer-service-config.xml @@ -10,6 +10,8 @@ + + @@ -18,10 +20,17 @@ + + + + + + + - - + + diff --git a/src/test/com/bank/service/internal/DefaultTransferWindowTest.java b/src/test/com/bank/service/internal/DefaultTransferWindowTest.java deleted file mode 100644 index b51fa87..0000000 --- a/src/test/com/bank/service/internal/DefaultTransferWindowTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bank.service.internal; - -public class DefaultTransferWindowTest { -} diff --git a/src/test/com/bank/config/xml/IntegrationTests.java b/src/test/java/com/bank/integration/IntegrationTests.java similarity index 90% rename from src/test/com/bank/config/xml/IntegrationTests.java rename to src/test/java/com/bank/integration/IntegrationTests.java index 0656e32..9d556f8 100644 --- a/src/test/com/bank/config/xml/IntegrationTests.java +++ b/src/test/java/com/bank/integration/IntegrationTests.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.bank.config.xml; +package com.bank.integration; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; +import com.bank.service.internal.InvalidTransferWindow; import org.junit.Test; import org.springframework.context.support.GenericXmlApplicationContext; @@ -28,10 +29,10 @@ public class IntegrationTests { @Test - public void transferTenDollars() throws InsufficientFundsException { + public void transferTenDollars() throws InsufficientFundsException, InvalidTransferWindow { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.getEnvironment().setActiveProfiles("dev"); - ctx.load("classpath:/com/bank/config/xml/transfer-service-config.xml"); + ctx.load("classpath:/xml/transfer-service-config.xml"); ctx.refresh(); TransferService transferService = ctx.getBean(TransferService.class); diff --git a/src/test/com/bank/service/internal/DefaultDepositServiceTests.java b/src/test/java/com/bank/service/internal/DefaultDepositServiceTests.java similarity index 100% rename from src/test/com/bank/service/internal/DefaultDepositServiceTests.java rename to src/test/java/com/bank/service/internal/DefaultDepositServiceTests.java diff --git a/src/test/com/bank/service/internal/DefaultTransferServiceTests.java b/src/test/java/com/bank/service/internal/DefaultTransferServiceTests.java similarity index 72% rename from src/test/com/bank/service/internal/DefaultTransferServiceTests.java rename to src/test/java/com/bank/service/internal/DefaultTransferServiceTests.java index 846befc..c1db243 100644 --- a/src/test/com/bank/service/internal/DefaultTransferServiceTests.java +++ b/src/test/java/com/bank/service/internal/DefaultTransferServiceTests.java @@ -5,6 +5,8 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import com.bank.domain.LocalTimeWrapper; +import com.bank.domain.DefaultTransferWindow; import org.junit.Before; import org.junit.Test; @@ -15,9 +17,6 @@ import com.bank.repository.internal.SimpleAccountRepository; import com.bank.service.FeePolicy; import com.bank.service.TransferService; -import com.bank.service.internal.FlatFeePolicy; -import com.bank.service.internal.DefaultTransferService; -import com.bank.service.internal.ZeroFeePolicy; public class DefaultTransferServiceTests { @@ -28,14 +27,37 @@ public class DefaultTransferServiceTests { public void setUp() { accountRepository = new SimpleAccountRepository(); FeePolicy feePolicy = new ZeroFeePolicy(); - transferService = new DefaultTransferService(accountRepository, feePolicy); + LocalTimeWrapper localTimeWrapper = new LocalTimeWrapper(); + DefaultTransferWindow transferWindow = new DefaultTransferWindow("06:00:00", "22:00:00"); + transferService = new DefaultTransferService(accountRepository, feePolicy, localTimeWrapper, transferWindow); assertThat(accountRepository.findById(A123_ID).getBalance(), equalTo(A123_INITIAL_BAL)); assertThat(accountRepository.findById(C456_ID).getBalance(), equalTo(C456_INITIAL_BAL)); } @Test - public void testTransfer() throws InsufficientFundsException { + public void invalidTransferWindow() { + double transferAmount = 100.00; + LocalTimeWrapper localTimeWrapper = new LocalTimeWrapper("23:00:00"); + DefaultTransferWindow transferWindow = new DefaultTransferWindow("06:00:00", "22:00:00"); + accountRepository = new SimpleAccountRepository(); + FeePolicy feePolicy = new ZeroFeePolicy(); + transferService = new DefaultTransferService(accountRepository, feePolicy, localTimeWrapper, transferWindow); + + try { + transferService.transfer(transferAmount, A123_ID, C456_ID); + fail("expected InvalidTransactionWindowTime"); + } catch (InsufficientFundsException e) { + //e.printStackTrace(); + } catch (InvalidTransferWindow invalidTransferWindow) { + //invalidTransferWindow.printStackTrace(); + } + assertThat(accountRepository.findById(A123_ID).getBalance(), equalTo(A123_INITIAL_BAL)); + assertThat(accountRepository.findById(C456_ID).getBalance(), equalTo(C456_INITIAL_BAL)); + } + + @Test + public void testTransfer() throws InsufficientFundsException, InvalidTransferWindow { double transferAmount = 100.00; TransferReceipt receipt = transferService.transfer(transferAmount, A123_ID, C456_ID); @@ -49,7 +71,7 @@ public void testTransfer() throws InsufficientFundsException { } @Test - public void testInsufficientFunds() { + public void testInsufficientFunds() throws InvalidTransferWindow { double overage = 9.00; double transferAmount = A123_INITIAL_BAL + overage; @@ -66,7 +88,7 @@ public void testInsufficientFunds() { } @Test - public void testNonExistentSourceAccount() throws InsufficientFundsException { + public void testNonExistentSourceAccount() throws InsufficientFundsException, InvalidTransferWindow { try { transferService.transfer(1.00, Z999_ID, C456_ID); fail("expected AccountNotFoundException"); @@ -77,7 +99,7 @@ public void testNonExistentSourceAccount() throws InsufficientFundsException { } @Test - public void testNonExistentDestinationAccount() throws InsufficientFundsException { + public void testNonExistentDestinationAccount() throws InsufficientFundsException, InvalidTransferWindow { try { transferService.transfer(1.00, A123_ID, Z999_ID); fail("expected AccountNotFoundException"); @@ -88,7 +110,7 @@ public void testNonExistentDestinationAccount() throws InsufficientFundsExceptio } @Test - public void testZeroTransferAmount() throws InsufficientFundsException { + public void testZeroTransferAmount() throws InsufficientFundsException, InvalidTransferWindow { try { transferService.transfer(0.00, A123_ID, C456_ID); fail("expected IllegalArgumentException"); @@ -97,7 +119,7 @@ public void testZeroTransferAmount() throws InsufficientFundsException { } @Test - public void testNegativeTransferAmount() throws InsufficientFundsException { + public void testNegativeTransferAmount() throws InsufficientFundsException, InvalidTransferWindow { try { transferService.transfer(-100.00, A123_ID, C456_ID); fail("expected IllegalArgumentException"); @@ -106,7 +128,7 @@ public void testNegativeTransferAmount() throws InsufficientFundsException { } @Test - public void testTransferAmountLessThanOneCent() throws InsufficientFundsException { + public void testTransferAmountLessThanOneCent() throws InsufficientFundsException, InvalidTransferWindow { try { transferService.transfer(0.009, A123_ID, C456_ID); fail("expected IllegalArgumentException"); @@ -115,7 +137,7 @@ public void testTransferAmountLessThanOneCent() throws InsufficientFundsExceptio } @Test - public void testCustomizedMinimumTransferAmount() throws InsufficientFundsException { + public void testCustomizedMinimumTransferAmount() throws InsufficientFundsException, InvalidTransferWindow { transferService.transfer(1.00, A123_ID, C456_ID); // should be fine transferService.setMinimumTransferAmount(10.00); transferService.transfer(10.00, A123_ID, C456_ID); // fine against new minimum @@ -127,10 +149,12 @@ public void testCustomizedMinimumTransferAmount() throws InsufficientFundsExcept } @Test - public void testNonZeroFeePolicy() throws InsufficientFundsException { + public void testNonZeroFeePolicy() throws InsufficientFundsException, InvalidTransferWindow { double flatFee = 5.00; double transferAmount = 10.00; - transferService = new DefaultTransferService(accountRepository, new FlatFeePolicy(flatFee)); + LocalTimeWrapper localTimeWrapper = new LocalTimeWrapper(); + DefaultTransferWindow transferWindow = new DefaultTransferWindow("06:00:00", "22:00:00"); + transferService = new DefaultTransferService(accountRepository, new FlatFeePolicy(flatFee), localTimeWrapper, transferWindow); transferService.transfer(transferAmount, A123_ID, C456_ID); assertThat(accountRepository.findById(A123_ID).getBalance(), equalTo(A123_INITIAL_BAL - transferAmount - flatFee)); assertThat(accountRepository.findById(C456_ID).getBalance(), equalTo(C456_INITIAL_BAL + transferAmount)); diff --git a/src/test/java/com/bank/service/internal/DefaultTransferWindowTest.java b/src/test/java/com/bank/service/internal/DefaultTransferWindowTest.java new file mode 100644 index 0000000..eb389c4 --- /dev/null +++ b/src/test/java/com/bank/service/internal/DefaultTransferWindowTest.java @@ -0,0 +1,24 @@ +package com.bank.service.internal; + +import com.bank.domain.LocalTimeWrapper; +import com.bank.domain.DefaultTransferWindow; +import org.junit.Assert; +import org.junit.Test; + +public class DefaultTransferWindowTest { + @Test + public void withinValidTransferWindow() { + LocalTimeWrapper x = new LocalTimeWrapper(); + LocalTimeWrapper localTimeWrapper = new LocalTimeWrapper("12:05:59"); + DefaultTransferWindow transferWindow = new DefaultTransferWindow("10:00:00", "22:00:00"); + Assert.assertTrue(transferWindow.isValidTimeForTransferMoney(localTimeWrapper.getCurrentTime())); + } + + @Test + public void withinInValidTransferWindow() { + LocalTimeWrapper localTimeWrapper = new LocalTimeWrapper("23:00:00"); + DefaultTransferWindow transferWindow = new DefaultTransferWindow("10:00:00", "22:00:00"); + Assert.assertFalse(transferWindow.isValidTimeForTransferMoney(localTimeWrapper.getCurrentTime())); + } + +} diff --git a/src/test/com/bank/service/internal/VariableFeePolicyTests.java b/src/test/java/com/bank/service/internal/VariableFeePolicyTests.java similarity index 100% rename from src/test/com/bank/service/internal/VariableFeePolicyTests.java rename to src/test/java/com/bank/service/internal/VariableFeePolicyTests.java diff --git a/tdd-using-spring.ipr b/tdd-using-spring.ipr index 090d734..01c1f3a 100644 --- a/tdd-using-spring.ipr +++ b/tdd-using-spring.ipr @@ -13,7 +13,7 @@ - + @@ -51,7 +51,7 @@ - +