]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/tests/functional/test_spend.py
cleaning up code and improving test coverage
[bluechips.git] / bluechips / tests / functional / test_spend.py
1 from datetime import date
2 from formencode import Invalid
3
4 from bluechips.tests import *
5
6 from bluechips import model
7 from bluechips.model import meta
8 from bluechips.model.types import Currency
9
10 from bluechips.controllers.spend import ExpenditureSchema
11
12 class TestSpendController(TestController):
13
14     def test_index(self):
15         response = self.app.get(url_for(controller='spend'))
16         # Test response...
17         response.mustcontain('Add a New Expenditure')
18         form = response.form
19
20         user = meta.Session.query(model.User).\
21                 filter_by(name=u'Charlie Root').one()
22         
23         form['spender_id'] = user.id
24         form['amount'] = '74.04'
25         # Make sure date is today.
26         today = date.today()
27         assert form['date'].value == today.strftime('%m/%d/%Y')
28         form['description'] = 'A test expenditure'
29         form['shares-0.amount'] = '1'
30         form['shares-1.amount'] = '2'
31         form['shares-2.amount'] = '2'
32         form['shares-3.amount'] = '1'
33         for ii in range(4):
34             assert int(form['shares-%d.user_id' % ii].value) == ii + 1
35
36         response = form.submit()
37         response = response.follow()
38         response.mustcontain('Expenditure', 'created.')
39
40         e = meta.Session.query(model.Expenditure).\
41                 order_by(model.Expenditure.id.desc()).first()
42         assert e.spender.name == u'Charlie Root'
43         assert e.amount == 7404
44         assert e.date == today
45         assert e.description == u'A test expenditure'
46
47         # Test the split.
48         shares = dict(((sp.user_id, sp.share)
49                        for sp in e.splits))
50         assert shares[1] == Currency('12.34')
51         assert shares[2] == Currency('24.68')
52         assert shares[3] == Currency('24.68')
53         assert shares[4] == Currency('12.34')
54
55
56     def test_edit(self):
57         user = meta.Session.query(model.User).\
58                 filter_by(name=u'Charlie Root').one()
59         e = model.Expenditure(user, 53812, u'Lemon bundt cake', None)
60         e.even_split()
61         meta.Session.add(e)
62         meta.Session.commit()
63
64         response = self.app.get(url_for(controller='spend',
65                                         action='edit',
66                                         id=e.id))
67         response.mustcontain('Edit an Expenditure')
68         form = response.form
69
70         assert int(form['spender_id'].value) == user.id
71         assert form['amount'].value == '538.12'
72         assert form['date'].value == date.today().strftime('%m/%d/%Y')
73         assert form['description'].value == u'Lemon bundt cake'
74
75         form['description'] = u'Updated bundt cake'
76
77         # Update the split too.
78
79         response = form.submit()
80         response = response.follow()
81         response.mustcontain('Expenditure', 'updated.')
82
83         e = meta.Session.query(model.Expenditure).\
84                 order_by(model.Expenditure.id.desc()).first()
85         assert e.description == u'Updated bundt cake'
86
87     def test_edit_nonexistent(self):
88         response = self.app.get(url_for(controller='spend',
89                                         action='edit',
90                                         id=124234), status=404)
91
92     def test_update_nonexistent(self):
93         response = self.app.post(url_for(controller='spend',
94                                          action='update',
95                                          id=14234), 
96                                  params=self.sample_post,
97                                  status=404)
98
99     def test_all_zero_shares_fails(self):
100         params = self.sample_post.copy()
101         for ii in range(4):
102             params['shares-%d.amount' % ii] = '0'
103         v = ExpenditureSchema()
104         try:
105             v.to_python(params)
106         except Invalid:
107             pass
108
109     def setUp(self):
110         self.sample_post = {
111             'spender_id': '1',
112             'amount': '44.12',
113             'date': '10/5/2008',
114             'description': 'Example expenditure post data.',
115             'shares-0.user_id': '1',
116             'shares-0.amount': '1',
117             'shares-1.user_id': '2',
118             'shares-1.amount': '1',
119             'shares-2.user_id': '3',
120             'shares-2.amount': '1',
121             'shares-3.user_id': '4',
122             'shares-3.amount': '1'}
123
124     def tearDown(self):
125         expenditures = meta.Session.query(model.Expenditure).all()
126         for e in expenditures:
127             meta.Session.delete(e)
128         meta.Session.commit()