1 from datetime import date
2 from formencode import Invalid
4 from bluechips.tests import *
6 from bluechips import model
7 from bluechips.model import meta
8 from bluechips.model.types import Currency
10 from bluechips.controllers.spend import ExpenditureSchema
12 class TestSpendController(TestController):
15 response = self.app.get(url_for(controller='spend'))
17 response.mustcontain('Add a New Expenditure')
20 user = meta.Session.query(model.User).\
21 filter_by(name=u'Charlie Root').one()
23 form['spender_id'] = user.id
24 form['amount'] = '74.04'
25 # Make sure date is 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'
34 assert int(form['shares-%d.user_id' % ii].value) == ii + 1
36 response = form.submit()
37 response = response.follow()
38 response.mustcontain('Expenditure', 'created.')
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'
48 shares = dict(((sp.user_id, sp.share)
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')
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)
64 response = self.app.get(url_for(controller='spend',
67 response.mustcontain('Edit an Expenditure')
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'
75 form['description'] = u'Updated bundt cake'
77 # Update the split too.
79 response = form.submit()
80 response = response.follow()
81 response.mustcontain('Expenditure', 'updated.')
83 e = meta.Session.query(model.Expenditure).\
84 order_by(model.Expenditure.id.desc()).first()
85 assert e.description == u'Updated bundt cake'
87 def test_edit_nonexistent(self):
88 response = self.app.get(url_for(controller='spend',
90 id=124234), status=404)
92 def test_update_nonexistent(self):
93 response = self.app.post(url_for(controller='spend',
96 params=self.sample_post,
99 def test_all_zero_shares_fails(self):
100 params = self.sample_post.copy()
102 params['shares-%d.amount' % ii] = '0'
103 v = ExpenditureSchema()
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'}
125 expenditures = meta.Session.query(model.Expenditure).all()
126 for e in expenditures:
127 meta.Session.delete(e)
128 meta.Session.commit()