From 73ae7666c156d02a9b234ca9c59839531b0195ca Mon Sep 17 00:00:00 2001 From: TitouanDor Date: Sun, 21 Jun 2026 18:11:37 +0200 Subject: [PATCH] ajout des tests --- club/api.py | 3 +- club/schemas.py | 4 +- club/tests/test_club_membership_controller.py | 192 ++++++++++++++++++ 3 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 club/tests/test_club_membership_controller.py diff --git a/club/api.py b/club/api.py index 39f1cba7..8115e92b 100644 --- a/club/api.py +++ b/club/api.py @@ -65,7 +65,7 @@ class UserClubController(ControllerBase): ) -@api_controller("/clubs/{club_id}/members/{since_date}") +@api_controller("/clubs/members/") class ClubMembershipController(ControllerBase): @route.get( "/new", @@ -94,6 +94,7 @@ class ClubMembershipController(ControllerBase): def fetch_former_club_members(self, filters: Query[MembershipFilterSchema]): """give all the former members of all clubs that have left since a given date""" memberships = Membership.objects.filter( + start_date__lt=filters.since_date, end_date__gte=filters.since_date, ) if filters.clubs_id is None: diff --git a/club/schemas.py b/club/schemas.py index 89acf9c2..10ea2411 100644 --- a/club/schemas.py +++ b/club/schemas.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import date from typing import Annotated from django.db.models import Q @@ -84,5 +84,5 @@ class UserMembershipSchema(ModelSchema): class MembershipFilterSchema(FilterSchema): - since_date: Annotated[datetime, FilterLookup("date__lte")] + since_date: Annotated[date, FilterLookup("date__lte")] clubs_id: set[int] | None = None diff --git a/club/tests/test_club_membership_controller.py b/club/tests/test_club_membership_controller.py new file mode 100644 index 00000000..73268634 --- /dev/null +++ b/club/tests/test_club_membership_controller.py @@ -0,0 +1,192 @@ +from datetime import date + +from django.contrib.auth.models import Permission +from django.test import TestCase +from django.urls import reverse +from model_bakery import baker + +from club.models import Club, ClubRole, Membership +from core.baker_recipes import subscriber_user +from core.models import User + + +class TestMembershipAPI(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = baker.make(User) + perm = Permission.objects.get(codename="view_club") + cls.user.user_permissions.add(perm) + cls.clubs = baker.make(Club, _quantity=3, is_active=True) + cls.roles = baker.make(ClubRole, _quantity=3, is_active=True) + + # Clean existing data to avoid side effects + Membership.objects.all().delete() + + cls.memberships = [ + # on going + Membership.objects.create( + club=cls.clubs[0], + user=subscriber_user.make(), + role=cls.roles[0], + start_date=date(2025, 1, 1), + end_date=None, + ), + # on going + Membership.objects.create( + club=cls.clubs[1], + user=subscriber_user.make(), + role=cls.roles[1], + start_date=date(2026, 5, 1), + end_date=None, + ), + # former + Membership.objects.create( + club=cls.clubs[1], + user=subscriber_user.make(), + role=cls.roles[2], + start_date=date(2024, 6, 1), + end_date=date(2025, 8, 1), + ), + # on going + Membership.objects.create( + club=cls.clubs[2], + user=subscriber_user.make(), + role=cls.roles[0], + start_date=date(2024, 1, 1), + end_date=None, + ), + # former + Membership.objects.create( + club=cls.clubs[1], + user=subscriber_user.make(), + role=cls.roles[2], + start_date=date(2025, 6, 1), + end_date=date(2025, 8, 1), + ), + # on going + Membership.objects.create( + club=cls.clubs[2], + user=subscriber_user.make(), + role=cls.roles[0], + start_date=date(2026, 6, 6), + end_date=None, + ), + # former + Membership.objects.create( + club=cls.clubs[0], + user=subscriber_user.make(), + role=cls.roles[0], + start_date=date(2020, 1, 1), + end_date=date(2025, 6, 8), + ), + # former + Membership.objects.create( + club=cls.clubs[2], + user=subscriber_user.make(), + role=cls.roles[0], + start_date=date(2020, 1, 1), + end_date=date(2025, 6, 8), + ), + ] + + +class TestNewMembershipAPI(TestMembershipAPI): + def test_new_membership_one_club(self): + assert self.user.has_perm("club.view_club") + self.client.force_login(self.user) + since_date = date(2025, 1, 1) + arg = {"since_date": since_date, "clubs_id": self.clubs[0].id} + url = reverse("api:get_new_clubs_members_since_date") + response = self.client.get(url, arg) + assert response.status_code == 200 + data = response.json() + + membership_ids = [e["id"] for e in data] + expected_ids = [self.memberships[0].id] + assert membership_ids == expected_ids + + def test_new_membership_multiple_club(self): + assert self.user.has_perm("club.view_club") + self.client.force_login(self.user) + since_date = date(2025, 1, 1) + arg = { + "since_date": since_date, + "clubs_id": [self.clubs[0].id, self.clubs[1].id], + } + url = reverse("api:get_new_clubs_members_since_date") + response = self.client.get(url, arg) + assert response.status_code == 200 + data = response.json() + + membership_ids = [e["id"] for e in data] + expected_ids = [self.memberships[0].id, self.memberships[1].id] + assert membership_ids == expected_ids + + def test_new_membership_all_clubs(self): + assert self.user.has_perm("club.view_club") + self.client.force_login(self.user) + since_date = date(2025, 1, 1) + arg = {"since_date": since_date} + url = reverse("api:get_new_clubs_members_since_date") + response = self.client.get(url, arg) + assert response.status_code == 200 + data = response.json() + + membership_ids = [e["id"] for e in data] + expected_ids = [ + self.memberships[0].id, + self.memberships[1].id, + self.memberships[5].id, + ] + assert membership_ids == expected_ids + + +class TestFormerMembershipAPI(TestMembershipAPI): + def test_former_membership_one_club(self): + assert self.user.has_perm("club.view_club") + self.client.force_login(self.user) + since_date = date(2025, 1, 1) + arg = {"since_date": since_date, "clubs_id": self.clubs[1].id} + url = reverse("api:get_former_clubs_members_since_date") + response = self.client.get(url, arg) + assert response.status_code == 200 + data = response.json() + + membership_ids = [e["id"] for e in data] + expected_ids = [self.memberships[2].id] + assert membership_ids == expected_ids + + def test_new_membership_multiple_club(self): + assert self.user.has_perm("club.view_club") + self.client.force_login(self.user) + since_date = date(2025, 1, 1) + arg = { + "since_date": since_date, + "clubs_id": [self.clubs[1].id, self.clubs[0].id], + } + url = reverse("api:get_former_clubs_members_since_date") + response = self.client.get(url, arg) + assert response.status_code == 200 + data = response.json() + + membership_ids = [e["id"] for e in data] + expected_ids = [self.memberships[6].id, self.memberships[2].id] + assert membership_ids == expected_ids + + def test_new_membership_all_clubs(self): + assert self.user.has_perm("club.view_club") + self.client.force_login(self.user) + since_date = date(2025, 1, 1) + arg = {"since_date": since_date} + url = reverse("api:get_former_clubs_members_since_date") + response = self.client.get(url, arg) + assert response.status_code == 200 + data = response.json() + + membership_ids = [e["id"] for e in data] + expected_ids = [ + self.memberships[6].id, + self.memberships[7].id, + self.memberships[2].id, + ] + assert membership_ids == expected_ids