--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bttests.py Sun Jul 14 22:47:29 2013 -0400
@@ -0,0 +1,127 @@
+from budgettracker import Budget, Transaction, Decimal
+
+class Expect:
+ def __init__(self, *cmds, verbose = False):
+ self._cmds = cmds
+ self._index = 0
+ self.verbose = verbose
+ def __call__(self, prompt):
+ assert(self._index < len(self._cmds))
+ idx = self._index
+ self._index += 1
+ if self.verbose:
+ print("{:<20} => {}".format(prompt, self._cmds[idx]))
+ return self._cmds[idx]
+
+class Test:
+ def run(self):
+ self.test_load_save()
+ self.test_report(True)
+ self.test_envelops()
+ self.test_read_transaction()
+
+ def test_read_transaction(self, verbose = False):
+ cmds = [ "Salary", "400",
+ "Taxes", "100",
+ "Taxes", "-100",
+ "Grocery", "200" ]
+ b = self.create_budget()
+ t = b.read_transaction(Expect(verbose = verbose, *(cmds + ["", "n"])))
+ assert(t is None)
+ t = b.read_transaction(Expect(verbose = verbose, *(cmds + ["", "y"])))
+ assert(t.amount == 400)
+ assert(t.budget["Taxes"] == 100)
+ assert(t.budget["Grocery"] == 200)
+ assert(len(t.budget) == 2)
+ assert(t.expenses["Taxes"] == 100)
+ assert(len(t.expenses) == 1)
+ assert(t.balance == 200)
+ t = b.read_transaction(Expect(verbose = verbose, *(cmds + ["Hobbies", "", "y"])))
+ assert(t.amount == 400)
+ assert(t.budget["Taxes"] == 100)
+ assert(t.budget["Grocery"] == 200)
+ assert(t.budget["Hobbies"] == 200)
+ assert(len(t.budget) == 3)
+ assert(t.expenses["Taxes"] == 100)
+ assert(len(t.expenses) == 1)
+ assert(t.balance == 0)
+
+ def create_budget(self):
+ b = Budget()
+ salary = Decimal(500)
+ taxes = salary * Decimal('0.20')
+ # Salary: 500 - 100 in taxes = 400
+ # Budget: 200$ in Grocery, 100$ for Taxes
+ # Expenses: Taxes 100$
+ # Unassigned: 200$
+ t = Transaction(name="Salary", amount=salary-taxes,
+ budget = [("Grocery", Decimal(200)),
+ ("Taxes", taxes)],
+ expenses = [("Taxes", taxes)])
+ b.add_transaction(t)
+ # Gift: 100$
+ # Budget: 100$ in Hobbies
+ t = Transaction(name = "Gift", amount = Decimal(100), envelop = "Hobbies")
+ b.add_transaction(t)
+ # Costco: -75$
+ # Expenses: 75$ in Grocery
+ t = Transaction(name="Costco", amount=Decimal(-75))
+ t.rebalance("Grocery")
+ b.add_transaction(t)
+ # Cinema: -50
+ # Expenses: 50$ in Hobbies
+ t = Transaction(name="Cinema", amount=Decimal(-50), envelop="Hobbies")
+ assert(t.balance == 0)
+ b.add_transaction(t)
+ # Missing money: -20$
+ # Unassigned: -20$
+ t = Transaction(name="Missing", amount=Decimal(-20))
+ b.add_transaction(t)
+ # Total:
+ # Budget: 200$ Grocery, 100$ Taxes, 100$ Hobbies = 400$
+ # Expenses: 100$ Taxes, 75$ Grocery, 50$ Hobbies = 225$
+ # Unassigned: 200$ Salary, -20$ Missing = 180$
+
+ b.set_envelop_description("Grocery", "stuff for stomach")
+ b.rename_envelop("Grocery", "Food")
+ return b
+
+ def test_load_save(self, verbose = False):
+ b = self.create_budget()
+
+ from io import StringIO
+ fp = StringIO()
+ b.save(fp)
+ saved = fp.getvalue()
+ if verbose: print(saved)
+
+ b2 = Budget()
+ b2.load(StringIO(saved))
+ fp = StringIO()
+ b2.save(fp)
+ saved2 = fp.getvalue()
+ if verbose: print(saved2)
+ assert(saved == saved2)
+
+ def test_envelops(self, verbose = False):
+ b = self.create_budget()
+ envelops = list(b.envelops)
+ assert(len(envelops) == 5)
+ total = envelops[-2]
+ unassigned = envelops[-1]
+
+ assert(total.budget == 400)
+ assert(total.expenses == 225)
+ assert(total.balance == 175)
+ assert(unassigned.budget == 200)
+ assert(unassigned.expenses == 20)
+ assert(unassigned.balance == 180)
+
+ def test_report(self, verbose = False):
+ b = self.create_budget()
+ for l in b.report():
+ if verbose:
+ print(l)
+
+if __name__ == '__main__':
+ Test().run()