"""
Tests for the default detail card view.
"""
from django.test import RequestFactory
from django.urls import reverse
from django.contrib.auth.models import AnonymousUser

from cards.views import DefaultCardDetailView
from users.models import User
from cards.tests.utils import CardFollowersMock


def test_default_card_detail_queryset(mocker):
    cards_mock = mocker.patch("cards.views.get_default_card_with_rating")
    request = RequestFactory().get(
        reverse("cards:default-card-detail", kwargs={"username": "user"}),
    )

    view = DefaultCardDetailView()
    view.setup(request)
    view.kwargs = {"username": "user"}
    view.get_object()

    cards_mock.assert_called_once()


def test_default_card_detail_user_in_card_followers(mocker):
    request = RequestFactory().get(
        reverse("cards:default-card-detail", kwargs={"username": "user"}),
    )
    user = User(username="test", email="test@example.com")
    request.user = user

    view = DefaultCardDetailView()
    view.setup(request)
    mocker.patch.object(view, "object", create=True)
    get_object_mock = mocker.patch.object(view, "get_object")
    get_object_mock.return_value = CardFollowersMock(user)
    context = view.get_context_data()

    assert context["favorite"]


def test_default_card_detail_user_not_in_card_followers(mocker):
    request = RequestFactory().get(
        reverse("cards:default-card-detail", kwargs={"username": "user"}),
    )
    user = User(username="test", email="test@example.com")
    request.user = user

    view = DefaultCardDetailView()
    view.setup(request)
    mocker.patch.object(view, "object", create=True)
    get_object_mock = mocker.patch.object(view, "get_object")
    get_object_mock.return_value = CardFollowersMock(AnonymousUser())
    context = view.get_context_data()

    assert not context["favorite"]


def test_default_card_detail_anonymouse_user_not_favorite(mocker):
    request = RequestFactory().get(
        reverse("cards:default-card-detail", kwargs={"username": "user"}),
    )
    request.user = AnonymousUser()

    view = DefaultCardDetailView()
    view.setup(request)
    mocker.patch.object(view, "object", create=True)
    mocker.patch.object(view, "get_object")
    context = view.get_context_data()

    assert not context["favorite"]
