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_zero_value(self):
88 user = meta.Session.query(model.User).\
89 filter_by(name=u'Charlie Root').one()
90 e = model.Expenditure(user, 0, u'A zero value expenditure', None)
95 response = self.app.get(url_for(controller='spend',
98 response.mustcontain('Edit an Expenditure')
101 assert int(form['spender_id'].value) == user.id
102 assert form['amount'].value == '0.00'
103 assert form['date'].value == date.today().strftime('%m/%d/%Y')
104 assert form['description'].value == u'A zero value expenditure'
106 assert form['shares-%d.amount' % ii].value == '0'
108 def test_edit_nonexistent(self):
109 response = self.app.get(url_for(controller='spend',
111 id=124234), status=404)
113 def test_update_nonexistent(self):
114 response = self.app.post(url_for(controller='spend',
117 params=self.sample_post,
120 def test_all_zero_shares_fails(self):
121 params = self.sample_post.copy()
123 params['shares-%d.amount' % ii] = '0'
124 v = ExpenditureSchema()
135 'description': 'Example expenditure post data.',
136 'shares-0.user_id': '1',
137 'shares-0.amount': '1',
138 'shares-1.user_id': '2',
139 'shares-1.amount': '1',
140 'shares-2.user_id': '3',
141 'shares-2.amount': '1',
142 'shares-3.user_id': '4',
143 'shares-3.amount': '1'}
146 expenditures = meta.Session.query(model.Expenditure).all()
147 for e in expenditures:
148 meta.Session.delete(e)
149 meta.Session.commit()