]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/tests/splits/test_fixed.py
0de37867e549ecd518863ffc4cfe9170c6c6a87b
[bluechips.git] / bluechips / tests / splits / test_fixed.py
1 from unittest import TestCase
2 from bluechips.tests import *
3 from bluechips import model
4 from bluechips.model import meta
5 from bluechips.model.types import Currency
6 from decimal import Decimal
7
8 class TestSplitFixed(TestCase):
9     def test_simpleSplit(self):
10         """
11         Test simply splitting a $100 expenditure amongst 4 people
12         """
13         createUsers(4)
14         
15         e = model.Expenditure(meta.Session.query(model.User).first(),
16                               Currency("100"))
17         meta.Session.save(e)
18         e.even_split()
19         meta.Session.commit()
20         
21         for s in meta.Session.query(model.Split).\
22                 filter(model.Split.expenditure==e):
23             self.assertEqual(s.share, Currency("25.00"))
24         
25         deleteExpenditures()
26         deleteUsers()
27     
28     def test_uneven(self):
29         """
30         Test that expenditures can be split non-evenly
31         """
32         createUsers(2)
33         
34         users = meta.Session.query(model.User).all()
35         
36         e = model.Expenditure(users[0], Currency("100"))
37         meta.Session.save(e)
38         
39         split_dict = {users[0]: Decimal("20"),
40                       users[1]: Decimal("80")}
41         
42         amount_dict = {users[0]: Currency("20"),
43                        users[1]: Currency("80")}
44         
45         e.split(split_dict)
46         meta.Session.commit()
47         
48         for s in meta.Session.query(model.Split):
49             self.assertEqual(s.share, amount_dict[s.user])
50         
51         deleteExpenditures()
52         deleteUsers()
53     
54     def test_unevenBadTotal(self):
55         """
56         Test that transactions get split up properly when the uneven
57         split shares don't add to 100%
58         """
59         createUsers(2)
60         
61         users = meta.Session.query(model.User).all()
62         
63         e = model.Expenditure(users[0], Currency("100.00"))
64         meta.Session.save(e)
65         
66         split_dict = {users[0]: Decimal(10),
67                       users[1]: Decimal(15)}
68         
69         amount_dict = {users[0]: Currency("40"),
70                        users[1]: Currency("60")}
71         
72         e.split(split_dict)
73         meta.Session.commit()
74         
75         for s in meta.Session.query(model.Split):
76             self.assertEqual(s.share, amount_dict[s.user])
77         
78         deleteExpenditures()
79         deleteUsers()
80
81     def test_negativeExpenditure(self):
82         """
83         Test that negative expenditures get split correctly
84         """
85         createUsers(2)
86
87         users = meta.Session.query(model.User).all()
88
89         e = model.Expenditure(users[0], Currency("100.00"))
90         meta.Session.save(e)
91
92         # Force a split that will result in needing to distribute
93         # pennies
94         split_dict = {users[0]: Decimal(1),
95                       users[1]: Decimal(2)}
96         e.split(split_dict)
97         meta.Session.commit()
98
99         self.assertEqual(e.amount, sum(s.share for s in meta.Session.query(model.Split)))
100
101         deleteExpenditures()
102         deleteUsers()