Skip to content

Commit 23fffc0

Browse files
committed
add additional tests and methods from L2 slides
1 parent 96cf7ee commit 23fffc0

File tree

8 files changed

+170
-11
lines changed

8 files changed

+170
-11
lines changed

Lesson2-Exercise1-Categories/solution/src/tracker.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
class ExpenseTracker:
22
def __init__(self):
33
self.expenses = []
4+
self.total = 0
45

56
def add_expense(self, amount, category=None):
7+
if amount <= 0:
8+
raise ValueError("Expense amount must be positive.")
9+
610
# The dictionary is updated to include the category
711
expense = {
812
"amount": amount,
913
"category": category
1014
}
1115
self.expenses.append(expense)
16+
self.total += amount
1217

1318
def list_expenses_by_category(self, category):
1419
# Loop over the expenses and return expenses with the appropriate category

Lesson2-Exercise1-Categories/solution/tests/test_tracker.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,53 @@
22
from src.tracker import ExpenseTracker
33

44
def test_add_expense_stores_amount():
5+
# Arrange
56
tracker = ExpenseTracker()
7+
8+
# Act
69
tracker.add_expense(50)
10+
11+
# Assert
712
assert tracker.expenses[0]['amount'] == 50
813

9-
def test_add_expense_with_category():
14+
def test_add_expense_updates_total():
15+
# Arrange
16+
tracker = ExpenseTracker()
17+
18+
# Act
19+
tracker.add_expense(10)
20+
21+
# Assert
22+
assert tracker.total == 10
23+
24+
def test_add_multiple_expenses():
25+
# Arrange
26+
tracker = ExpenseTracker()
27+
28+
# Act
29+
tracker.add_expense(10)
30+
tracker.add_expense(5)
31+
32+
# Assert
33+
assert tracker.total == 15
34+
35+
def test_add_expense_with_negative_amount_fails():
36+
# Arrange
37+
tracker = ExpenseTracker()
38+
39+
# Act and Assert
40+
with pytest.raises(ValueError):
41+
tracker.add_expense(-10)
42+
43+
def test_add_expense_can_store_category():
44+
# Arrange
1045
tracker = ExpenseTracker()
46+
47+
# Act
1148
# This call now includes the category argument
1249
tracker.add_expense(10, category="food")
50+
51+
# Assert
1352
# Asserts that the internal dictionary contains the category key
1453
assert tracker.expenses[0]['category'] == "food"
1554

Lesson2-Exercise1-Categories/starter/src/tracker.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ class ExpenseTracker:
22
def __init__(self):
33
# The tracker stores records in a list
44
self.expenses = []
5+
self.total = 0
56

67
def add_expense(self, amount):
8+
if amount <= 0:
9+
raise ValueError("Expense amount must be positive.")
710
# Current implementation only handles amount
811
expense = {"amount": amount}
912
self.expenses.append(expense)
13+
self.total += amount

Lesson2-Exercise1-Categories/starter/tests/test_tracker.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,44 @@
22
from src.tracker import ExpenseTracker
33

44
def test_add_expense_stores_amount():
5+
# Arrange
56
tracker = ExpenseTracker()
7+
8+
# Act
69
tracker.add_expense(50)
10+
11+
# Assert
712
assert tracker.expenses[0]['amount'] == 50
813

14+
def test_add_expense_updates_total():
15+
# Arrange
16+
tracker = ExpenseTracker()
17+
18+
# Act
19+
tracker.add_expense(10)
20+
21+
# Assert
22+
assert tracker.total == 10
23+
24+
def test_add_multiple_expenses():
25+
# Arrange
26+
tracker = ExpenseTracker()
27+
28+
# Act
29+
tracker.add_expense(10)
30+
tracker.add_expense(5)
31+
32+
# Assert
33+
assert tracker.total == 15
34+
35+
def test_add_expense_with_negative_amount_fails():
36+
# Arrange
37+
tracker = ExpenseTracker()
38+
39+
# Act and Assert
40+
with pytest.raises(ValueError):
41+
tracker.add_expense(-10)
42+
943
# TODO: Write test_add_expense_can_store_category here
1044

1145

Lesson2-Exercise2-Delete/solution/src/tracker.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def total(self):
1010

1111
# ------------- Create -------------
1212
def add_expense(self, amount, category=None):
13+
if amount <= 0:
14+
raise ValueError("Expense amount must be positive.")
1315
expense_id = str(uuid.uuid4())
1416
expense = {"id": expense_id, "amount": amount, "category": category}
1517
self.expenses.append(expense)
@@ -22,6 +24,15 @@ def list_expenses_by_category(self, category):
2224
def get_expense(self, expense_id):
2325
return next((e for e in self.expenses if e["id"] == expense_id), None)
2426

27+
# ------------- Update -------------
28+
def edit_expense(self, expense_id, new_amount=None, new_category=None):
29+
expense = self.get_expense(expense_id)
30+
if expense:
31+
if new_amount is not None:
32+
expense["amount"] = amount
33+
if new_category is not None:
34+
expense["category"] = new_category
35+
2536
# ------------- Delete -------------
2637
def delete_expense(self, expense_id):
2738
expense_to_delete = self.get_expense(expense_id)

Lesson2-Exercise2-Delete/solution/tests/test_tracker.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,57 @@ def tracker():
66
return ExpenseTracker()
77

88
def test_add_expense_stores_amount(tracker):
9+
# Act
910
tracker.add_expense(50)
11+
# Assert
1012
assert tracker.expenses[0]['amount'] == 50
1113

12-
def test_add_expense_with_category(tracker):
14+
def test_add_expense_updates_total(tracker):
15+
# Act
16+
tracker.add_expense(10)
17+
# Assert
18+
assert tracker.total == 10
19+
20+
def test_add_multiple_expenses(tracker):
21+
# Act
22+
tracker.add_expense(10)
23+
tracker.add_expense(5)
24+
# Assert
25+
assert tracker.total == 15
26+
27+
def test_add_expense_with_negative_amount_fails(tracker):
28+
# Act and Assert
29+
with pytest.raises(ValueError):
30+
tracker.add_expense(-10)
31+
32+
def test_add_expense_can_store_category(tracker):
33+
# Act
1334
tracker.add_expense(10, category="food")
35+
# Assert
1436
assert tracker.expenses[0]['category'] == "food"
1537

1638
def test_list_expenses_by_category_returns_only_requested_category(tracker):
1739
# Arrange
1840
tracker.add_expense(10.00, category="food")
1941
tracker.add_expense(20.00, category="travel")
2042
tracker.add_expense(5.00, category="food")
21-
2243
# Act
2344
results = tracker.list_expenses_by_category("food")
24-
2545
# Assert
2646
assert isinstance(results, list)
27-
# Only "food" expenses should be returned
2847
assert all(item["category"] == "food" for item in results)
29-
# Amounts for the returned items should match the two "food" entries
3048
assert sorted(item["amount"] for item in results) == [5.00, 10.00]
3149

50+
def test_edit_expense(tracker):
51+
# Arrange
52+
expense_id = tracker.add_expense(10, category="food")
53+
# Act
54+
tracker.edit_expense(expense_id, new_amount=12.50, new_category="dining")
55+
edited_expense = tracker.get_expense(expense_id)
56+
# Assert
57+
assert tracker.total == 12.50
58+
assert edit_expense["category"] == "dining"
59+
3260
def test_delete_expense(tracker):
3361
# Arrange: Add an expense to delete
3462
expense_id = tracker.add_expense(20, "entertainment")

Lesson2-Exercise2-Delete/starter/src/tracker.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def total(self):
1010

1111
# ------------- Create -------------
1212
def add_expense(self, amount, category=None):
13+
if amount <= 0:
14+
raise ValueError("Expense amount must be positive.")
1315
expense_id = str(uuid.uuid4())
1416
expense = {"id": expense_id, "amount": amount, "category": category}
1517
self.expenses.append(expense)
@@ -22,5 +24,13 @@ def list_expenses_by_category(self, category):
2224
def get_expense(self, expense_id):
2325
return next((e for e in self.expenses if e["id"] == expense_id), None)
2426

27+
# ------------- Update -------------
28+
def edit_expense(self, expense_id, new_amount=None, new_category=None):
29+
expense = self.get_expense(expense_id)
30+
if expense:
31+
if new_amount is not None:
32+
expense["amount"] = amount
33+
if new_category is not None:
34+
expense["category"] = new_category
2535

2636
# ------------- Delete -------------

Lesson2-Exercise2-Delete/starter/tests/test_tracker.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,55 @@ def tracker():
1010
return ExpenseTracker()
1111

1212
def test_add_expense_stores_amount(tracker):
13+
# Act
1314
tracker.add_expense(50)
15+
# Assert
1416
assert tracker.expenses[0]['amount'] == 50
1517

16-
def test_add_expense_with_category(tracker):
18+
def test_add_expense_updates_total(tracker):
19+
# Act
20+
tracker.add_expense(10)
21+
# Assert
22+
assert tracker.total == 10
23+
24+
def test_add_multiple_expenses(tracker):
25+
# Act
26+
tracker.add_expense(10)
27+
tracker.add_expense(5)
28+
# Assert
29+
assert tracker.total == 15
30+
31+
def test_add_expense_with_negative_amount_fails(tracker):
32+
# Act and Assert
33+
with pytest.raises(ValueError):
34+
tracker.add_expense(-10)
35+
36+
def test_add_expense_can_store_category(tracker):
37+
# Act
1738
tracker.add_expense(10, category="food")
39+
# Assert
1840
assert tracker.expenses[0]['category'] == "food"
1941

42+
def test_edit_expense(tracker):
43+
# Arrange
44+
expense_id = tracker.add_expense(10, category="food")
45+
# Act
46+
tracker.edit_expense(expense_id, new_amount=12.50, new_category="dining")
47+
edited_expense = tracker.get_expense(expense_id)
48+
# Assert
49+
assert tracker.total == 12.50
50+
assert edit_expense["category"] == "dining"
51+
2052
def test_list_expenses_by_category_returns_only_requested_category(tracker):
2153
# Arrange
2254
tracker.add_expense(10.00, category="food")
2355
tracker.add_expense(20.00, category="travel")
2456
tracker.add_expense(5.00, category="food")
25-
2657
# Act
2758
results = tracker.list_expenses_by_category("food")
28-
2959
# Assert
3060
assert isinstance(results, list)
31-
# Only "food" expenses should be returned
3261
assert all(item["category"] == "food" for item in results)
33-
# Amounts for the returned items should match the two "food" entries
3462
assert sorted(item["amount"] for item in results) == [5.00, 10.00]
3563

3664
# TODO: Write test_delete_expense(tracker) here

0 commit comments

Comments
 (0)