]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/tests/splits/test_random.py
require at least one non-zero share on an expenditure
[bluechips.git] / bluechips / tests / splits / test_random.py
index 2f95738f6654f02d217d5aa848a703dc2b66bc65..f553f7ac7e4315cc131a649336b6cf8f3a2f5886 100644 (file)
@@ -1,31 +1,32 @@
+from unittest import TestCase
 from bluechips.tests import *
 from bluechips import model
 from bluechips.model import meta
-from bluechips.model.types import Currency
-import random
+from webhelpers.number import standard_deviation as std_dev
 
-class TestSplitRandom(TestController):
+class TestSplitRandom(TestCase):
     @classmethod
     def setUpClass(cls):
-        for i in xrange(random.randint(2, 5)):
-            u = model.User()
-            u.username = sample_users[i].lower()
-            u.name = sample_users[i]
-            u.resident = 1
-            meta.Session.save(u)
-        meta.Session.commit()
-        
+        createUsers()
+    
+    @classmethod
+    def tearDownClass(cls):
+        deleteUsers()
+    
     def setUp(self):
-        users = meta.Session.query(model.User).all()
-        for i in xrange(random.randint(5, 20)):
-            e = model.Expenditure()
-            e.spender = random.choice(users)
-            e.amount = Currency(random.randint(1000, 100000))
-            meta.Session.save(e)
-            e.even_split()
-        meta.Session.commit()
+        createExpenditures()
+    
+    def tearDown(self):
+        deleteExpenditures()
     
     def test_splitTotal(self):
         for e in meta.Session.query(model.Expenditure):
-            assert sum(s.share for s in e.splits) == e.amount,\
-                "Total of splits is not the same as the expenditure total"
+            self.assertEqual(sum(s.share for s in e.splits), e.amount)
+    
+    def test_splitDistribution(self):
+        user_count = meta.Session.query(model.User).count()
+        for e in meta.Session.query(model.Expenditure):
+            even_total = (e.amount / user_count) * user_count
+            difference = abs(even_total - e.amount)
+            self.assert_(std_dev(list(int(s.share) for s in e.splits)) <= difference, \
+                "Expenditure doesn't appear to be evenly distributed")