+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")