import pytest
from django.contrib.auth import get_user_model
from model_bakery import baker
from newsletter.models import NewsLetterReceipents

Users = get_user_model()


# Create your tests here.
@pytest.mark.django_db()
class TestNewsLetterReceipentsModel:
    def test_return_str_model(self):
        receipent = baker.make(NewsLetterReceipents)
        assert str(receipent) == receipent.email


@pytest.mark.django_db()
class TestNewsLetterReceipentsFetch:
    def setup_method(self):
        self.admin = baker.make(Users, is_staff=True)
        self.user = baker.make(Users, is_staff=False)

        self.receipent_1 = baker.make(NewsLetterReceipents)
        self.receipent_2 = baker.make(NewsLetterReceipents)

    def test_fetch_newsletter_receipents_by_non_admin_return_403(
        self, authenticate_user
    ):
        api_client = authenticate_user(user=self.user)

        response = api_client.get("/api/newsletter/")

        assert response.status_code == 403

    def test_fetch_newsletter_receipents_by_admin_return_403(self, authenticate_user):
        api_client = authenticate_user(user=self.admin)

        response = api_client.get("/api/newsletter/")

        assert response.status_code == 200
        assert response.data["count"] == 2


@pytest.mark.django_db()
class TestNewsLetterReceipentsCreate:
    def setup_method(self):
        self.subscriber = baker.make(NewsLetterReceipents, email="johndoe@gmail.com")

    def test_already_subscribed_user_subscribe_to_newsletter_return_400(
        self, authenticate_user
    ):
        api_client = authenticate_user()

        data = {"email": "johndoe@gmail.com"}

        response = api_client.post("/api/newsletter/", data=data)

        assert response.status_code == 400
        assert (
            response.data["message"]
            == f"Email '{data['email']}' is already subscribed to the newsletter."
        )

    def test_user_subscribe_to_newsletter_return_201(self, authenticate_user):
        api_client = authenticate_user()

        data = {"email": "test_user@example.com"}

        response = api_client.post("/api/newsletter/", data=data)

        assert response.status_code == 201
        assert response.data["message"] == "Successfully subscribed to newsletter."


@pytest.mark.django_db()
class TestNewsLetterReceipentsDelete:
    def setup_method(self):
        self.admin = baker.make(Users, is_staff=True)

        self.subscriber = baker.make(NewsLetterReceipents, email="johndoe@gmail.com")

    def test_delete_subscriber_by_non_admin_return_403(self, authenticate_user):
        api_client = authenticate_user()

        response = api_client.delete(f"/api/newsletter/{self.subscriber.id}/")

        assert response.status_code == 403

    def test_delete_subscriber_by_admin_return_204(self, authenticate_user):
        api_client = authenticate_user(user=self.admin)

        response = api_client.delete(f"/api/newsletter/{self.subscriber.id}/")

        assert response.status_code == 204
