From 232df72c6c0409bffcfe33c98e8f0517a12a38b1 Mon Sep 17 00:00:00 2001 From: Rasheed Date: Wed, 16 Apr 2025 16:45:06 +0000 Subject: [PATCH] implemented moneyorder and auditlog --- .../lesson17/bank/AuditLog.java | 33 ++++++++++ .../lesson17/bank/BankAtm.java | 15 +++++ .../codedifferently/lesson17/bank/Check.java | 4 ++ .../lesson17/bank/MoneyOrder.java | 26 ++++++++ .../lesson17/bank/AuditLogTest.java | 61 +++++++++++++++++++ .../lesson17/bank/BankAtmTest.java | 6 +- .../lesson17/bank/MoneyOrderTest.java | 51 ++++++++++++++++ 7 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java create mode 100644 lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/AuditLogTest.java create mode 100644 lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/MoneyOrderTest.java diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java new file mode 100644 index 00000000..1ceede49 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/AuditLog.java @@ -0,0 +1,33 @@ +package com.codedifferently.lesson17.bank; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class AuditLog { + + private static final AuditLog INSTANCE = new AuditLog(); + + private final List entries; + + private AuditLog() { + this.entries = new ArrayList<>(); + } + + public static AuditLog getInstance() { + return INSTANCE; + } + + public void log(String type, String accountNumber, double amount) { + String entry = String.format("%s - Account: %s, Amount: %.2f", type, accountNumber, amount); + entries.add(entry); + } + + public List getEntries() { + return Collections.unmodifiableList(entries); + } + + public void clear() { + entries.clear(); + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java index 8cbcd3cc..7095ef48 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java @@ -11,6 +11,7 @@ public class BankAtm { private final Map customerById = new HashMap<>(); private final Map accountByNumber = new HashMap<>(); + private Map accounts; /** * Adds a checking account to the bank. @@ -48,6 +49,7 @@ public Set findAccountsByCustomerId(UUID customerId) { public void depositFunds(String accountNumber, double amount) { CheckingAccount account = getAccountOrThrow(accountNumber); account.deposit(amount); + AuditLog.getInstance().log("DEPOSIT", account.getAccountNumber(), amount); } /** @@ -59,6 +61,13 @@ public void depositFunds(String accountNumber, double amount) { public void depositFunds(String accountNumber, Check check) { CheckingAccount account = getAccountOrThrow(accountNumber); check.depositFunds(account); + AuditLog.getInstance().log("CHECK DEPOSIT", account.getAccountNumber(), check.getAmount()); + } + + public void depositFunds(String accountNumber, MoneyOrder mo) { + CheckingAccount toAccount = (CheckingAccount) accounts.get(accountNumber); // ✅ must not be null + mo.depositFunds(toAccount); + AuditLog.getInstance().log("MONEY ORDER DEPOSIT", toAccount.getAccountNumber(), mo.getAmount()); } /** @@ -70,6 +79,7 @@ public void depositFunds(String accountNumber, Check check) { public void withdrawFunds(String accountNumber, double amount) { CheckingAccount account = getAccountOrThrow(accountNumber); account.withdraw(amount); + AuditLog.getInstance().log("WITHDRAWAL", account.getAccountNumber(), amount); } /** @@ -85,4 +95,9 @@ private CheckingAccount getAccountOrThrow(String accountNumber) { } return account; } + + public BankAtm getBank() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBank'"); + } } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java index 061fa4a5..926c0ffe 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java @@ -54,6 +54,10 @@ public void depositFunds(CheckingAccount toAccount) { voidCheck(); } + public double getAmount() { + return amount; + } + @Override public int hashCode() { return checkNumber.hashCode(); diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java new file mode 100644 index 00000000..53000100 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/MoneyOrder.java @@ -0,0 +1,26 @@ +package com.codedifferently.lesson17.bank; + +import java.util.UUID; + +public class MoneyOrder extends Check { + + public MoneyOrder(CheckingAccount sourceAccount, double amount) { + super("MO-" + UUID.randomUUID(), amount, sourceAccount); + + sourceAccount.withdraw(amount); + + AuditLog.getInstance().log("MONEY ORDER ISSUED", sourceAccount.getAccountNumber(), amount); + } + + @Override + public void depositFunds(CheckingAccount toAccount) { + if (getIsVoided()) { + throw new RuntimeException("This money order has already been deposited or voided."); + } + + toAccount.deposit(getAmount()); + voidCheck(); + + AuditLog.getInstance().log("MONEY ORDER DEPOSIT", toAccount.getAccountNumber(), getAmount()); + } +} diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/AuditLogTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/AuditLogTest.java new file mode 100644 index 00000000..75698289 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/AuditLogTest.java @@ -0,0 +1,61 @@ +package com.codedifferently.lesson17.bank; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class AuditLogTest { + + private BankAtm bankAtm; + private CheckingAccount sourceAccount; + private CheckingAccount targetAccount; + + @BeforeEach + void setUp() { + AuditLog.getInstance().clear(); + + bankAtm = new BankAtm(); + + Customer alice = new Customer(UUID.randomUUID(), "Alice"); + Customer bob = new Customer(UUID.randomUUID(), "Bob"); + + Set owners1 = Set.of(alice); + Set owners2 = Set.of(bob); + + sourceAccount = new CheckingAccount("SRC123", owners1, 1000.0); + targetAccount = new CheckingAccount("TRG456", owners2, 500.0); + + bankAtm.addAccount(sourceAccount); + bankAtm.addAccount(targetAccount); + } + + @Test + void testAuditLogRecordsStandardDeposit() { + bankAtm.depositFunds(targetAccount.getAccountNumber(), 500.0); + + List entries = AuditLog.getInstance().getEntries(); + assertTrue(entries.stream().anyMatch(e -> e.contains("DEPOSIT") && e.contains("TRG456"))); + } + + @Test + void testAuditLogRecordsStandardWithdrawal() { + bankAtm.depositFunds(targetAccount.getAccountNumber(), 200.0); + bankAtm.withdrawFunds(targetAccount.getAccountNumber(), 100.0); + + List entries = AuditLog.getInstance().getEntries(); + assertTrue(entries.stream().anyMatch(e -> e.contains("WITHDRAWAL") && e.contains("TRG456"))); + } + + @Test + void testAuditLogRecordsCheckDeposit() { + Check check = new Check("CHK123", 100.0, sourceAccount); + bankAtm.depositFunds(targetAccount.getAccountNumber(), check); + + List entries = AuditLog.getInstance().getEntries(); + assertTrue(entries.stream().anyMatch(e -> e.contains("CHECK DEPOSIT"))); + } +} diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java index fa4a913a..bde714a4 100644 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java @@ -17,10 +17,13 @@ class BankAtmTest { private CheckingAccount account2; private Customer customer1; private Customer customer2; + private BankAtm BankAtm; @BeforeEach void setUp() { classUnderTest = new BankAtm(); + new BankAtm(); + customer1 = new Customer(UUID.randomUUID(), "John Doe"); customer2 = new Customer(UUID.randomUUID(), "Jane Smith"); account1 = new CheckingAccount("123456789", Set.of(customer1), 100.0); @@ -28,6 +31,7 @@ void setUp() { customer1.addAccount(account1); customer1.addAccount(account2); customer2.addAccount(account2); + classUnderTest.addAccount(account1); classUnderTest.addAccount(account2); } @@ -58,10 +62,8 @@ void testFindAccountsByCustomerId() { @Test void testDepositFunds() { - // Act classUnderTest.depositFunds(account1.getAccountNumber(), 50.0); - // Assert assertThat(account1.getBalance()).isEqualTo(150.0); } diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/MoneyOrderTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/MoneyOrderTest.java new file mode 100644 index 00000000..772af3d9 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/MoneyOrderTest.java @@ -0,0 +1,51 @@ +package com.codedifferently.lesson17.bank; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class MoneyOrderTest { + + private CheckingAccount sourceAccount; + private CheckingAccount targetAccount; + + @BeforeEach + void setUp() { + Customer alice = new Customer(UUID.randomUUID(), "Alice"); + Customer bob = new Customer(UUID.randomUUID(), "Bob"); + + sourceAccount = new CheckingAccount("SRC123", Set.of(alice), 0.0); + targetAccount = new CheckingAccount("TRG456", Set.of(bob), 0.0); + + sourceAccount.deposit(1000.0); + } + + @Test + void testMoneyOrderWithdrawsImmediatelyFromSource() { + double initialBalance = sourceAccount.getBalance(); + double amount = 250.0; + + MoneyOrder moneyOrder = new MoneyOrder(sourceAccount, amount); + + assertEquals(initialBalance - amount, sourceAccount.getBalance(), 0.001); + } + + @Test + void testMoneyOrderCanBeDepositedToAnotherAccount() { + double amount = 300.0; + + MoneyOrder moneyOrder = new MoneyOrder(sourceAccount, amount); + moneyOrder.depositFunds(targetAccount); + + assertEquals(amount, targetAccount.getBalance(), 0.001); + } + + @Test + void testMoneyOrderAmountIsCorrect() { + MoneyOrder moneyOrder = new MoneyOrder(sourceAccount, 123.45); + assertEquals(123.45, moneyOrder.getAmount(), 0.001); + } +}