mirror of
https://github.com/ae-utbm/sith.git
synced 2025-11-10 14:03:12 +00:00
93 lines
3.5 KiB
Python
93 lines
3.5 KiB
Python
from datetime import date, timedelta
|
|
|
|
import pytest
|
|
from django.contrib.auth.models import Permission
|
|
from django.test import Client, TestCase
|
|
from django.urls import reverse
|
|
from model_bakery import baker
|
|
from model_bakery.recipe import Recipe
|
|
from pytest_django.asserts import assertNumQueries
|
|
|
|
from club.models import Club, Membership
|
|
from core.baker_recipes import subscriber_user
|
|
from core.models import Group, Page, User
|
|
|
|
|
|
class TestClubSearch(TestCase):
|
|
@classmethod
|
|
def setUpTestData(cls):
|
|
cls.url = reverse("api:search_club")
|
|
cls.user = baker.make(
|
|
User, user_permissions=[Permission.objects.get(codename="access_lookup")]
|
|
)
|
|
# delete existing clubs to avoid side effect
|
|
groups = list(
|
|
Group.objects.exclude(club=None, club_board=None).values_list(
|
|
"id", flat=True
|
|
)
|
|
)
|
|
Page.objects.exclude(club=None).delete()
|
|
Club.objects.all().delete()
|
|
Group.objects.filter(id__in=groups).delete()
|
|
|
|
cls.clubs = baker.make(
|
|
Club,
|
|
_quantity=5,
|
|
name=iter(["AE", "ae 1", "Troll", "Dev AE", "pdf"]),
|
|
is_active=True,
|
|
)
|
|
|
|
def test_inactive_club(self):
|
|
self.client.force_login(self.user)
|
|
inactive_ids = {self.clubs[0].id, self.clubs[2].id}
|
|
Club.objects.filter(id__in=inactive_ids).update(is_active=False)
|
|
response = self.client.get(self.url, {"is_active": False})
|
|
assert response.status_code == 200
|
|
assert {d["id"] for d in response.json()["results"]} == inactive_ids
|
|
|
|
def test_excluded_id(self):
|
|
self.client.force_login(self.user)
|
|
response = self.client.get(self.url, {"exclude_ids": [self.clubs[1].id]})
|
|
assert response.status_code == 200
|
|
ids = {d["id"] for d in response.json()["results"]}
|
|
assert ids == {c.id for c in [self.clubs[0], *self.clubs[2:]]}
|
|
|
|
def test_club_search(self):
|
|
self.client.force_login(self.user)
|
|
response = self.client.get(self.url, {"search": "AE"})
|
|
assert response.status_code == 200
|
|
ids = {d["id"] for d in response.json()["results"]}
|
|
assert ids == {c.id for c in [self.clubs[0], self.clubs[1], self.clubs[3]]}
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestFetchClub:
|
|
@pytest.fixture()
|
|
def club(self):
|
|
club = baker.make(Club)
|
|
last_month = date.today() - timedelta(days=30)
|
|
yesterday = date.today() - timedelta(days=1)
|
|
membership_recipe = Recipe(Membership, club=club, start_date=last_month)
|
|
membership_recipe.make(end_date=None, _quantity=10, _bulk_create=True)
|
|
membership_recipe.make(end_date=yesterday, _quantity=10, _bulk_create=True)
|
|
return club
|
|
|
|
def test_fetch_club_members(self, client: Client, club: Club):
|
|
user = subscriber_user.make()
|
|
client.force_login(user)
|
|
res = client.get(reverse("api:fetch_club", kwargs={"club_id": club.id}))
|
|
assert res.status_code == 200
|
|
member_ids = {member["user"]["id"] for member in res.json()["members"]}
|
|
assert member_ids == set(
|
|
club.members.ongoing().values_list("user_id", flat=True)
|
|
)
|
|
|
|
def test_fetch_club_nb_queries(self, client: Client, club: Club):
|
|
user = subscriber_user.make()
|
|
client.force_login(user)
|
|
with assertNumQueries(6):
|
|
# - 4 queries for authentication
|
|
# - 2 queries for the actual data
|
|
res = client.get(reverse("api:fetch_club", kwargs={"club_id": club.id}))
|
|
assert res.status_code == 200
|