1 from datetime import date
2 from formencode import Invalid
4 from webhelpers.html.secure_form import token_key
6 from bluechips.tests import *
8 from bluechips import model
9 from bluechips.model import meta
10 from bluechips.model.types import Currency
12 from bluechips.controllers.spend import ExpenditureSchema
14 class TestSpendController(TestController):
17 response = self.app.get(url_for(controller='spend'))
19 response.mustcontain('Add a New Expenditure')
22 user = meta.Session.query(model.User).\
23 filter_by(name=u'Charlie Root').one()
25 form['spender_id'] = user.id
26 form['amount'] = '74.04'
27 # Make sure date is 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'
36 assert int(form['shares-%d.user_id' % ii].value) == ii + 1
38 response = form.submit()
39 response = response.follow()
40 response.mustcontain('Expenditure', 'created.')
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'
50 shares = dict(((sp.user_id, sp.share)
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')
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)
66 response = self.app.get(url_for(controller='spend',
69 response.mustcontain('Edit an Expenditure')
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'
77 form['description'] = u'Updated bundt cake'
79 # Update the split too.
81 response = form.submit()
82 response = response.follow()
83 response.mustcontain('Expenditure', 'updated.')
85 e = meta.Session.query(model.Expenditure).\
86 order_by(model.Expenditure.id.desc()).first()
87 assert e.description == u'Updated bundt cake'
89 response = self.app.get(url_for(controller='spend',
92 response = response.form.submit('delete').follow()
93 response.mustcontain('Expenditure', 'deleted')
95 def test_delete_nonexistent(self):
96 self.app.get(url_for(controller='spend',
101 def test_destroy_nonexistent(self):
102 response = self.app.get(url_for(controller='spend',
104 params = self.sample_params.copy()
105 params[token_key] = response.form[token_key].value
106 self.app.post(url_for(controller='spend',
112 def test_delete_xsrf_protection(self):
113 self.app.post(url_for(controller='spend',
116 params={'delete': 'Delete'},
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)
125 meta.Session.commit()
127 response = self.app.get(url_for(controller='spend',
130 response.mustcontain('Edit an Expenditure')
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'
138 assert form['shares-%d.amount' % ii].value == '0'
140 def test_edit_nonexistent(self):
141 response = self.app.get(url_for(controller='spend',
143 id=124234), status=404)
145 def test_update_nonexistent(self):
146 response = self.app.get(url_for(controller='spend',
148 params = self.sample_params.copy()
149 params[token_key] = response.form[token_key].value
150 self.app.post(url_for(controller='spend',
156 def test_xsrf_protection(self):
157 self.app.post(url_for(controller='spend',
159 params=self.sample_params,
162 def test_all_zero_shares_fails(self):
163 params = self.sample_params.copy()
165 params['shares-%d.amount' % ii] = '0'
166 v = ExpenditureSchema()
173 self.sample_params = {
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'}
188 expenditures = meta.Session.query(model.Expenditure).all()
189 for e in expenditures:
190 meta.Session.delete(e)
191 meta.Session.commit()