diff --git a/ihatemoney/tests/main_test.py b/ihatemoney/tests/main_test.py index 29ccda6f..7eefc0e4 100644 --- a/ihatemoney/tests/main_test.py +++ b/ihatemoney/tests/main_test.py @@ -4,16 +4,7 @@ import socket import unittest from unittest.mock import MagicMock, patch -from flask import ( - Blueprint, - abort, - flash, - g, - redirect, - render_template, - request, - url_for, -) +from flask import g, request, url_for from sqlalchemy import orm from werkzeug.security import check_password_hash @@ -174,6 +165,91 @@ class ModelsTestCase(IhatemoneyTestCase): pay_each_expected = 10 / 3 self.assertEqual(bill.amount / weight, pay_each_expected) + def test_remove_member(self): + # make project + self.post_project("raclette") + + # add members + self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2}) + self.client.post("/raclette/members/add", data={"name": "fred"}) + self.client.post("/raclette/members/add", data={"name": "tata"}) + + # make bills + self.client.post( + "/raclette/add", + data={ + "date": "2011-08-10", + "what": "red wine", + "payer": 1, + "payed_for": [2], + "amount": "20", + }, + ) + + project = models.Project.query.get_by_name(name="raclette") + + zorglub = models.Person.query.get_by_name(name="zorglub", project=project) + tata = models.Person.query.get_by_name(name="tata", project=project) + fred = models.Person.query.get_by_name(name="fred", project=project) + + g.project.remove_member(tata.id) + # tata should be fully removed because they are not connected to a bill + self.assertEqual(project.members, [zorglub, fred]) + + g.project.remove_member(zorglub.id) + + # zorglub is connected to a bill so they should be deactivated + self.assertEqual(project.members, [zorglub, fred]) + self.assertEqual(zorglub.activated, False) + + def test_deactivated_user_bill(self): + + self.post_project("raclette") + + # add members + self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2}) + self.client.post("/raclette/members/add", data={"name": "fred"}) + self.client.post("/raclette/members/add", data={"name": "tata"}) + + project = models.Project.query.get_by_name(name="raclette") + zorglub = models.Person.query.get_by_name(name="zorglub", project=project) + + self.client.post( + "/raclette/add", + data={ + "date": "2011-08-10", + "what": "red wine", + "payer": 1, + "payed_for": [2], + "amount": "20", + }, + ) + + g.project.remove_member(zorglub.id) + + self.client.post( + "/raclette/edit", + data={ + "date": "2011-08-10", + "what": "red wine", + "payer": 1, + "payed_for": [2], + "amount": "30", + }, + ) + + zorglub_bill = models.Bill.query.options( + orm.subqueryload(models.Bill.owers) + ).filter(models.Bill.owers.contains(zorglub)) + for bill in zorglub_bill: + id = bill.id + resp = self.client.post("/