# (c) cavaliba.com - tests / views / admintools keyname rename - access & form

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_data.models import DataInstance
from tests import helper


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

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

    def test_non_admin_user_denied(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:admintools_keyname"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "Rename a keyname", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_access_with_permission(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:admintools_keyname"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Rename a keyname", status_code=200)
        self.assertContains(response, "Dry run", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_schema_dropdown_lists_schemas(self):
        helper.add_admin_user(login="unittest")
        helper.add_schema("tkn_drop", displayname="Dropdown Schema")
        response = self.client.get(reverse("app_home:admintools_keyname"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'value="tkn_drop"', status_code=200)
        self.assertContains(response, "Dropdown Schema", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_force_checkbox_present(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:admintools_keyname"), follow=True)
        self.assertContains(response, 'name="force"', status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_entry_present_on_admintools_page(self):
        helper.add_admin_user(login="unittest")
        response = self.client.get(reverse("app_home:admintools"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Rename an instance keyname", status_code=200)
        self.assertContains(response, reverse("app_home:admintools_keyname"), status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_admintools_without_keyname_rename_hides_form(self):
        helper.add_user_with_perm(login="unittest", perms=["p_home_access", "p_admintools"])
        response = self.client.get(reverse("app_home:admintools_keyname"), follow=True)
        self.assertEqual(response.status_code, 200)
        # page renders (p_admintools granted) but the form is replaced by an alert
        self.assertContains(response, "Rename a keyname", status_code=200)
        self.assertContains(response, "p_keyname_rename permission is required", status_code=200)
        self.assertNotContains(response, 'name="oldkeyname"', status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_post_without_keyname_rename_is_refused(self):
        helper.add_user_with_perm(login="unittest", perms=["p_home_access", "p_admintools"])
        helper.add_schema("tkn_deny")
        helper.add_instance("tkn_deny", "deny_old")

        response = self.client.post(
            reverse("app_home:admintools_keyname"),
            {
                "mode": "real",
                "classname": "tkn_deny",
                "oldkeyname": "deny_old",
                "newkeyname": "deny_new",
            },
            follow=True,
        )
        self.assertEqual(response.status_code, 200)
        self.assertTrue(
            DataInstance.objects.filter(classname="tkn_deny", keyname="deny_old").exists()
        )
        self.assertFalse(
            DataInstance.objects.filter(classname="tkn_deny", keyname="deny_new").exists()
        )
