from django.contrib.auth.models import Permission
from django.test import TestCase
from django.urls import reverse
from model_bakery import baker
from pytest_django.asserts import assertRedirects

from club.models import Club, ClubRole, Membership
from core.baker_recipes import subscriber_user
from core.models import User


class TestSubscriptionPermission(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user: User = subscriber_user.make()
        cls.admin = baker.make(User, is_superuser=True)
        cls.club = baker.make(Club)
        role = baker.make(ClubRole, club=cls.club, is_board=True)
        baker.make(Membership, user=cls.user, club=cls.club, role=role)

    def test_give_permission(self):
        self.client.force_login(self.admin)
        response = self.client.post(
            reverse("subscription:perms"), {"groups": [self.club.board_group_id]}
        )
        assertRedirects(response, reverse("subscription:perms"))
        assert self.user.has_perm("subscription.add_subscription")

    def test_remove_permission(self):
        self.client.force_login(self.admin)
        response = self.client.post(reverse("subscription:perms"), {"groups": []})
        assertRedirects(response, reverse("subscription:perms"))
        assert not self.user.has_perm("subscription.add_subscription")

    def test_subscription_page_access(self):
        self.client.force_login(self.user)
        response = self.client.get(reverse("subscription:subscription"))
        assert response.status_code == 403

        self.club.board_group.permissions.add(
            Permission.objects.get(codename="add_subscription")
        )
        response = self.client.get(reverse("subscription:subscription"))
        assert response.status_code == 200
