Skip to content

Commit

Permalink
fix un bug qui permettait d'outrepasser l'abonnement pour le nombre d…
Browse files Browse the repository at this point in the history
…e membres
  • Loading branch information
AlexTraveylan committed Aug 11, 2024
1 parent e94cce4 commit ef5a99f
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 8 deletions.
48 changes: 40 additions & 8 deletions tasks_api/invitation/invitation_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,30 @@ def create_invitation(request: CustomRequest):
"""Create an invitation."""

family_members = request.member.family.members.all()
if (
len(family_members)
>= SUBSCRIPTION_PLANS_RESTRICTIONS[request.subcription_plan]["max_members"]
):

members_could_join = (
SUBSCRIPTION_PLANS_RESTRICTIONS[request.subcription_plan]["max_members"]
- family_members.count()
)

if members_could_join <= 0:
return JsonResponse(
{"message": "You have reached the maximum number of members."}, status=403
)

current_valid_invitations = Invitation.objects.filter(
family=request.member.family, expired_at__gt=timezone.now(), is_used=False
)

possible_in_use_invitations = current_valid_invitations.count()
max_current_invitations = members_could_join - possible_in_use_invitations

if max_current_invitations <= 0:
return JsonResponse(
{"message": "You have reached the maximum number of invitations."},
status=403,
)

new_code = create_random_invitation_code()
expire_date_one_week = timezone.now() + timezone.timedelta(days=7)

Expand All @@ -64,14 +80,30 @@ def create_invitation_with_email(
"""Create an invitation with email."""

family_members = request.member.family.members.all()
if (
len(family_members)
>= SUBSCRIPTION_PLANS_RESTRICTIONS[request.subcription_plan]["max_members"]
):

members_could_join = (
SUBSCRIPTION_PLANS_RESTRICTIONS[request.subcription_plan]["max_members"]
- family_members.count()
)

if members_could_join <= 0:
return JsonResponse(
{"message": "You have reached the maximum number of members."}, status=403
)

current_valid_invitations = Invitation.objects.filter(
family=request.member.family, expired_at__gt=timezone.now(), is_used=False
)

possible_in_use_invitations = current_valid_invitations.count()
max_current_invitations = members_could_join - possible_in_use_invitations

if max_current_invitations <= 0:
return JsonResponse(
{"message": "You have reached the maximum number of invitations."},
status=403,
)

new_code = create_random_invitation_code()
expire_date_one_week = timezone.now() + timezone.timedelta(days=7)

Expand Down
43 changes: 43 additions & 0 deletions tasks_api/tests/integration/test_invitation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import pytest
from django.utils import timezone

from tasks_api.family_settings.models import FamilySettings
from tasks_api.invitation.models import Invitation
from tasks_api.tests.factories import InvitationFactory

Expand Down Expand Up @@ -108,3 +109,45 @@ def test_clean_invitations(client, data_test):
assert should_not_be_deleted_cause_used in invitations
assert should_not_be_deleted_cause_not_family in invitations
assert should_be_deleted_cause_perimed not in invitations


@pytest.mark.django_db
def test_create_invitation_with_max_invitations(client, data_test):
"""Test the deletion of expired and unused invitations."""

# Given a family with 1 member and 1 invitation active with FREE plan (max_members = 2)
InvitationFactory(
family=data_test.family,
is_used=False,
expired_at=timezone.now() + timezone.timedelta(days=1),
)

# When I try to create a new invitation
headers = {"Authorization": f"Bearer {data_test.token.to_jwt_token()}"}
response = client.get("/api/invitation/", headers=headers)

# Then I should get a 403 error cause he can use the still active invitation
assert response.status_code == 403


@pytest.mark.django_db
def test_create_invitation_but_now_with_basic_plan(client, data_test):
"""Test the deletion of expired and unused invitations."""

# Given a family with 1 member and 1 invitation active with BASIC plan (max_members = 3)
settings = FamilySettings.objects.filter(family=data_test.family).first()
settings.subscription_plan = "BASIC"
settings.save()

InvitationFactory(
family=data_test.family,
is_used=False,
expired_at=timezone.now() + timezone.timedelta(days=1),
)

# When I try to create a new invitation
headers = {"Authorization": f"Bearer {data_test.token.to_jwt_token()}"}
response = client.get("/api/invitation/", headers=headers)

# Then I should get a 201 response, because he can have a 3rd member
assert response.status_code == 201

0 comments on commit ef5a99f

Please sign in to comment.