Skip to content

Commit f34d36c

Browse files
committed
feat: adds new davidsmith banking updates for lesson 17
1 parent 03d2a45 commit f34d36c

File tree

5 files changed

+337
-0
lines changed

5 files changed

+337
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import com.codedifferently.lesson17.bank.exceptions.MoneyOrderVoidedException;
4+
5+
/** Represents a moneyorder. */
6+
public class MoneyOrder {
7+
8+
private final String moneyOrderNumber;
9+
private final double amount;
10+
private final CheckingAccount account;
11+
private boolean isVoided = false;
12+
13+
/**
14+
* Creates a new moneyorder.
15+
*
16+
* @param moneyOrderNumber The moneyorder number.
17+
* @param amount The amount of the moneyorder.
18+
* @param account The account the moneyorder is drawn on.
19+
*/
20+
public MoneyOrder(String moneyOrderNumber, double amount, CheckingAccount account) {
21+
if (amount < 0) {
22+
throw new IllegalArgumentException("MoneyOrder amount must be positive");
23+
}
24+
account.withdraw(amount);
25+
this.moneyOrderNumber = moneyOrderNumber;
26+
this.amount = amount;
27+
this.account = account;
28+
}
29+
30+
/**
31+
* Gets the moneyorder number.
32+
*
33+
* @return The moneyorder number
34+
*/
35+
public String getMoneyOrderNumber() {
36+
return moneyOrderNumber;
37+
}
38+
39+
/**
40+
* Gets the amount given for the moneyorder.
41+
*
42+
* @return The amount.
43+
*/
44+
public double getAmount() {
45+
return amount;
46+
}
47+
48+
/**
49+
* Gets the account from the moneyordering account.
50+
*
51+
* @return The account in this instance.
52+
*/
53+
public CheckingAccount getAccount() {
54+
return account;
55+
}
56+
57+
/**
58+
* Gets the voided status of the moneyorder.
59+
*
60+
* @return True if the moneyorder is voided, and false otherwise.
61+
*/
62+
public boolean getIsVoided() {
63+
return isVoided;
64+
}
65+
66+
/** Voids the moneyorder. */
67+
public void voidMoneyOrder() {
68+
isVoided = true;
69+
}
70+
71+
/**
72+
* Deposits the moneyorder into an account.
73+
*
74+
* @param toAccount The account to deposit the moneyorder into.
75+
*/
76+
public void depositFunds(CheckingAccount toAccount) {
77+
if (isVoided) {
78+
throw new MoneyOrderVoidedException("MoneyOrder is voided");
79+
}
80+
account.withdraw(amount);
81+
toAccount.deposit(amount);
82+
voidMoneyOrder();
83+
}
84+
85+
@Override
86+
public int hashCode() {
87+
return moneyOrderNumber.hashCode();
88+
}
89+
90+
@Override
91+
public boolean equals(Object obj) {
92+
if (obj instanceof MoneyOrder other) {
93+
return moneyOrderNumber.equals(other.moneyOrderNumber);
94+
}
95+
return false;
96+
}
97+
98+
@Override
99+
public String toString() {
100+
return "MoneyOrder{"
101+
+ "moneyOrderNumber='"
102+
+ moneyOrderNumber
103+
+ '\''
104+
+ ", amount="
105+
+ amount
106+
+ ", account="
107+
+ account.getAccountNumber()
108+
+ '}';
109+
}
110+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import java.util.Set;
4+
5+
public class SavingsAccount extends CheckingAccount {
6+
public SavingsAccount(String accountNumber, Set<Customer> owners, double initialBalance) {
7+
super(accountNumber, owners, initialBalance);
8+
}
9+
10+
@Override
11+
public int hashCode() {
12+
return getAccountNumber().hashCode();
13+
}
14+
15+
@Override
16+
public boolean equals(Object obj) {
17+
if (obj instanceof SavingsAccount other) {
18+
return this.getAccountNumber().equals(other.getAccountNumber());
19+
}
20+
return false;
21+
}
22+
23+
@Override
24+
public String toString() {
25+
return "SavingsAccount{"
26+
+ "accountNumber='"
27+
+ getAccountNumber()
28+
+ '\''
29+
+ ", balance="
30+
+ getBalance()
31+
+ ", isActive="
32+
+ getStatus()
33+
+ '}';
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.codedifferently.lesson17.bank.exceptions;
2+
3+
public class MoneyOrderVoidedException extends RuntimeException {
4+
5+
public MoneyOrderVoidedException() {}
6+
7+
public MoneyOrderVoidedException(String message) {
8+
super(message);
9+
}
10+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.codedifferently.lesson17.bank;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
5+
6+
import com.codedifferently.lesson17.bank.exceptions.MoneyOrderVoidedException;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
class MoneyOrderTest {
11+
private CheckingAccount account1;
12+
private CheckingAccount account2;
13+
private MoneyOrder classUnderTest;
14+
15+
@BeforeEach
16+
void setUp() {
17+
account1 = new CheckingAccount("123456789", null, 100.0);
18+
account2 = new CheckingAccount("987654321", null, 200.0);
19+
classUnderTest = new MoneyOrder("123456789", 50.0, account1);
20+
}
21+
22+
@Test
23+
void testDepositFunds() {
24+
// Act
25+
classUnderTest.depositFunds(account2);
26+
// Assert
27+
assertThat(account1.getBalance()).isEqualTo(0.0);
28+
assertThat(account2.getBalance()).isEqualTo(250.0);
29+
}
30+
31+
@Test
32+
void testDepositFunds_MoneyOrderVoided() {
33+
// Arrange
34+
classUnderTest.voidMoneyOrder();
35+
36+
// Act & Assert
37+
assertThatExceptionOfType(MoneyOrderVoidedException.class)
38+
.isThrownBy(() -> classUnderTest.depositFunds(account2))
39+
.withMessage("MoneyOrder is voided");
40+
}
41+
42+
@Test
43+
void testConstructor_CantCreateMoneyOrderWithNegativeAmount() {
44+
// Act & Assert
45+
assertThatExceptionOfType(IllegalArgumentException.class)
46+
.isThrownBy(() -> new MoneyOrder("123456789", -50.0, account1))
47+
.withMessage("MoneyOrder amount must be positive");
48+
}
49+
50+
@Test
51+
void testHashCode() {
52+
// Arrange
53+
MoneyOrder otherMoneyOrder = new MoneyOrder("123456789", 50.0, account1);
54+
55+
// Assert
56+
assertThat(classUnderTest.hashCode()).isEqualTo(otherMoneyOrder.hashCode());
57+
}
58+
59+
@Test
60+
void testEquals() {
61+
// Arrange
62+
MoneyOrder otherMoneyOrder = new MoneyOrder("123456789", 50.0, account1);
63+
MoneyOrder differentMoneyOrder = new MoneyOrder("987654321", 100.0, account2);
64+
65+
// Assert
66+
assertThat(classUnderTest.equals(otherMoneyOrder)).isTrue();
67+
assertThat(classUnderTest.equals(differentMoneyOrder)).isFalse();
68+
}
69+
70+
@Test
71+
void testToString() {
72+
// Assert
73+
assertThat(classUnderTest.toString())
74+
.isEqualTo("MoneyOrder{moneyOrderNumber='123456789', amount=50.0, account=123456789}");
75+
}
76+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
ackage com.codedifferently.lesson17.bank;
2+
3+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.junit.jupiter.api.Assertions.assertFalse;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
import com.codedifferently.lesson17.bank.exceptions.InsufficientFundsException;
9+
import java.util.HashSet;
10+
import java.util.Set;
11+
import java.util.UUID;
12+
import org.junit.jupiter.api.BeforeEach;
13+
import org.junit.jupiter.api.Test;
14+
15+
class SavingsAccountTest {
16+
17+
private SavingsAccount classUnderTest;
18+
private Set<Customer> owners;
19+
20+
@BeforeEach
21+
void setUp() {
22+
owners = new HashSet<>();
23+
owners.add(new Customer(UUID.randomUUID(), "John Doe"));
24+
owners.add(new Customer(UUID.randomUUID(), "Jane Smith"));
25+
classUnderTest = new SavingsAccount("123456789", owners, 100.0);
26+
}
27+
28+
@Test
29+
void getAccountNumber() {
30+
assertEquals("123456789", classUnderTest.getAccountNumber());
31+
}
32+
33+
@Test
34+
void getOwners() {
35+
assertEquals(owners, classUnderTest.getOwners());
36+
}
37+
38+
@Test
39+
void deposit() {
40+
classUnderTest.deposit(50.0);
41+
assertEquals(150.0, classUnderTest.getBalance());
42+
}
43+
44+
@Test
45+
void deposit_withNegativeAmount() {
46+
assertThatExceptionOfType(IllegalArgumentException.class)
47+
.isThrownBy(() -> classUnderTest.deposit(-50.0));
48+
}
49+
50+
@Test
51+
void withdraw() {
52+
classUnderTest.withdraw(50.0);
53+
assertEquals(50.0, classUnderTest.getBalance());
54+
}
55+
56+
@Test
57+
void withdraw_withNegativeAmount() {
58+
assertThatExceptionOfType(IllegalStateException.class)
59+
.isThrownBy(() -> classUnderTest.withdraw(-50.0))
60+
.withMessage("Withdrawal amount must be positive");
61+
}
62+
63+
@Test
64+
void withdraw_withInsufficientBalance() {
65+
assertThatExceptionOfType(InsufficientFundsException.class)
66+
.isThrownBy(() -> classUnderTest.withdraw(150.0))
67+
.withMessage("Account does not have enough funds for withdrawal");
68+
}
69+
70+
@Test
71+
void getBalance() {
72+
assertEquals(100.0, classUnderTest.getBalance());
73+
}
74+
75+
@Test
76+
void closeAccount_withPositiveBalance() {
77+
assertThatExceptionOfType(IllegalStateException.class)
78+
.isThrownBy(() -> classUnderTest.closeAccount());
79+
}
80+
81+
@Test
82+
void isClosed() {
83+
assertFalse(classUnderTest.isClosed());
84+
classUnderTest.withdraw(100);
85+
classUnderTest.closeAccount();
86+
assertTrue(classUnderTest.isClosed());
87+
}
88+
89+
@Test
90+
void equals() {
91+
SavingsAccount otherAccount = new SavingsAccount("123456789", owners, 200.0);
92+
assertEquals(classUnderTest, otherAccount);
93+
}
94+
95+
@Test
96+
void hashCodeTest() {
97+
SavingsAccount otherAccount = new SavingsAccount("123456789", owners, 200.0);
98+
assertEquals(classUnderTest.hashCode(), otherAccount.hashCode());
99+
}
100+
101+
@Test
102+
void toStringTest() {
103+
String expected = "SavingsAccount{accountNumber='123456789', balance=100.0, isActive=true}";
104+
assertEquals(expected, classUnderTest.toString());
105+
}
106+
}

0 commit comments

Comments
 (0)