From 50977078d04b286ddcad7481ba4c2735b3313ead Mon Sep 17 00:00:00 2001 From: MilouH Date: Thu, 3 Apr 2025 10:58:16 +0200 Subject: [PATCH] Make the tests work with the model --- ihatemoney/tests/main_test.py | 196 ++++++++++++++++++++++++++++++---- 1 file changed, 174 insertions(+), 22 deletions(-) diff --git a/ihatemoney/tests/main_test.py b/ihatemoney/tests/main_test.py index b59865e8..d4b3ea4a 100644 --- a/ihatemoney/tests/main_test.py +++ b/ihatemoney/tests/main_test.py @@ -294,16 +294,15 @@ class TestModels(IhatemoneyTestCase): class TestBillFiltering(IhatemoneyTestCase): - def setUp(self): - """Set up a test project with members and bills.""" - super().setUp() + def test_filter_by_payer(self): + """Test filtering by payer ID""" self.post_project("raclette") - # Add members + # add members self.client.post("/raclette/members/add", data={"name": "Alice"}) self.client.post("/raclette/members/add", data={"name": "Bob"}) - # Create bills + # create bills self.client.post( "/raclette/add", data={ @@ -327,35 +326,188 @@ class TestBillFiltering(IhatemoneyTestCase): }, ) - def test_filter_by_payer(self): - """Test filtering by payer ID""" - response = self.client.get("/raclette/?payer=1", follow_redirects=True) - assert b"Cheese" in response.data # Bill paid by Alice - assert b"Wine" not in response.data # Bill paid by Bob + # alice paid for cheese + bills = models.Bill.query.filter(models.Bill.payer_id == 1).all() + assert len(bills) == 1 + assert bills[0].what == "Cheese" + + # bob paid for wine + bills = models.Bill.query.filter(models.Bill.payer_id == 2).all() + assert len(bills) == 1 + assert bills[0].what == "Wine" def test_filter_by_amount_range(self): """Test filtering by amount range""" - response = self.client.get("/raclette/?amount_min=20", follow_redirects=True) - assert b"Wine" in response.data # Wine is 25 - assert b"Cheese" not in response.data # Cheese is 15 + self.post_project("raclette") + + # add members + self.client.post("/raclette/members/add", data={"name": "Alice"}) + self.client.post("/raclette/members/add", data={"name": "Bob"}) + + # create bills + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-01", + "what": "Cheese", + "payer": 1, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "15.0", + }, + ) + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-05", + "what": "Wine", + "payer": 2, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "25.0", + }, + ) + + # only wine is more than 20 + bills = models.Bill.query.filter(models.Bill.amount >= 20).all() + assert len(bills) == 1 + assert bills[0].what == "Wine" + + # only cheese is less than 20 + bills = models.Bill.query.filter(models.Bill.amount <= 20).all() + assert len(bills) == 1 + assert bills[0].what == "Cheese" def test_filter_by_date_range(self): """Test filtering by date range""" - response = self.client.get("/raclette/?date_from=2024-03-02", follow_redirects=True) - assert b"Wine" in response.data # Wine is on March 5 - assert b"Cheese" not in response.data # Cheese is on March 1 + self.post_project("raclette") + + # add members + self.client.post("/raclette/members/add", data={"name": "Alice"}) + self.client.post("/raclette/members/add", data={"name": "Bob"}) + + # create bills + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-01", + "what": "Cheese", + "payer": 1, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "15.0", + }, + ) + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-05", + "what": "Wine", + "payer": 2, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "25.0", + }, + ) + + # wine is March 5th + bills = models.Bill.query.filter(models.Bill.date >= "2024-03-02").all() + assert len(bills) == 1 + assert bills[0].what == "Wine" + + # cheese is March 1st + bills = models.Bill.query.filter(models.Bill.date <= "2024-03-04").all() + assert len(bills) == 1 + assert bills[0].what == "Cheese" def test_filter_by_search_term(self): """Test filtering by search query""" - response = self.client.get("/raclette/?search=Cheese", follow_redirects=True) - assert b"Cheese" in response.data - assert b"Wine" not in response.data + self.post_project("raclette") + + # add members + self.client.post("/raclette/members/add", data={"name": "Alice"}) + self.client.post("/raclette/members/add", data={"name": "Bob"}) + + # create bills + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-01", + "what": "Cheese", + "payer": 1, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "15.0", + }, + ) + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-05", + "what": "Wine", + "payer": 2, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "25.0", + }, + ) + + bills = models.Bill.query.filter(models.Bill.what.ilike("%Cheese%")).all() + assert len(bills) == 1 + assert bills[0].what == "Cheese" + + bills = models.Bill.query.filter(models.Bill.what.ilike("%Che%")).all() + assert len(bills) == 1 + assert bills[0].what == "Cheese" + + bills = models.Bill.query.filter(models.Bill.what.ilike("%Pizza%")).all() + assert len(bills) == 0 def test_filter_combination(self): """Test filtering by multiple criteria""" - response = self.client.get("/raclette/?payer=1&amount_max=20", follow_redirects=True) - assert b"Cheese" in response.data # Cheese fits both conditions - assert b"Wine" not in response.data # Wrong payer & too expensive + + self.post_project("raclette") + + # add members + self.client.post("/raclette/members/add", data={"name": "Alice"}) + self.client.post("/raclette/members/add", data={"name": "Bob"}) + + # create bills + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-01", + "what": "Cheese", + "payer": 1, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "15.0", + }, + ) + self.client.post( + "/raclette/add", + data={ + "date": "2024-03-05", + "what": "Wine", + "payer": 2, + "payed_for": [1, 2], + "bill_type": "Expense", + "amount": "25.0", + }, + ) + + # only alice's cheese should match + bills = models.Bill.query.filter( + models.Bill.payer_id == 1, models.Bill.amount <= 20 + ).all() + assert len(bills) == 1 + assert bills[0].what == "Cheese" + + # no bills match + bills = models.Bill.query.filter( + models.Bill.payer_id == 2, models.Bill.amount <= 20 + ).all() + assert len(bills) == 0 class TestEmailFailure(IhatemoneyTestCase):