Skip to content

Commit 232df72

Browse files
implemented moneyorder and auditlog
1 parent 61847f3 commit 232df72

File tree

7 files changed

+194
-2
lines changed

7 files changed

+194
-2
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
public class AuditLog {
8+
9+
private static final AuditLog INSTANCE = new AuditLog();
10+
11+
private final List<String> entries;
12+
13+
private AuditLog() {
14+
this.entries = new ArrayList<>();
15+
}
16+
17+
public static AuditLog getInstance() {
18+
return INSTANCE;
19+
}
20+
21+
public void log(String type, String accountNumber, double amount) {
22+
String entry = String.format("%s - Account: %s, Amount: %.2f", type, accountNumber, amount);
23+
entries.add(entry);
24+
}
25+
26+
public List<String> getEntries() {
27+
return Collections.unmodifiableList(entries);
28+
}
29+
30+
public void clear() {
31+
entries.clear();
32+
}
33+
}

lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/BankAtm.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class BankAtm {
1111

1212
private final Map<UUID, Customer> customerById = new HashMap<>();
1313
private final Map<String, CheckingAccount> accountByNumber = new HashMap<>();
14+
private Map<UUID, CheckingAccount> accounts;
1415

1516
/**
1617
* Adds a checking account to the bank.
@@ -48,6 +49,7 @@ public Set<CheckingAccount> findAccountsByCustomerId(UUID customerId) {
4849
public void depositFunds(String accountNumber, double amount) {
4950
CheckingAccount account = getAccountOrThrow(accountNumber);
5051
account.deposit(amount);
52+
AuditLog.getInstance().log("DEPOSIT", account.getAccountNumber(), amount);
5153
}
5254

5355
/**
@@ -59,6 +61,13 @@ public void depositFunds(String accountNumber, double amount) {
5961
public void depositFunds(String accountNumber, Check check) {
6062
CheckingAccount account = getAccountOrThrow(accountNumber);
6163
check.depositFunds(account);
64+
AuditLog.getInstance().log("CHECK DEPOSIT", account.getAccountNumber(), check.getAmount());
65+
}
66+
67+
public void depositFunds(String accountNumber, MoneyOrder mo) {
68+
CheckingAccount toAccount = (CheckingAccount) accounts.get(accountNumber); // ✅ must not be null
69+
mo.depositFunds(toAccount);
70+
AuditLog.getInstance().log("MONEY ORDER DEPOSIT", toAccount.getAccountNumber(), mo.getAmount());
6271
}
6372

6473
/**
@@ -70,6 +79,7 @@ public void depositFunds(String accountNumber, Check check) {
7079
public void withdrawFunds(String accountNumber, double amount) {
7180
CheckingAccount account = getAccountOrThrow(accountNumber);
7281
account.withdraw(amount);
82+
AuditLog.getInstance().log("WITHDRAWAL", account.getAccountNumber(), amount);
7383
}
7484

7585
/**
@@ -85,4 +95,9 @@ private CheckingAccount getAccountOrThrow(String accountNumber) {
8595
}
8696
return account;
8797
}
98+
99+
public BankAtm getBank() {
100+
// TODO Auto-generated method stub
101+
throw new UnsupportedOperationException("Unimplemented method 'getBank'");
102+
}
88103
}

lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Check.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ public void depositFunds(CheckingAccount toAccount) {
5454
voidCheck();
5555
}
5656

57+
public double getAmount() {
58+
return amount;
59+
}
60+
5761
@Override
5862
public int hashCode() {
5963
return checkNumber.hashCode();
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import java.util.UUID;
4+
5+
public class MoneyOrder extends Check {
6+
7+
public MoneyOrder(CheckingAccount sourceAccount, double amount) {
8+
super("MO-" + UUID.randomUUID(), amount, sourceAccount);
9+
10+
sourceAccount.withdraw(amount);
11+
12+
AuditLog.getInstance().log("MONEY ORDER ISSUED", sourceAccount.getAccountNumber(), amount);
13+
}
14+
15+
@Override
16+
public void depositFunds(CheckingAccount toAccount) {
17+
if (getIsVoided()) {
18+
throw new RuntimeException("This money order has already been deposited or voided.");
19+
}
20+
21+
toAccount.deposit(getAmount());
22+
voidCheck();
23+
24+
AuditLog.getInstance().log("MONEY ORDER DEPOSIT", toAccount.getAccountNumber(), getAmount());
25+
}
26+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
5+
import java.util.List;
6+
import java.util.Set;
7+
import java.util.UUID;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
11+
class AuditLogTest {
12+
13+
private BankAtm bankAtm;
14+
private CheckingAccount sourceAccount;
15+
private CheckingAccount targetAccount;
16+
17+
@BeforeEach
18+
void setUp() {
19+
AuditLog.getInstance().clear();
20+
21+
bankAtm = new BankAtm();
22+
23+
Customer alice = new Customer(UUID.randomUUID(), "Alice");
24+
Customer bob = new Customer(UUID.randomUUID(), "Bob");
25+
26+
Set<Customer> owners1 = Set.of(alice);
27+
Set<Customer> owners2 = Set.of(bob);
28+
29+
sourceAccount = new CheckingAccount("SRC123", owners1, 1000.0);
30+
targetAccount = new CheckingAccount("TRG456", owners2, 500.0);
31+
32+
bankAtm.addAccount(sourceAccount);
33+
bankAtm.addAccount(targetAccount);
34+
}
35+
36+
@Test
37+
void testAuditLogRecordsStandardDeposit() {
38+
bankAtm.depositFunds(targetAccount.getAccountNumber(), 500.0);
39+
40+
List<String> entries = AuditLog.getInstance().getEntries();
41+
assertTrue(entries.stream().anyMatch(e -> e.contains("DEPOSIT") && e.contains("TRG456")));
42+
}
43+
44+
@Test
45+
void testAuditLogRecordsStandardWithdrawal() {
46+
bankAtm.depositFunds(targetAccount.getAccountNumber(), 200.0);
47+
bankAtm.withdrawFunds(targetAccount.getAccountNumber(), 100.0);
48+
49+
List<String> entries = AuditLog.getInstance().getEntries();
50+
assertTrue(entries.stream().anyMatch(e -> e.contains("WITHDRAWAL") && e.contains("TRG456")));
51+
}
52+
53+
@Test
54+
void testAuditLogRecordsCheckDeposit() {
55+
Check check = new Check("CHK123", 100.0, sourceAccount);
56+
bankAtm.depositFunds(targetAccount.getAccountNumber(), check);
57+
58+
List<String> entries = AuditLog.getInstance().getEntries();
59+
assertTrue(entries.stream().anyMatch(e -> e.contains("CHECK DEPOSIT")));
60+
}
61+
}

lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/BankAtmTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,21 @@ class BankAtmTest {
1717
private CheckingAccount account2;
1818
private Customer customer1;
1919
private Customer customer2;
20+
private BankAtm BankAtm;
2021

2122
@BeforeEach
2223
void setUp() {
2324
classUnderTest = new BankAtm();
25+
new BankAtm();
26+
2427
customer1 = new Customer(UUID.randomUUID(), "John Doe");
2528
customer2 = new Customer(UUID.randomUUID(), "Jane Smith");
2629
account1 = new CheckingAccount("123456789", Set.of(customer1), 100.0);
2730
account2 = new CheckingAccount("987654321", Set.of(customer1, customer2), 200.0);
2831
customer1.addAccount(account1);
2932
customer1.addAccount(account2);
3033
customer2.addAccount(account2);
34+
3135
classUnderTest.addAccount(account1);
3236
classUnderTest.addAccount(account2);
3337
}
@@ -58,10 +62,8 @@ void testFindAccountsByCustomerId() {
5862

5963
@Test
6064
void testDepositFunds() {
61-
// Act
6265
classUnderTest.depositFunds(account1.getAccountNumber(), 50.0);
6366

64-
// Assert
6567
assertThat(account1.getBalance()).isEqualTo(150.0);
6668
}
6769

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.Set;
6+
import java.util.UUID;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
class MoneyOrderTest {
11+
12+
private CheckingAccount sourceAccount;
13+
private CheckingAccount targetAccount;
14+
15+
@BeforeEach
16+
void setUp() {
17+
Customer alice = new Customer(UUID.randomUUID(), "Alice");
18+
Customer bob = new Customer(UUID.randomUUID(), "Bob");
19+
20+
sourceAccount = new CheckingAccount("SRC123", Set.of(alice), 0.0);
21+
targetAccount = new CheckingAccount("TRG456", Set.of(bob), 0.0);
22+
23+
sourceAccount.deposit(1000.0);
24+
}
25+
26+
@Test
27+
void testMoneyOrderWithdrawsImmediatelyFromSource() {
28+
double initialBalance = sourceAccount.getBalance();
29+
double amount = 250.0;
30+
31+
MoneyOrder moneyOrder = new MoneyOrder(sourceAccount, amount);
32+
33+
assertEquals(initialBalance - amount, sourceAccount.getBalance(), 0.001);
34+
}
35+
36+
@Test
37+
void testMoneyOrderCanBeDepositedToAnotherAccount() {
38+
double amount = 300.0;
39+
40+
MoneyOrder moneyOrder = new MoneyOrder(sourceAccount, amount);
41+
moneyOrder.depositFunds(targetAccount);
42+
43+
assertEquals(amount, targetAccount.getBalance(), 0.001);
44+
}
45+
46+
@Test
47+
void testMoneyOrderAmountIsCorrect() {
48+
MoneyOrder moneyOrder = new MoneyOrder(sourceAccount, 123.45);
49+
assertEquals(123.45, moneyOrder.getAmount(), 0.001);
50+
}
51+
}

0 commit comments

Comments
 (0)