Skip to content

feat: adds new davidsmith banking updates for lesson 17 #634

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.codedifferently.lesson17.bank;

import com.codedifferently.lesson17.bank.exceptions.MoneyOrderVoidedException;

/** Represents a moneyorder. */
public class MoneyOrder {

private final String moneyOrderNumber;
private final double amount;
private final CheckingAccount account;
private boolean isVoided = false;

/**
* Creates a new moneyorder.
*
* @param moneyOrderNumber The moneyorder number.
* @param amount The amount of the moneyorder.
* @param account The account the moneyorder is drawn on.
*/
public MoneyOrder(String moneyOrderNumber, double amount, CheckingAccount account) {
if (amount < 0) {
throw new IllegalArgumentException("MoneyOrder amount must be positive");
}
account.withdraw(amount);
this.moneyOrderNumber = moneyOrderNumber;
this.amount = amount;
this.account = account;
}

/**
* Gets the moneyorder number.
*
* @return The moneyorder number
*/
public String getMoneyOrderNumber() {
return moneyOrderNumber;
}

/**
* Gets the amount given for the moneyorder.
*
* @return The amount.
*/
public double getAmount() {
return amount;
}

/**
* Gets the account from the moneyordering account.
*
* @return The account in this instance.
*/
public CheckingAccount getAccount() {
return account;
}

/**
* Gets the voided status of the moneyorder.
*
* @return True if the moneyorder is voided, and false otherwise.
*/
public boolean getIsVoided() {
return isVoided;
}

/** Voids the moneyorder. */
public void voidMoneyOrder() {
isVoided = true;
}

/**
* Deposits the moneyorder into an account.
*
* @param toAccount The account to deposit the moneyorder into.
*/
public void depositFunds(CheckingAccount toAccount) {
if (isVoided) {
throw new MoneyOrderVoidedException("MoneyOrder is voided");
}
account.withdraw(amount);
toAccount.deposit(amount);
voidMoneyOrder();
}

@Override
public int hashCode() {
return moneyOrderNumber.hashCode();
}

@Override
public boolean equals(Object obj) {
if (obj instanceof MoneyOrder other) {
return moneyOrderNumber.equals(other.moneyOrderNumber);
}
return false;
}

@Override
public String toString() {
return "MoneyOrder{"
+ "moneyOrderNumber='"
+ moneyOrderNumber
+ '\''
+ ", amount="
+ amount
+ ", account="
+ account.getAccountNumber()
+ '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.codedifferently.lesson17.bank;

import java.util.Set;

public class SavingsAccount extends CheckingAccount {
public SavingsAccount(String accountNumber, Set<Customer> owners, double initialBalance) {
super(accountNumber, owners, initialBalance);
}

@Override
public int hashCode() {
return getAccountNumber().hashCode();
}

@Override
public boolean equals(Object obj) {
if (obj instanceof SavingsAccount other) {
return this.getAccountNumber().equals(other.getAccountNumber());
}
return false;
}

@Override
public String toString() {
return "SavingsAccount{"
+ "accountNumber='"
+ getAccountNumber()
+ '\''
+ ", balance="
+ getBalance()
+ ", isActive="
+ getStatus()
+ '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.codedifferently.lesson17.bank.exceptions;

public class MoneyOrderVoidedException extends RuntimeException {

public MoneyOrderVoidedException() {}

public MoneyOrderVoidedException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.codedifferently.lesson17.bank;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;

import com.codedifferently.lesson17.bank.exceptions.MoneyOrderVoidedException;
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(0.0);
assertThat(account2.getBalance()).isEqualTo(250.0);
}

@Test
void testDepositFunds_MoneyOrderVoided() {
// Arrange
classUnderTest.voidMoneyOrder();

// Act & Assert
assertThatExceptionOfType(MoneyOrderVoidedException.class)
.isThrownBy(() -> classUnderTest.depositFunds(account2))
.withMessage("MoneyOrder is voided");
}

@Test
void testConstructor_CantCreateMoneyOrderWithNegativeAmount() {
// Act & Assert
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> new MoneyOrder("123456789", -50.0, account1))
.withMessage("MoneyOrder amount must be positive");
}

@Test
void testHashCode() {
// Arrange
MoneyOrder otherMoneyOrder = new MoneyOrder("123456789", 50.0, account1);

// Assert
assertThat(classUnderTest.hashCode()).isEqualTo(otherMoneyOrder.hashCode());
}

@Test
void testEquals() {
// Arrange
MoneyOrder otherMoneyOrder = new MoneyOrder("123456789", 50.0, account1);
MoneyOrder differentMoneyOrder = new MoneyOrder("987654321", 100.0, account2);

// Assert
assertThat(classUnderTest.equals(otherMoneyOrder)).isTrue();
assertThat(classUnderTest.equals(differentMoneyOrder)).isFalse();
}

@Test
void testToString() {
// Assert
assertThat(classUnderTest.toString())
.isEqualTo("MoneyOrder{moneyOrderNumber='123456789', amount=50.0, account=123456789}");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
ackage com.codedifferently.lesson17.bank;

import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class SavingsAccountTest {

private SavingsAccount classUnderTest;
private Set<Customer> owners;

@BeforeEach
void setUp() {
owners = new HashSet<>();
owners.add(new Customer(UUID.randomUUID(), "John Doe"));
owners.add(new Customer(UUID.randomUUID(), "Jane Smith"));
classUnderTest = new SavingsAccount("123456789", owners, 100.0);
}

@Test
void getAccountNumber() {
assertEquals("123456789", classUnderTest.getAccountNumber());
}

@Test
void getOwners() {
assertEquals(owners, classUnderTest.getOwners());
}

@Test
void deposit() {
classUnderTest.deposit(50.0);
assertEquals(150.0, classUnderTest.getBalance());
}

@Test
void deposit_withNegativeAmount() {
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> classUnderTest.deposit(-50.0));
}

@Test
void withdraw() {
classUnderTest.withdraw(50.0);
assertEquals(50.0, classUnderTest.getBalance());
}

@Test
void withdraw_withNegativeAmount() {
assertThatExceptionOfType(IllegalStateException.class)
.isThrownBy(() -> classUnderTest.withdraw(-50.0))
.withMessage("Withdrawal amount must be positive");
}

@Test
void withdraw_withInsufficientBalance() {
assertThatExceptionOfType(InsufficientFundsException.class)
.isThrownBy(() -> classUnderTest.withdraw(150.0))
.withMessage("Account does not have enough funds for withdrawal");
}

@Test
void getBalance() {
assertEquals(100.0, classUnderTest.getBalance());
}

@Test
void closeAccount_withPositiveBalance() {
assertThatExceptionOfType(IllegalStateException.class)
.isThrownBy(() -> classUnderTest.closeAccount());
}

@Test
void isClosed() {
assertFalse(classUnderTest.isClosed());
classUnderTest.withdraw(100);
classUnderTest.closeAccount();
assertTrue(classUnderTest.isClosed());
}

@Test
void equals() {
SavingsAccount otherAccount = new SavingsAccount("123456789", owners, 200.0);
assertEquals(classUnderTest, otherAccount);
}

@Test
void hashCodeTest() {
SavingsAccount otherAccount = new SavingsAccount("123456789", owners, 200.0);
assertEquals(classUnderTest.hashCode(), otherAccount.hashCode());
}

@Test
void toStringTest() {
String expected = "SavingsAccount{accountNumber='123456789', balance=100.0, isActive=true}";
assertEquals(expected, classUnderTest.toString());
}
}
Loading