]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/tests/functional/test_spend.py
Update BlueChips for WebHelpers 1.0 and beyond
[bluechips.git] / bluechips / tests / functional / test_spend.py
1 from datetime import date
2 from formencode import Invalid
3
4 from webhelpers.pylonslib.secure_form import token_key
5
6 from bluechips.tests import *
7
8 from bluechips import model
9 from bluechips.model import meta
10 from bluechips.model.types import Currency
11
12 from bluechips.controllers.spend import ExpenditureSchema
13
14 class TestSpendController(TestController):
15
16     def test_index(self):
17         response = self.app.get(url_for(controller='spend'))
18         # Test response...
19         response.mustcontain('Add a New Expenditure')
20         form = response.form
21
22         user = meta.Session.query(model.User).\
23                 filter_by(name=u'Charlie Root').one()
24         
25         form['spender_id'] = user.id
26         form['amount'] = '74.04'
27         # Make sure date is today.
28         today = date.today()
29         assert form['date'].value == today.strftime('%m/%d/%Y')
30         form['description'] = 'A test expenditure'
31         form['shares-0.amount'] = '1'
32         form['shares-1.amount'] = '2'
33         form['shares-2.amount'] = '2'
34         form['shares-3.amount'] = '1'
35         for ii in range(4):
36             assert int(form['shares-%d.user_id' % ii].value) == ii + 1
37
38         response = form.submit()
39         response = response.follow()
40         response.mustcontain('Expenditure', 'created.')
41
42         e = meta.Session.query(model.Expenditure).\
43                 order_by(model.Expenditure.id.desc()).first()
44         assert e.spender.name == u'Charlie Root'
45         assert e.amount == 7404
46         assert e.date == today
47         assert e.description == u'A test expenditure'
48
49         # Test the split.
50         shares = dict(((sp.user_id, sp.share)
51                        for sp in e.splits))
52         assert shares[1] == Currency('12.34')
53         assert shares[2] == Currency('24.68')
54         assert shares[3] == Currency('24.68')
55         assert shares[4] == Currency('12.34')
56
57
58     def test_edit_and_delete(self):
59         user = meta.Session.query(model.User).\
60                 filter_by(name=u'Charlie Root').one()
61         e = model.Expenditure(user, 53812, u'Lemon bundt cake', None)
62         e.even_split()
63         meta.Session.add(e)
64         meta.Session.commit()
65
66         response = self.app.get(url_for(controller='spend',
67                                         action='edit',
68                                         id=e.id))
69         response.mustcontain('Edit an Expenditure')
70         form = response.form
71
72         assert int(form['spender_id'].value) == user.id
73         assert form['amount'].value == '538.12'
74         assert form['date'].value == date.today().strftime('%m/%d/%Y')
75         assert form['description'].value == u'Lemon bundt cake'
76
77         form['description'] = u'Updated bundt cake'
78
79         # Update the split too.
80
81         response = form.submit()
82         response = response.follow()
83         response.mustcontain('Expenditure', 'updated.')
84
85         e = meta.Session.query(model.Expenditure).\
86                 order_by(model.Expenditure.id.desc()).first()
87         assert e.description == u'Updated bundt cake'
88
89         response = self.app.get(url_for(controller='spend',
90                                         action='delete',
91                                         id=e.id))
92         response = response.form.submit('delete').follow()
93         response.mustcontain('Expenditure', 'deleted')
94
95     def test_delete_nonexistent(self):
96         self.app.get(url_for(controller='spend',
97                              action='delete',
98                              id=124344),
99                      status=404)
100
101     def test_destroy_nonexistent(self):
102         response = self.app.get(url_for(controller='spend',
103                                         action='edit'))
104         params = self.sample_params.copy()
105         params[token_key] = response.form[token_key].value
106         self.app.post(url_for(controller='spend',
107                               action='destroy',
108                               id=124344), 
109                       params=params,
110                       status=404)
111
112     def test_delete_xsrf_protection(self):
113         self.app.post(url_for(controller='spend',
114                               action='destroy',
115                               id=1),
116                       params={'delete': 'Delete'},
117                       status=403)
118
119     def test_edit_zero_value(self):
120         user = meta.Session.query(model.User).\
121                 filter_by(name=u'Charlie Root').one()
122         e = model.Expenditure(user, 0, u'A zero value expenditure', None)
123         e.even_split()
124         meta.Session.add(e)
125         meta.Session.commit()
126
127         response = self.app.get(url_for(controller='spend',
128                                         action='edit',
129                                         id=e.id))
130         response.mustcontain('Edit an Expenditure')
131         form = response.form
132
133         assert int(form['spender_id'].value) == user.id
134         assert form['amount'].value == '0.00'
135         assert form['date'].value == date.today().strftime('%m/%d/%Y')
136         assert form['description'].value == u'A zero value expenditure'
137         for ii in range(4):
138             assert form['shares-%d.amount' % ii].value == '0'
139
140     def test_edit_nonexistent(self):
141         response = self.app.get(url_for(controller='spend',
142                                         action='edit',
143                                         id=124234), status=404)
144
145     def test_update_nonexistent(self):
146         response = self.app.get(url_for(controller='spend',
147                                         action='edit'))
148         params = self.sample_params.copy()
149         params[token_key] = response.form[token_key].value
150         self.app.post(url_for(controller='spend',
151                               action='update',
152                               id=14234), 
153                       params=params,
154                       status=404)
155
156     def test_xsrf_protection(self):
157         self.app.post(url_for(controller='spend',
158                               action='update'),
159                       params=self.sample_params,
160                       status=403)
161
162     def test_all_zero_shares_fails(self):
163         params = self.sample_params.copy()
164         for ii in range(4):
165             params['shares-%d.amount' % ii] = '0'
166         v = ExpenditureSchema()
167         try:
168             v.to_python(params)
169         except Invalid:
170             pass
171
172     def setUp(self):
173         self.sample_params = {
174             'spender_id': '1',
175             'amount': '44.12',
176             'date': '10/5/2008',
177             'description': 'Example expenditure post data.',
178             'shares-0.user_id': '1',
179             'shares-0.amount': '1',
180             'shares-1.user_id': '2',
181             'shares-1.amount': '1',
182             'shares-2.user_id': '3',
183             'shares-2.amount': '1',
184             'shares-3.user_id': '4',
185             'shares-3.amount': '1'}
186
187     def tearDown(self):
188         expenditures = meta.Session.query(model.Expenditure).all()
189         for e in expenditures:
190             meta.Session.delete(e)
191         meta.Session.commit()