# (c) cavaliba.com - test / views / ipam_ip instance_detail hook

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 TestViewsIpamIpHook(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_hierarchy_rendered_on_ipam_ip_detail(self):
        helper.add_admin_user(login="unittest")
        helper.add_instance(
            classname="ipam_subnet",
            keyname="198.51.100.0/24",
            fields={"description": "hook test subnet description"},
        )
        helper.add_instance(
            classname="ipam_vlan",
            keyname="vlan_hook_test",
            fields={"displayname": "Hook Test VLAN", "subnet": "198.51.100.0/24"},
        )
        helper.add_instance(classname="ipam_ip", fields={"displayname": "198.51.100.42"})

        ipam = Instance.from_keyname(classname="ipam_ip", keyname="c633642a")
        self.assertIsNotNone(ipam)

        response = self.client.get(
            reverse("app_data:instance_detail", kwargs={"id": ipam.id}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Parent Subnets")
        self.assertContains(response, "198.51.100.0/24")
        self.assertContains(response, "hook test subnet description")
        self.assertContains(response, "Hook Test VLAN")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_hierarchy_hook_absent_for_other_schemas(self):
        helper.add_admin_user(login="unittest")
        helper.add_schema(classname="nothookedtest", displayname="Not hooked")
        helper.add_instance(classname="nothookedtest", keyname="obj1")

        from app_data.models import DataInstance

        obj = DataInstance.objects.get(classname="nothookedtest", keyname="obj1")
        response = self.client.get(
            reverse("app_data:instance_detail", kwargs={"id": obj.id}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "Parent Subnets")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_no_containing_subnet_message(self):
        # builtin 220-ipam.yml seeds 0.0.0.0/0, which contains every IPv4
        # address - remove it to legitimately reach the empty-hierarchy
        # branch end-to-end (already covered at the unit level in
        # test_ipam_ip_hierarchy.py for the invalid-ip / non-IPv4 cases)
        from app_data.models import DataInstance

        DataInstance.objects.filter(classname="ipam_subnet", keyname="0.0.0.0/0").delete()

        helper.add_admin_user(login="unittest")
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.99"})

        ipam = Instance.from_keyname(classname="ipam_ip", keyname="cb007163")
        self.assertIsNotNone(ipam)

        response = self.client.get(
            reverse("app_data:instance_detail", kwargs={"id": ipam.id}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "No containing subnet found")
