# (c) cavaliba.com - tests / sirene / send confirmation modals (new message + update)

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.data import Instance
from tests import helper


class SireneConfirmModalViews(TestCase):
    def setUp(self):
        helper.add_admin_user(login="unittest")
        cache.clear()
        cache_django.clear()
        helper.add_instance(
            classname="sirene_message",
            keyname="msg01",
            fields={
                "category": "Incident",
                "severity": "Major",
                "content": "test content",
            },
        )
        self.instance = Instance.from_keyname(
            classname="sirene_message", keyname="msg01", expand=True
        )

    # new message
    # -----------

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_new_message_has_confirm_modal(self):
        response = self.client.get(reverse("app_sirene:new_message"), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "notifyConfirmModal", status_code=200)
        self.assertContains(response, "Confirm notification", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_new_message_has_no_direct_submit(self):
        # every Send button must open the modal: the only submit is the one in
        # the modal footer, bound to the form through form="cv-sirene-message-form"
        response = self.client.get(reverse("app_sirene:new_message"), follow=True)
        content = response.content.decode()
        self.assertNotIn('type="submit" name="submit_notify"', content)
        self.assertIn('form="cv-sirene-message-form"', content)
        self.assertIn('id="cv-sirene-message-form"', content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_new_message_form_is_closed(self):
        response = self.client.get(reverse("app_sirene:new_message"), follow=True)
        content = response.content.decode()
        self.assertEqual(content.count("<form"), content.count("</form>"))

    # update
    # ------

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_update_has_confirm_modal(self):
        response = self.client.get(
            reverse("app_sirene:update", args=[self.instance.id]), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "updateConfirmModal", status_code=200)
        self.assertContains(response, "Confirm update", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_update_has_no_direct_submit(self):
        response = self.client.get(
            reverse("app_sirene:update", args=[self.instance.id]), follow=True
        )
        content = response.content.decode()
        self.assertNotIn('type="submit" value="Send update', content)
        self.assertIn('form="cv-sirene-update-form"', content)
        self.assertIn('id="cv-sirene-update-form"', content)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_update_post_still_sends(self):
        # the modal must not change the POST contract of the view
        response = self.client.post(
            reverse("app_sirene:update", args=[self.instance.id]),
            {"content": "an update", "sms_content": "", "save": "1"},
            follow=True,
        )
        self.assertEqual(response.status_code, 200)
        instance = Instance.from_keyname(classname="sirene_message", keyname="msg01", expand=True)
        self.assertEqual(instance.fields["updated_by"].value[0], "unittest")

    # both pages keep the centered dialog
    # -----------------------------------

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_modals_are_vertically_centered(self):
        response = self.client.get(reverse("app_sirene:new_message"), follow=True)
        self.assertContains(response, "modal-dialog modal-dialog-centered", status_code=200)
        response = self.client.get(
            reverse("app_sirene:update", args=[self.instance.id]), follow=True
        )
        self.assertContains(response, "modal-dialog modal-dialog-centered", status_code=200)
