aboutsummaryrefslogtreecommitdiff
path: root/budget/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'budget/tests.py')
-rw-r--r--budget/tests.py147
1 files changed, 93 insertions, 54 deletions
diff --git a/budget/tests.py b/budget/tests.py
index 0dcd8a1..d127b06 100644
--- a/budget/tests.py
+++ b/budget/tests.py
@@ -1,7 +1,9 @@
# -*- coding: utf-8 -*-
-import os
-import tempfile
-import unittest2 as unittest
+try:
+ import unittest2 as unittest
+except ImportError:
+ import unittest # NOQA
+
import base64
import json
@@ -10,13 +12,14 @@ from flask import session
import run
import models
+
class TestCase(unittest.TestCase):
def setUp(self):
run.app.config['TESTING'] = True
run.app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///memory"
- run.app.config['CSRF_ENABLED'] = False # simplify the tests
+ run.app.config['CSRF_ENABLED'] = False # simplify the tests
self.app = run.app.test_client()
models.db.init_app(run.app)
@@ -51,6 +54,7 @@ class TestCase(unittest.TestCase):
password=name, contact_email="%s@notmyidea.org" % name))
models.db.session.commit()
+
class BudgetTestCase(TestCase):
def test_notifications(self):
@@ -64,8 +68,8 @@ class BudgetTestCase(TestCase):
self.login("raclette")
self.post_project("raclette")
- self.app.post("/raclette/invite", data=
- {"emails": 'alexis@notmyidea.org'})
+ self.app.post("/raclette/invite",
+ data={"emails": 'alexis@notmyidea.org'})
self.assertEqual(len(outbox), 2)
self.assertEqual(outbox[0].recipients, ["raclette@notmyidea.org"])
@@ -73,8 +77,8 @@ class BudgetTestCase(TestCase):
# sending a message to multiple persons
with run.mail.record_messages() as outbox:
- self.app.post("/raclette/invite", data=
- {"emails": 'alexis@notmyidea.org, toto@notmyidea.org'})
+ self.app.post("/raclette/invite",
+ data={"emails": 'alexis@notmyidea.org, toto@notmyidea.org'})
# only one message is sent to multiple persons
self.assertEqual(len(outbox), 1)
@@ -83,19 +87,19 @@ class BudgetTestCase(TestCase):
# mail address checking
with run.mail.record_messages() as outbox:
- response = self.app.post("/raclette/invite", data={"emails": "toto"})
- self.assertEqual(len(outbox), 0) # no message sent
+ response = self.app.post("/raclette/invite",
+ data={"emails": "toto"})
+ self.assertEqual(len(outbox), 0) # no message sent
self.assertIn("The email toto is not valid", response.data)
# mixing good and wrong adresses shouldn't send any messages
with run.mail.record_messages() as outbox:
- self.app.post("/raclette/invite", data=
- {"emails": 'alexis@notmyidea.org, alexis'}) # not valid
+ self.app.post("/raclette/invite",
+ data={"emails": 'alexis@notmyidea.org, alexis'}) # not valid
# only one message is sent to multiple persons
self.assertEqual(len(outbox), 0)
-
def test_password_reminder(self):
# test that it is possible to have an email cotaining the password of a
# project in case people forget it (and it happens!)
@@ -113,7 +117,6 @@ class BudgetTestCase(TestCase):
self.assertIn("raclette", outbox[0].body)
self.assertIn("raclette@notmyidea.org", outbox[0].recipients)
-
def test_project_creation(self):
with run.app.test_client() as c:
@@ -134,9 +137,9 @@ class BudgetTestCase(TestCase):
# Add a second project with the same id
models.Project.query.get('raclette')
- result = c.post("/create", data={
+ c.post("/create", data={
'name': 'Another raclette party',
- 'id': 'raclette', #already used !
+ 'id': 'raclette', # already used !
'password': 'party',
'contact_email': 'raclette@notmyidea.org'
})
@@ -144,21 +147,41 @@ class BudgetTestCase(TestCase):
# no new project added
self.assertEqual(len(models.Project.query.all()), 1)
+ def test_project_deletion(self):
+
+ with run.app.test_client() as c:
+ c.post("/create", data={
+ 'name': 'raclette party',
+ 'id': 'raclette',
+ 'password': 'party',
+ 'contact_email': 'raclette@notmyidea.org'
+ })
+
+ # project added
+ self.assertEqual(len(models.Project.query.all()), 1)
+
+ c.get('/raclette/delete')
+
+ # project removed
+ self.assertEqual(len(models.Project.query.all()), 0)
+
def test_membership(self):
self.post_project("raclette")
self.login("raclette")
# adds a member to this project
- self.app.post("/raclette/members/add", data={'name': 'alexis' })
+ self.app.post("/raclette/members/add", data={'name': 'alexis'})
self.assertEqual(len(models.Project.query.get("raclette").members), 1)
# adds him twice
- result = self.app.post("/raclette/members/add", data={'name': 'alexis' })
+ result = self.app.post("/raclette/members/add",
+ data={'name': 'alexis'})
+
# should not accept him
self.assertEqual(len(models.Project.query.get("raclette").members), 1)
# add fred
- self.app.post("/raclette/members/add", data={'name': 'fred' })
+ self.app.post("/raclette/members/add", data={'name': 'fred'})
self.assertEqual(len(models.Project.query.get("raclette").members), 2)
# check fred is present in the bills page
@@ -173,7 +196,7 @@ class BudgetTestCase(TestCase):
self.assertEqual(len(models.Project.query.get("raclette").members), 1)
# add fred again
- self.app.post("/raclette/members/add", data={'name': 'fred' })
+ self.app.post("/raclette/members/add", data={'name': 'fred'})
fred_id = models.Project.query.get("raclette").members[-1].id
# bound him to a bill
@@ -181,7 +204,7 @@ class BudgetTestCase(TestCase):
'date': '2011-08-10',
'what': u'fromage à raclette',
'payer': fred_id,
- 'payed_for': [fred_id,],
+ 'payed_for': [fred_id, ],
'amount': '25',
})
@@ -202,7 +225,7 @@ class BudgetTestCase(TestCase):
self.assertNotIn("fred", result.data)
# adding him again should reactivate him
- self.app.post("/raclette/members/add", data={'name': 'fred' })
+ self.app.post("/raclette/members/add", data={'name': 'fred'})
self.assertEqual(
len(models.Project.query.get("raclette").active_members), 2)
@@ -210,33 +233,46 @@ class BudgetTestCase(TestCase):
# project should not cause any troubles
self.post_project("randomid")
self.login("randomid")
- self.app.post("/randomid/members/add", data={'name': 'fred' })
+ self.app.post("/randomid/members/add", data={'name': 'fred'})
self.assertEqual(
len(models.Project.query.get("randomid").active_members), 1)
+ def test_person_model(self):
+ self.post_project("raclette")
+ self.login("raclette")
+
+ # adds a member to this project
+ self.app.post("/raclette/members/add", data={'name': 'alexis'})
+ alexis = models.Project.query.get("raclette").members[-1]
+
+ # should not have any bills
+ self.assertFalse(alexis.has_bills())
+
+ # bound him to a bill
+ self.app.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': u'fromage à raclette',
+ 'payer': alexis.id,
+ 'payed_for': [alexis.id, ],
+ 'amount': '25',
+ })
+
+ # should have a bill now
+ alexis = models.Project.query.get("raclette").members[-1]
+ self.assertTrue(alexis.has_bills())
+
def test_member_delete_method(self):
self.post_project("raclette")
self.login("raclette")
# adds a member to this project
- self.app.post("/raclette/members/add", data={'name': 'alexis' })
-
+ self.app.post("/raclette/members/add", data={'name': 'alexis'})
+
# try to remove the member using GET method
response = self.app.get("/raclette/members/1/delete")
self.assertEqual(response.status_code, 405)
def test_demo(self):
- # Test that it is possible to connect automatically by going onto /demo
- with run.app.test_client() as c:
- models.db.session.add(models.Project(id="demo", name=u"demonstration",
- password="demo", contact_email="demo@notmyidea.org"))
- models.db.session.commit()
- c.get("/demo")
-
- # session is updated
- self.assertEqual(session['demo'], 'demo')
-
- def test_demo(self):
# test that a demo project is created if none is defined
self.assertEqual([], models.Project.query.all())
self.app.get("/demo")
@@ -276,10 +312,11 @@ class BudgetTestCase(TestCase):
self.post_project("raclette")
# add two persons
- self.app.post("/raclette/members/add", data={'name': 'alexis' })
- self.app.post("/raclette/members/add", data={'name': 'fred' })
+ self.app.post("/raclette/members/add", data={'name': 'alexis'})
+ self.app.post("/raclette/members/add", data={'name': 'fred'})
- members_ids = [m.id for m in models.Project.query.get("raclette").members]
+ members_ids = [m.id for m in
+ models.Project.query.get("raclette").members]
# create a bill
self.app.post("/raclette/add", data={
@@ -289,12 +326,12 @@ class BudgetTestCase(TestCase):
'payed_for': members_ids,
'amount': '25',
})
- raclette = models.Project.query.get("raclette")
+ models.Project.query.get("raclette")
bill = models.Bill.query.one()
self.assertEqual(bill.amount, 25)
# edit the bill
- resp = self.app.post("/raclette/edit/%s" % bill.id, data={
+ self.app.post("/raclette/edit/%s" % bill.id, data={
'date': '2011-08-10',
'what': u'fromage à raclette',
'payer': members_ids[0],
@@ -343,9 +380,11 @@ class BudgetTestCase(TestCase):
'what': u'fromage à raclette',
'payer': members_ids[0],
'payed_for': members_ids,
- 'amount': '-25', # bill with a negative value should be converted to a positive value
+ # bill with a negative value should be converted to a positive
+ # value
+ 'amount': '-25'
})
- bill = models.Bill.query.filter(models.Bill.date=='2011-08-12')[0]
+ bill = models.Bill.query.filter(models.Bill.date == '2011-08-12')[0]
self.assertEqual(bill.amount, 25)
#add a bill with a comma
@@ -356,19 +395,19 @@ class BudgetTestCase(TestCase):
'payed_for': members_ids,
'amount': '25,02',
})
- bill = models.Bill.query.filter(models.Bill.date=='2011-08-01')[0]
+ bill = models.Bill.query.filter(models.Bill.date == '2011-08-01')[0]
self.assertEqual(bill.amount, 25.02)
def test_rounding(self):
self.post_project("raclette")
# add members
- self.app.post("/raclette/members/add", data={'name': 'alexis' })
- self.app.post("/raclette/members/add", data={'name': 'fred' })
- self.app.post("/raclette/members/add", data={'name': 'tata' })
+ self.app.post("/raclette/members/add", data={'name': 'alexis'})
+ self.app.post("/raclette/members/add", data={'name': 'fred'})
+ self.app.post("/raclette/members/add", data={'name': 'tata'})
# create bills
- req = self.app.post("/raclette/add", data={
+ self.app.post("/raclette/add", data={
'date': '2011-08-10',
'what': u'fromage à raclette',
'payer': 1,
@@ -376,7 +415,7 @@ class BudgetTestCase(TestCase):
'amount': '24.36',
})
- req2 = self.app.post("/raclette/add", data={
+ self.app.post("/raclette/add", data={
'date': '2011-08-10',
'what': u'red wine',
'payer': 2,
@@ -384,7 +423,7 @@ class BudgetTestCase(TestCase):
'amount': '19.12',
})
- req3 = self.app.post("/raclette/add", data={
+ self.app.post("/raclette/add", data={
'date': '2011-08-10',
'what': u'delicatessen',
'payer': 1,
@@ -395,7 +434,6 @@ class BudgetTestCase(TestCase):
balance = models.Project.query.get("raclette").balance
self.assertDictEqual(balance, {3: -8.12, 1: 8.12, 2: 0.0})
-
def test_edit_project(self):
# A project should be editable
@@ -491,7 +529,8 @@ class APITestCase(TestCase):
})
self.assertTrue(400, resp.status_code)
- self.assertEqual('{"contact_email": ["Invalid email address."]}', resp.data)
+ self.assertEqual('{"contact_email": ["Invalid email address."]}',
+ resp.data)
# create it
resp = self.api_create("raclette")
@@ -520,7 +559,7 @@ class APITestCase(TestCase):
self.assertDictEqual(json.loads(resp.data), expected)
# edit should work
- resp = self.app.put("/api/projects/raclette", data = {
+ resp = self.app.put("/api/projects/raclette", data={
"contact_email": "yeah@notmyidea.org",
"password": "raclette",
"name": "The raclette party",
@@ -665,7 +704,7 @@ class APITestCase(TestCase):
# edit with errors should return an error
req = self.app.put("/api/projects/raclette/bills/1", data={
- 'date': '201111111-08-10', # not a date
+ 'date': '201111111-08-10', # not a date
'what': u'fromage',
'payer': "1",
'payed_for': ["1", "2"],