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 8cbcd3cc0..cb711c92d 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 @@ -33,7 +33,7 @@ public void addAccount(CheckingAccount account) { * @param customerId The ID of the customer. * @return The unique set of accounts owned by the customer. */ - public Set findAccountsByCustomerId(UUID customerId) { + public Set findAccountsByCustomerId(UUID customerId, UUID businessId) { return customerById.containsKey(customerId) ? customerById.get(customerId).getAccounts() : Set.of(); 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 061fa4a5c..52522c1b8 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 @@ -1,6 +1,7 @@ package com.codedifferently.lesson17.bank; import com.codedifferently.lesson17.bank.exceptions.CheckVoidedException; +import com.codedifferently.lesson17.bank.exceptions.SavingsAccount; /** Represents a check. */ public class Check { @@ -21,6 +22,9 @@ public Check(String checkNumber, double amount, CheckingAccount account) { if (amount < 0) { throw new IllegalArgumentException("Check amount must be positive"); } + if (account instanceof SavingsAccount) { + throw new UnsupportedOperationException("Cannot issue checks from a savings account."); + } this.checkNumber = checkNumber; this.amount = amount; this.account = account; @@ -47,7 +51,7 @@ public void voidCheck() { */ public void depositFunds(CheckingAccount toAccount) { if (isVoided) { - throw new CheckVoidedException("Check is voided"); + throw new CheckVoidedException("MoneyOrder is voided"); } account.withdraw(amount); toAccount.deposit(amount); diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java index 5d8aeb74d..ae6490adf 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/CheckingAccount.java @@ -9,7 +9,7 @@ public class CheckingAccount { private final Set owners; private final String accountNumber; private double balance; - private boolean isActive; + public boolean isActive; /** * Creates a new checking account. diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java index af0847134..311161917 100644 --- a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/Customer.java @@ -7,6 +7,10 @@ /** Represents a customer of the bank. */ public class Customer { + public static boolean isBusiness(T t) { + throw new UnsupportedOperationException("Not supported yet."); + } + private final UUID id; private final String name; private final Set accounts = new HashSet<>(); @@ -16,8 +20,9 @@ public class Customer { * * @param id The ID of the customer. * @param name The name of the customer. + * @param b */ - public Customer(UUID id, String name) { + public Customer(UUID id, String name, boolean b) { this.id = id; this.name = name; } @@ -58,6 +63,10 @@ public Set getAccounts() { return accounts; } + public boolean isBusiness() { + return false; + } + @Override public int hashCode() { return id.hashCode(); @@ -75,4 +84,8 @@ public boolean equals(Object obj) { public String toString() { return "Customer{" + "id=" + id + ", name='" + name + '\'' + '}'; } + + public static String getEmail() { + return Customer.getEmail(); + } } diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/AuditLog.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/AuditLog.java new file mode 100644 index 000000000..ba41b72f8 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/AuditLog.java @@ -0,0 +1,8 @@ +package com.codedifferently.lesson17.bank.exceptions; + +import java.util.ArrayList; +import java.util.List; + +public class AuditLog { + private final List logEntries = new ArrayList<>(); +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/BusinessAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/BusinessAccount.java new file mode 100644 index 000000000..322beb0c6 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/BusinessAccount.java @@ -0,0 +1,37 @@ +package com.codedifferently.lesson17.bank.exceptions; + +import com.codedifferently.lesson17.bank.CheckingAccount; +import com.codedifferently.lesson17.bank.Customer; +import java.util.Set; + +public class BusinessAccount { + public class BusinessCheckingAccount extends CheckingAccount { + public BusinessCheckingAccount(String accountNumber, Set owners, double balance) { + super(accountNumber, owners, balance); + if (!hasBusinessOwner(owners)) { + throw new IllegalArgumentException("requires at least one business owner."); + } + } + + private boolean hasBusinessOwner(Set owners) { + return owners.stream() + .anyMatch( + owner -> { + return ((Customer) owners).getEmail().contains("business"); + }); + } + + @Override + public String toString() { + return "BusinessCheckingAccount{" + + "accountNumber='" + + getAccountNumber() + + '\'' + + ", balance=" + + getBalance() + + ", isActive=" + + isActive + + '}'; + } + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/IllegalArgumentException.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/IllegalArgumentException.java new file mode 100644 index 000000000..6da2de124 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/IllegalArgumentException.java @@ -0,0 +1,9 @@ +package com.codedifferently.lesson17.bank.exceptions; + +public class IllegalArgumentException extends RuntimeException { + public IllegalArgumentException() {} + + public IllegalArgumentException(String message) { + super(message); + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/MoneyOrder.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/MoneyOrder.java new file mode 100644 index 000000000..4cd769aff --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/MoneyOrder.java @@ -0,0 +1,79 @@ +package com.codedifferently.lesson17.bank.exceptions; + +import com.codedifferently.lesson17.bank.Check; + +public class MoneyOrder extends Check { + + public MoneyOrder( + String checkNumber, + double amount, + com.codedifferently.lesson17.bank.CheckingAccount account) { + super(checkNumber, amount, account); + if (amount < 0) { + throw new IllegalArgumentException("MoneyOrder amount must be positive"); + } + account.withdraw(amount); + } + + /** + * Deposits the check into an account. + * + * @param toAccount The account to deposit the check into. + */ + public void depositFunds(CheckingAccount toAccount) { + if (getIsVoided()) { + throw new UnsupportedOperationException("MoneyOrder is voided"); + } + toAccount.withdraw(getAmount()); + ((CheckingAccount) getAccount()).withdraw(getAmount()); + ((CheckingAccount) toAccount).deposit(getAmount()); + voidCheck(); + } + + public class CheckingAccount { + private String accountNumber; + + public CheckingAccount(String accountNumber) { + this.accountNumber = accountNumber; + } + + private void withdraw(double amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'withdraw'"); + } + + private void deposit(double amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'deposit'"); + } + + public String getAccountNumber() { + return this.accountNumber; + } + } + + @Override + public String toString() { + return "MoneyOrder{" + + "checkNumber='" + + getCheckNumber() + + '\'' + + ", amount=" + + getAmount() + + ", account=" + + ((CheckingAccount) getAccount()).getAccountNumber() + + '}'; + } + + private double getAmount() { + throw new UnsupportedOperationException("Not supported yet."); + } + + private Object getAccount() { + throw new UnsupportedOperationException("Not supported yet."); + } + + private String getCheckNumber() { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccount.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccount.java new file mode 100644 index 000000000..063cb5004 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccount.java @@ -0,0 +1,58 @@ +package com.codedifferently.lesson17.bank.exceptions; + +import com.codedifferently.lesson17.bank.CheckingAccount; +import com.codedifferently.lesson17.bank.Customer; +import java.util.Set; + +public class SavingsAccount extends CheckingAccount { + + // Constructor for SavingsAccount + public SavingsAccount(String accountNumber, Set owners, double initialBalance) { + super(accountNumber, owners, initialBalance); + } + + // Define the NullCheck class that blocks a check from being withdrawn + public class NullCheck { + + private boolean isVoided; + private String checkNumber; + private double amount; + private String account; + + public void blockCheckWithdrawal( + double amount, String account, String checkNumber, boolean isVoided) { + this.isVoided = isVoided; + this.checkNumber = checkNumber; + this.amount = amount; + this.account = account; + + // Example logic for blocking check withdrawal + if (isVoided) { + // Simulate a system that logs or handles the voided check + System.out.println("Check " + checkNumber + " for account " + account + " is voided."); + } else { + // Process the withdrawal logic (not implemented here) + System.out.println("Withdrawal blocked for check " + checkNumber); + } + + if (this.amount > 0) {} + } + + // Getters for properties + public boolean getisVoided() { + return isVoided; + } + + public String getCheckNumber() { + return checkNumber; + } + + public double getAmount() { + return amount; + } + + public String getAccount() { + return account; + } + } +} diff --git a/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/VoidedSavingsCheckException.java b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/VoidedSavingsCheckException.java new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lesson_17/bank/bank_app/src/main/java/com/codedifferently/lesson17/bank/exceptions/VoidedSavingsCheckException.java @@ -0,0 +1 @@ + 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 fa4a913a2..642be06d3 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 @@ -15,16 +15,20 @@ class BankAtmTest { private BankAtm classUnderTest; private CheckingAccount account1; private CheckingAccount account2; + private CheckingAccount account3; private Customer customer1; private Customer customer2; + private Customer customer3; @BeforeEach void setUp() { classUnderTest = new BankAtm(); - customer1 = new Customer(UUID.randomUUID(), "John Doe"); - customer2 = new Customer(UUID.randomUUID(), "Jane Smith"); + customer1 = new Customer(UUID.randomUUID(), "John Doe", false); + customer2 = new Customer(UUID.randomUUID(), "Jane Smith", false); + customer3 = new Customer(UUID.randomUUID(), "Jane Smith's Business", true); account1 = new CheckingAccount("123456789", Set.of(customer1), 100.0); account2 = new CheckingAccount("987654321", Set.of(customer1, customer2), 200.0); + account3 = new CheckingAccount("123456777", Set.of(customer2), 40000); customer1.addAccount(account1); customer1.addAccount(account2); customer2.addAccount(account2); @@ -35,7 +39,7 @@ void setUp() { @Test void testAddAccount() { // Arrange - Customer customer3 = new Customer(UUID.randomUUID(), "Alice Johnson"); + Customer customer3 = new Customer(UUID.randomUUID(), "Alice Johnson", false); CheckingAccount account3 = new CheckingAccount("555555555", Set.of(customer3), 300.0); customer3.addAccount(account3); @@ -43,14 +47,16 @@ void testAddAccount() { classUnderTest.addAccount(account3); // Assert - Set accounts = classUnderTest.findAccountsByCustomerId(customer3.getId()); + Set accounts = + classUnderTest.findAccountsByCustomerId(customer3.getId(), null); assertThat(accounts).containsOnly(account3); } @Test void testFindAccountsByCustomerId() { // Act - Set accounts = classUnderTest.findAccountsByCustomerId(customer1.getId()); + Set accounts = + classUnderTest.findAccountsByCustomerId(customer1.getId(), null); // Assert assertThat(accounts).containsOnly(account1, account2); @@ -86,7 +92,7 @@ void testDepositFunds_DoesntDepositCheckTwice() { assertThatExceptionOfType(CheckVoidedException.class) .isThrownBy(() -> classUnderTest.depositFunds("987654321", check)) - .withMessage("Check is voided"); + .withMessage("MoneyOrder is voided"); } @Test diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/CheckingAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/CheckingAccountTest.java index f155d8e5b..2ca05f63c 100644 --- a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/CheckingAccountTest.java +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/CheckingAccountTest.java @@ -20,8 +20,8 @@ class CheckingAccountTest { @BeforeEach void setUp() { owners = new HashSet<>(); - owners.add(new Customer(UUID.randomUUID(), "John Doe")); - owners.add(new Customer(UUID.randomUUID(), "Jane Smith")); + owners.add(new Customer(UUID.randomUUID(), "John Doe", false)); + owners.add(new Customer(UUID.randomUUID(), "Jane Smith", false)); classUnderTest = new CheckingAccount("123456789", owners, 100.0); } diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/MoneyOrderTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/MoneyOrderTest.java new file mode 100644 index 000000000..e8eec1fea --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/MoneyOrderTest.java @@ -0,0 +1,79 @@ +package com.codedifferently.lesson17.bank.exceptions; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import com.codedifferently.lesson17.bank.Check; +import com.codedifferently.lesson17.bank.CheckingAccount; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class MoneyOrderTest { + + private CheckingAccount account1; + private CheckingAccount account2; + private MoneyOrder classUnderTest; + + @BeforeEach + void setUp() { + account1 = new CheckingAccount("123456789", null, 100.0); + account2 = new CheckingAccount("987654321", null, 200.0); + classUnderTest = new MoneyOrder("123456789", 50.0, account1); + } + + @Test + void testDepositFunds() { + // Act + classUnderTest.depositFunds(account2); + + // Assert + assertThat(account1.getBalance()).isEqualTo(50.0); + assertThat(account2.getBalance()).isEqualTo(250.0); + } + + @Test + void testDepositFunds_CheckVoided() { + // Arrange + classUnderTest.voidCheck(); + + // Act & Assert + assertThatExceptionOfType(CheckVoidedException.class) + .isThrownBy(() -> classUnderTest.depositFunds(account1)) + .withMessage("MoneyOrder is voided"); + assertThatExceptionOfType(CheckVoidedException.class) + .isThrownBy(() -> classUnderTest.depositFunds(account2)) + .withMessage("MoneyOrder is voided"); + } + + @Test + void testHashCode() { + // Arrange + MoneyOrder otherCheck = new MoneyOrder("123456789", 50.0, account1); + + // Assert + assertThat(classUnderTest.hashCode()).isEqualTo(otherCheck.hashCode()); + } + + @Test + void testEquals() { + // Arrange + Check otherCheck = new MoneyOrder("123456789", 25.0, account1); + Check differentCheck = new MoneyOrder("987654321", 25.0, account1); + + // Assert + assertThat(classUnderTest.equals(otherCheck)).isTrue(); + assertThat(classUnderTest.equals(differentCheck)).isFalse(); + } + + @Test + void testToString() { + // Arrange + CheckingAccount account = new CheckingAccount("123456789", null, 50.0); + MoneyOrder classUnderTest = new MoneyOrder("123456789", 50.0, account); + // Act + String result = classUnderTest.toString(); + // Assert + assertThat(classUnderTest.toString()) + .isEqualTo("MoneyOrder{checkNumber='123456789', amount=50.0, account=123456789}"); + } +} diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccountTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccountTest.java new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccountTest.java @@ -0,0 +1 @@ + diff --git a/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccount_NullCheckTest.java b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccount_NullCheckTest.java new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lesson_17/bank/bank_app/src/test/java/com/codedifferently/lesson17/bank/exceptions/SavingsAccount_NullCheckTest.java @@ -0,0 +1 @@ +