import os
import tempfile
import unittest
from datetime import date
from loans import due_date, late_fee, can_borrow
from storage import save_loans, load_loans
def make_loan(item, member, borrowed, returned=None):
return {"item_id": item, "member_no": member, "borrowed": borrowed,
"due": due_date(borrowed), "returned": returned}
class TestLoansWithStorage(unittest.TestCase):
def setUp(self):
self.folder = tempfile.TemporaryDirectory() # a fresh, empty folder
self.path = os.path.join(self.folder.name, "loans.csv")
def tearDown(self):
self.folder.cleanup() # delete it afterwards
def test_round_trip_keeps_every_value(self):
loans = [make_loan("SS-01", 1042, date(2027, 1, 4)),
make_loan("SK-07", 7, date(2027, 1, 2), date(2027, 1, 9))]
save_loans(self.path, loans)
self.assertEqual(load_loans(self.path), loans)
def test_limit_still_applies_after_reload(self):
loans = [make_loan(i, 1042, date(2027, 1, 4)) for i in ("SS-01", "SK-07", "GM-12")]
save_loans(self.path, loans)
self.assertFalse(can_borrow(1042, load_loans(self.path)))
def test_fee_from_reloaded_loan(self):
save_loans(self.path, [make_loan("SS-01", 1042, date(2027, 1, 4), date(2027, 1, 21))])
loan = load_loans(self.path)[0]
self.assertAlmostEqual(late_fee(loan["due"], loan["returned"]), 0.75)
def test_missing_file_gives_empty_list(self):
self.assertEqual(load_loans(self.path), [])
if __name__ == "__main__":
unittest.main(verbosity=2)
test_integration.py. Every test saves with storage.py and then uses the loaded data with loans.py: they test the seam, not the modules alone.