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')
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 def test_edit_zero_value(self):
90 user = meta.Session.query(model.User).\
91 filter_by(name=u'Charlie Root').one()
92 e = model.Expenditure(user, 0, u'A zero value expenditure', None)
97 response = self.app.get(url_for(controller='spend',
100 response.mustcontain('Edit an Expenditure')
103 assert int(form['spender_id'].value) == user.id
104 assert form['amount'].value == '0.00'
105 assert form['date'].value == date.today().strftime('%m/%d/%Y')
106 assert form['description'].value == u'A zero value expenditure'
108 assert form['shares-%d.amount' % ii].value == '0'
110 def test_edit_nonexistent(self):
111 response = self.app.get(url_for(controller='spend',
113 id=124234), status=404)
115 def test_update_nonexistent(self):
116 response = self.app.get(url_for(controller='spend',
118 params = self.sample_post.copy()
119 params[token_key] = response.form[token_key].value
120 self.app.post(url_for(controller='spend',
126 def test_xsrf_protection(self):
127 self.app.post(url_for(controller='spend',
129 params=self.sample_post,
132 def test_all_zero_shares_fails(self):
133 params = self.sample_post.copy()
135 params['shares-%d.amount' % ii] = '0'
136 v = ExpenditureSchema()
147 'description': 'Example expenditure post data.',
148 'shares-0.user_id': '1',
149 'shares-0.amount': '1',
150 'shares-1.user_id': '2',
151 'shares-1.amount': '1',
152 'shares-2.user_id': '3',
153 'shares-2.amount': '1',
154 'shares-3.user_id': '4',
155 'shares-3.amount': '1'}
158 expenditures = meta.Session.query(model.Expenditure).all()
159 for e in expenditures:
160 meta.Session.delete(e)
161 meta.Session.commit()