bttests.py
author Fabien Ninoles <fabien@tzone.org>
Sun, 14 Jul 2013 22:47:29 -0400
changeset 0 811cd790a493
permissions -rw-r--r--
First version of BudgetTracker
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     1
from budgettracker import Budget, Transaction, Decimal
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     2
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     3
class Expect:
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     4
    def __init__(self, *cmds, verbose = False):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     5
        self._cmds = cmds
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     6
        self._index = 0
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     7
        self.verbose = verbose
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     8
    def __call__(self, prompt):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     9
        assert(self._index < len(self._cmds))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    10
        idx = self._index
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    11
        self._index += 1
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    12
        if self.verbose:
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    13
            print("{:<20} => {}".format(prompt, self._cmds[idx]))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    14
        return self._cmds[idx]
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    15
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    16
class Test:
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    17
    def run(self):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    18
        self.test_load_save()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    19
        self.test_report(True)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    20
        self.test_envelops()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    21
        self.test_read_transaction()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    22
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    23
    def test_read_transaction(self, verbose = False):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    24
        cmds = [ "Salary", "400",
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    25
                 "Taxes", "100",
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    26
                 "Taxes", "-100",
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    27
                 "Grocery", "200" ]
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    28
        b = self.create_budget()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    29
        t = b.read_transaction(Expect(verbose = verbose, *(cmds + ["", "n"])))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    30
        assert(t is None)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    31
        t = b.read_transaction(Expect(verbose = verbose, *(cmds + ["", "y"])))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    32
        assert(t.amount == 400)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    33
        assert(t.budget["Taxes"] == 100)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    34
        assert(t.budget["Grocery"] == 200)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    35
        assert(len(t.budget) == 2)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    36
        assert(t.expenses["Taxes"] == 100)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    37
        assert(len(t.expenses) == 1)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    38
        assert(t.balance == 200)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    39
        t = b.read_transaction(Expect(verbose = verbose, *(cmds + ["Hobbies", "", "y"])))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    40
        assert(t.amount == 400)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    41
        assert(t.budget["Taxes"] == 100)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    42
        assert(t.budget["Grocery"] == 200)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    43
        assert(t.budget["Hobbies"] == 200)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    44
        assert(len(t.budget) == 3)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    45
        assert(t.expenses["Taxes"] == 100)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    46
        assert(len(t.expenses) == 1)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    47
        assert(t.balance == 0)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    48
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    49
    def create_budget(self):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    50
        b = Budget()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    51
        salary = Decimal(500)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    52
        taxes = salary * Decimal('0.20')
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    53
        # Salary: 500 - 100 in taxes = 400
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    54
        # Budget: 200$ in Grocery, 100$ for Taxes
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    55
        # Expenses: Taxes 100$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    56
        # Unassigned: 200$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    57
        t = Transaction(name="Salary", amount=salary-taxes,
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    58
                        budget = [("Grocery", Decimal(200)),
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    59
                                  ("Taxes", taxes)],
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    60
                        expenses = [("Taxes", taxes)])
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    61
        b.add_transaction(t)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    62
        # Gift: 100$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    63
        # Budget: 100$ in Hobbies
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    64
        t = Transaction(name = "Gift", amount = Decimal(100), envelop = "Hobbies")
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    65
        b.add_transaction(t)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    66
        # Costco: -75$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    67
        # Expenses: 75$ in Grocery
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    68
        t = Transaction(name="Costco", amount=Decimal(-75))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    69
        t.rebalance("Grocery")
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    70
        b.add_transaction(t)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    71
        # Cinema: -50
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    72
        # Expenses: 50$ in Hobbies
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    73
        t = Transaction(name="Cinema", amount=Decimal(-50), envelop="Hobbies")
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    74
        assert(t.balance == 0)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    75
        b.add_transaction(t)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    76
        # Missing money: -20$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    77
        # Unassigned: -20$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    78
        t = Transaction(name="Missing", amount=Decimal(-20))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    79
        b.add_transaction(t)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    80
        # Total:
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    81
        # Budget: 200$ Grocery, 100$ Taxes, 100$ Hobbies = 400$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    82
        # Expenses: 100$ Taxes, 75$ Grocery, 50$ Hobbies = 225$
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    83
        # Unassigned: 200$ Salary, -20$ Missing = 180$ 
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    84
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    85
        b.set_envelop_description("Grocery", "stuff for stomach")
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    86
        b.rename_envelop("Grocery", "Food")
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    87
        return b
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    88
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    89
    def test_load_save(self, verbose = False):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    90
        b = self.create_budget()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    91
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    92
        from io import StringIO
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    93
        fp = StringIO()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    94
        b.save(fp)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    95
        saved = fp.getvalue()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    96
        if verbose: print(saved)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    97
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    98
        b2 = Budget()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    99
        b2.load(StringIO(saved))
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   100
        fp = StringIO()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   101
        b2.save(fp)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   102
        saved2 = fp.getvalue()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   103
        if verbose: print(saved2)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   104
        assert(saved == saved2)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   105
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   106
    def test_envelops(self, verbose = False):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   107
        b = self.create_budget()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   108
        envelops = list(b.envelops)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   109
        assert(len(envelops) == 5)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   110
        total = envelops[-2]
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   111
        unassigned = envelops[-1]
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   112
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   113
        assert(total.budget == 400)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   114
        assert(total.expenses == 225)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   115
        assert(total.balance == 175)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   116
        assert(unassigned.budget == 200)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   117
        assert(unassigned.expenses == 20)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   118
        assert(unassigned.balance == 180)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   119
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   120
    def test_report(self, verbose = False):
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   121
        b = self.create_budget()
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   122
        for l in b.report():
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   123
            if verbose:
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   124
                print(l)
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   125
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   126
if __name__ == '__main__':
811cd790a493 First version of BudgetTracker
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   127
    Test().run()