From cedb2934b856336ecbd0bce8dc598ec29afce23f Mon Sep 17 00:00:00 2001 From: Zhongqi Ma <59981957+mzhongqi@users.noreply.github.com> Date: Sat, 10 Dec 2022 18:46:58 -0500 Subject: [PATCH 1/4] Updated checks for validate_name() in MemberForm() The database allows users to deactivate an account with a non-zero value, and create a new user with the same name, reactivating the previous user will allow two users of the same name. This change assures that new user names can not be the same as deactivated users with associated bills (Users that are not deleted from deactivation). --- ihatemoney/forms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py index 0fee9779..49b3db68 100644 --- a/ihatemoney/forms.py +++ b/ihatemoney/forms.py @@ -457,7 +457,6 @@ class MemberForm(FlaskForm): and Person.query.filter( Person.name == field.data, Person.project == self.project, - Person.activated, ).all() ): # NOQA raise ValidationError(_("This project already have this participant")) From dff1956c14f6e6e8dcbac6a25b119b2fadc57004 Mon Sep 17 00:00:00 2001 From: Zhongqi Ma <59981957+mzhongqi@users.noreply.github.com> Date: Sun, 11 Dec 2022 16:43:51 -0500 Subject: [PATCH 2/4] Update budget_test.py Added 2 tests checking for validate_name() in MemberForm() --- ihatemoney/tests/budget_test.py | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/ihatemoney/tests/budget_test.py b/ihatemoney/tests/budget_test.py index a3fc813f..1ac5b4c4 100644 --- a/ihatemoney/tests/budget_test.py +++ b/ihatemoney/tests/budget_test.py @@ -1846,6 +1846,70 @@ class TestBudget(IhatemoneyTestCase): # No bills, the previous one was not added assert "No bills" in resp.data.decode("utf-8") + def test_add_duplicate_user(self): + + ''' + Adding a user with same name as a deactivated user with 0 balance + and no associated bills should success + ''' + self.post_project("raclette") + self.login("raclette") + + # adds a member to this project + self.client.post("/raclette/members/add", data={"name": "zorglub"}) + + # delete user using POST method + self.client.post("/raclette/members/1/delete") + self.assertEqual(len(self.get_project("raclette").active_members), 0) + self.assertEqual(len(self.get_project("raclette").members), 0) + # try to add this deleted user should be successful + response = self.client.get("/raclette/members/add", data={"name": "zorglub"}) + self.assertEqual(len(self.get_project("raclette").members), 1) + self.assertEqual(response.status_code, 200) + + + def test_add_duplicate_user_with_balance(self): + ''' + Adding a user with same name as a deactivated user with non-zero balance + and associated bills should fail + ''' + self.post_project("raclette") + + # add two participants + self.client.post("/raclette/members/add", data={"name": "Alice"}) + self.client.post("/raclette/members/add", data={"name": "Bob"}) + + members_ids = [m.id for m in self.get_project("raclette").members] + + # create one bill + self.client.post( + "/raclette/add", + data={ + "date": "2011-08-10", + "what": "fromage à raclette", + "payer": members_ids[0], + "payed_for": members_ids, + "amount": "100", + }, + ) + + # deactivate Bob + self.client.post( + "/raclette/members/%s/delete" % self.get_project("raclette").members[-1].id + ) + + self.assertEqual(len(self.get_project("raclette").members), 2) + self.client.post("/raclette/members/add", data={"name": "Bob"}) + + # adding a user with the same name should fail + self.assertEqual(len(self.get_project("raclette").members), 2) + # The only active_member is Alice, this means adding a new Bob failed + self.assertEqual(len(self.get_project("raclette").active_members), 1) + + # Can't get this part to work + # response = self.client.get("/raclette/members/add", data={"name": "Bob"}) + # self.assertEqual(response.status_code, 405) + def test_session_projects_migration_to_list(self): """In https://github.com/spiral-project/ihatemoney/pull/1082, session["projects"] was migrated from a list to a dict. We need to handle this. From 0d7308fccb21a066d5ecdfff81e05de93fac9eec Mon Sep 17 00:00:00 2001 From: Baptiste Jonglez Date: Fri, 3 Feb 2023 20:50:24 +0100 Subject: [PATCH 3/4] Remove unused test --- ihatemoney/tests/budget_test.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/ihatemoney/tests/budget_test.py b/ihatemoney/tests/budget_test.py index 1ac5b4c4..c91fcb0c 100644 --- a/ihatemoney/tests/budget_test.py +++ b/ihatemoney/tests/budget_test.py @@ -1906,9 +1906,6 @@ class TestBudget(IhatemoneyTestCase): # The only active_member is Alice, this means adding a new Bob failed self.assertEqual(len(self.get_project("raclette").active_members), 1) - # Can't get this part to work - # response = self.client.get("/raclette/members/add", data={"name": "Bob"}) - # self.assertEqual(response.status_code, 405) def test_session_projects_migration_to_list(self): """In https://github.com/spiral-project/ihatemoney/pull/1082, session["projects"] From 43260d0dc4deae3064998c63f83ef332e4d9cd7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Sun, 5 Jan 2025 16:05:33 +0100 Subject: [PATCH 4/4] Fix the tests for user reactivation --- ihatemoney/tests/budget_test.py | 43 +++++++++++++++------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/ihatemoney/tests/budget_test.py b/ihatemoney/tests/budget_test.py index c91fcb0c..97c91a13 100644 --- a/ihatemoney/tests/budget_test.py +++ b/ihatemoney/tests/budget_test.py @@ -452,8 +452,8 @@ class TestBudget(IhatemoneyTestCase): result = self.client.get("/raclette/add") assert "jeanne" not in result.data.decode("utf-8") - # adding him again should reactivate him - self.client.post("/raclette/members/add", data={"name": "jeanne"}) + # it should be possible to reactivate him + self.client.post(f"/raclette/members/{jeanne_id}/reactivate") assert len(self.get_project("raclette").active_members) == 2 # adding an user with the same name as another user from a different @@ -1847,32 +1847,28 @@ class TestBudget(IhatemoneyTestCase): assert "No bills" in resp.data.decode("utf-8") def test_add_duplicate_user(self): - - ''' - Adding a user with same name as a deactivated user with 0 balance - and no associated bills should success - ''' + """ + Adding a user with the same name as a deactivated user with 0 balance + and no associated bills should succeed + """ self.post_project("raclette") self.login("raclette") - # adds a member to this project + # adds a member to this project and delete it right after. self.client.post("/raclette/members/add", data={"name": "zorglub"}) - - # delete user using POST method self.client.post("/raclette/members/1/delete") - self.assertEqual(len(self.get_project("raclette").active_members), 0) - self.assertEqual(len(self.get_project("raclette").members), 0) + assert len(self.get_project("raclette").active_members) == 0 + assert len(self.get_project("raclette").members) == 0 + # try to add this deleted user should be successful - response = self.client.get("/raclette/members/add", data={"name": "zorglub"}) - self.assertEqual(len(self.get_project("raclette").members), 1) - self.assertEqual(response.status_code, 200) - - + response = self.client.post("/raclette/members/add", data={"name": "zorglub"}) + assert len(self.get_project("raclette").members) == 1 + def test_add_duplicate_user_with_balance(self): - ''' - Adding a user with same name as a deactivated user with non-zero balance + """ + Adding a user with same name as a deactivated user with non-zero balance and associated bills should fail - ''' + """ self.post_project("raclette") # add two participants @@ -1898,14 +1894,13 @@ class TestBudget(IhatemoneyTestCase): "/raclette/members/%s/delete" % self.get_project("raclette").members[-1].id ) - self.assertEqual(len(self.get_project("raclette").members), 2) + assert len(self.get_project("raclette").members) == 2 self.client.post("/raclette/members/add", data={"name": "Bob"}) # adding a user with the same name should fail - self.assertEqual(len(self.get_project("raclette").members), 2) + assert len(self.get_project("raclette").members) == 2 # The only active_member is Alice, this means adding a new Bob failed - self.assertEqual(len(self.get_project("raclette").active_members), 1) - + assert len(self.get_project("raclette").active_members) == 1 def test_session_projects_migration_to_list(self): """In https://github.com/spiral-project/ihatemoney/pull/1082, session["projects"]