]> asedeno.scripts.mit.edu Git - bluechips.git/commitdiff
cleaning up code and improving test coverage
authorScott Torborg <scott@crookedmedia.com>
Sun, 8 Nov 2009 01:24:08 +0000 (15:24 -1000)
committerScott Torborg <scott@crookedmedia.com>
Sun, 8 Nov 2009 01:24:08 +0000 (15:24 -1000)
bluechips/controllers/spend.py
bluechips/lib/app_globals.py
bluechips/tests/functional/test_spend.py
bluechips/tests/functional/test_transfer.py

index 8d2dc4a526e182f8f80430babb5be0452b53da78..aceb6ade6a839519217703bfe5d8c647afcd0a05 100644 (file)
@@ -65,10 +65,9 @@ class SpendController(BaseController):
             c.values = {}
             for ii, user_row in enumerate(c.users):
                 user_id, user = user_row
+                val = 0
                 if user.resident:
                     val = Decimal(100) / Decimal(num_residents)
-                else:
-                    val = 0
                 c.values['shares-%d.amount' % ii] = val
         else:
             c.title = 'Edit an Expenditure'
@@ -78,17 +77,15 @@ class SpendController(BaseController):
             c.values = {}
             for ii, user_row in enumerate(c.users):
                 user_id, user = user_row
-                try:
-                    share = [s.share for s in c.expenditure.splits
-                             if s.user == user][0]
-                    if c.expenditure.amount == 0:
-                        percent = 0
-                    else:
-                        percent = (Decimal(100) * Decimal(int(share)) /
-                                   Decimal(int(c.expenditure.amount))).\
-                                quantize(Decimal("0.001"))
-                except IndexError:
+                shares_by_user = dict(((sp.user, sp.share) for sp
+                                       in c.expenditure.splits))
+                share = shares_by_user.get(user, 0)
+                if c.expenditure.amount == 0:
                     percent = 0
+                else:
+                    percent = (Decimal(100) * Decimal(int(share)) /
+                               Decimal(int(c.expenditure.amount))).\
+                            quantize(Decimal("0.001"))
                 c.values['shares-%d.amount' % ii] = percent
 
         return render('/spend/index.mako')
index 016a9e1eaf0bf360544da778e9f893ebe323bd65..edf6aa5bc4ae3c586265a25a3c7d4a44b5992883 100644 (file)
@@ -33,7 +33,7 @@ class Globals(object):
             log.info("From: %s\nTo: %s\nSubject: %s\n\n%s",
                      msg.From, msg.To, msg.Subject, msg.Body)
         else:
-            self.mailer.send(msg)
+            self.mailer.send(msg) # pragma: nocover
 
     def handle_notification(self, users, subject, body):
         "Send a notification email."
index 9a7aff0b844210c487aa82b7a82eda85f44df99c..d0213047bc9a5c4d51285fe1a4d77b9e87357149 100644 (file)
@@ -1,8 +1,13 @@
 from datetime import date
+from formencode import Invalid
+
 from bluechips.tests import *
 
 from bluechips import model
 from bluechips.model import meta
+from bluechips.model.types import Currency
+
+from bluechips.controllers.spend import ExpenditureSchema
 
 class TestSpendController(TestController):
 
@@ -16,15 +21,17 @@ class TestSpendController(TestController):
                 filter_by(name=u'Charlie Root').one()
         
         form['spender_id'] = user.id
-        form['amount'] = '66.78'
+        form['amount'] = '74.04'
         # Make sure date is today.
         today = date.today()
         assert form['date'].value == today.strftime('%m/%d/%Y')
         form['description'] = 'A test expenditure'
         form['shares-0.amount'] = '1'
         form['shares-1.amount'] = '2'
-        form['shares-2.amount'] = '3'
-        form['shares-3.amount'] = '4'
+        form['shares-2.amount'] = '2'
+        form['shares-3.amount'] = '1'
+        for ii in range(4):
+            assert int(form['shares-%d.user_id' % ii].value) == ii + 1
 
         response = form.submit()
         response = response.follow()
@@ -33,11 +40,17 @@ class TestSpendController(TestController):
         e = meta.Session.query(model.Expenditure).\
                 order_by(model.Expenditure.id.desc()).first()
         assert e.spender.name == u'Charlie Root'
-        assert e.amount == 6678
+        assert e.amount == 7404
         assert e.date == today
         assert e.description == u'A test expenditure'
 
         # Test the split.
+        shares = dict(((sp.user_id, sp.share)
+                       for sp in e.splits))
+        assert shares[1] == Currency('12.34')
+        assert shares[2] == Currency('24.68')
+        assert shares[3] == Currency('24.68')
+        assert shares[4] == Currency('12.34')
 
 
     def test_edit(self):
@@ -76,6 +89,38 @@ class TestSpendController(TestController):
                                         action='edit',
                                         id=124234), status=404)
 
+    def test_update_nonexistent(self):
+        response = self.app.post(url_for(controller='spend',
+                                         action='update',
+                                         id=14234), 
+                                 params=self.sample_post,
+                                 status=404)
+
+    def test_all_zero_shares_fails(self):
+        params = self.sample_post.copy()
+        for ii in range(4):
+            params['shares-%d.amount' % ii] = '0'
+        v = ExpenditureSchema()
+        try:
+            v.to_python(params)
+        except Invalid:
+            pass
+
+    def setUp(self):
+        self.sample_post = {
+            'spender_id': '1',
+            'amount': '44.12',
+            'date': '10/5/2008',
+            'description': 'Example expenditure post data.',
+            'shares-0.user_id': '1',
+            'shares-0.amount': '1',
+            'shares-1.user_id': '2',
+            'shares-1.amount': '1',
+            'shares-2.user_id': '3',
+            'shares-2.amount': '1',
+            'shares-3.user_id': '4',
+            'shares-3.amount': '1'}
+
     def tearDown(self):
         expenditures = meta.Session.query(model.Expenditure).all()
         for e in expenditures:
index b38f71cc65d96a4c6c532c7c2c646801d34d9fd0..9e01e6a455725f8d82fdb6dd375dff4a165aa858 100644 (file)
@@ -75,6 +75,28 @@ class TestTransferController(TestController):
                                         action='edit',
                                         id=21424), status=404)
 
+    def test_update_nonexistent(self):
+        response = self.app.post(url_for(controller='transfer',
+                                         action='update',
+                                         id=21424),
+                                 params=self.sample_params,
+                                 status=404)
+
+    def test_update_get_redirects(self):
+        response = self.app.get(url_for(controller='transfer',
+                                        action='update'),
+                                status=302)
+        assert (dict(response.headers)['location'] ==
+                url_for(controller='transfer', action='edit', qualified=True))
+
+    def setUp(self):
+        self.sample_params = {
+            'debtor_id': '1',
+            'creditor_id': '2',
+            'amount': '33.98',
+            'date': '4/1/2007',
+            'description': 'Example transfer params.'}
+
     def tearDown(self):
         transfers = meta.Session.query(model.Transfer).all()
         for t in transfers: