# (c) cavaliba.com - test / views / prototypes

from django.core.cache import cache as cache_django
from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from app_home.configuration import set_configuration
from tests import helper


class TestViewsPrototypes(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()

    def _enable_beta_preview(self):
        set_configuration(
            appname="home",
            keyname="BETA_PREVIEW",
            description="",
            page="home",
            order=100,
            value="yes",
        )
        cache.clear()

    def test_prototypes_index_noauth(self):
        response = self.client.get(reverse("app_home:prototypes_index"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Sign in to your account", status_code=200)

    def test_prototypes_index_noperm(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:prototypes_index"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "UI Prototypes", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_prototypes_index_beta_preview_off_redirects_to_admintools(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:prototypes_index"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Admin tools", status_code=200)
        self.assertNotContains(response, "Kitchen Sink", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_prototypes_index_beta_preview_on(self):
        helper.add_admin_user(login="unittest")
        self._enable_beta_preview()
        response = self.client.get(reverse("app_home:prototypes_index"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Kitchen Sink", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_prototypes_detail_known_slug(self):
        helper.add_admin_user(login="unittest")
        self._enable_beta_preview()
        response = self.client.get(
            reverse("app_home:prototypes_detail", kwargs={"slug": "kitchen-sink"}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Typography", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_prototypes_detail_unknown_slug_404(self):
        helper.add_admin_user(login="unittest")
        self._enable_beta_preview()
        response = self.client.get(
            reverse("app_home:prototypes_detail", kwargs={"slug": "does-not-exist"})
        )
        self.assertEqual(response.status_code, 404)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_admintools_hides_card_when_beta_preview_off(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:admintools"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "UI Prototypes", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_admintools_shows_card_when_beta_preview_on(self):
        helper.add_admin_user(login="unittest")
        self._enable_beta_preview()
        response = self.client.get(reverse("app_home:admintools"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "UI Prototypes", status_code=200)
        self.assertContains(response, reverse("app_home:prototypes_index"), status_code=200)
