# (c) cavaliba.com - test / views / ipam_subnet 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 TestViewsIpamSubnetHook(TestCase):
    def setUp(self):
        cache.clear()
        cache_django.clear()

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

        subnet = Instance.from_keyname(classname="ipam_subnet", keyname="198.51.100.0/24")
        self.assertIsNotNone(subnet)

        response = self.client.get(
            reverse("app_data:instance_detail", kwargs={"id": subnet.id}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Subnet hierarchy and VLANs")
        self.assertContains(response, "198.51.100.0/24")
        self.assertContains(response, "hook subnet test")
        self.assertContains(response, "Subnet Hook VLAN")
        self.assertContains(response, "Technical info")
        self.assertContains(response, "198.51.100.0")  # first IP
        self.assertContains(response, "198.51.100.255")  # last IP
        self.assertContains(response, "255.255.255.0")  # netmask
        self.assertContains(response, "IPs in subnet")
        self.assertContains(response, "198.51.100.5")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_ip_list_referrer_shown_in_own_columns(self):
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname="subnethookreftest",
            field_definition={"ip_address": {"dataformat": "ipv4", "displayname": "IP"}},
        )
        helper.add_instance(
            classname="ipam_subnet",
            keyname="198.51.100.0/24",
            fields={"subnet": "198.51.100.0/24", "description": "hook subnet test"},
        )
        helper.add_instance(
            classname="subnethookreftest",
            keyname="refhost01",
            fields={"ip_address": "198.51.100.9"},
        )

        subnet = Instance.from_keyname(classname="ipam_subnet", keyname="198.51.100.0/24")
        response = self.client.get(
            reverse("app_data:instance_detail", kwargs={"id": subnet.id}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "subnethookreftest")
        self.assertContains(response, "refhost01")

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_ip_list_absent_for_wide_subnet(self):
        helper.add_admin_user(login="unittest")

        subnet = Instance.from_keyname(classname="ipam_subnet", keyname="10.0.0.0/8")
        self.assertIsNotNone(subnet)

        response = self.client.get(
            reverse("app_data:instance_detail", kwargs={"id": subnet.id}), follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, "IPs in subnet")

    @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="nothookedtest2", displayname="Not hooked")
        helper.add_instance(classname="nothookedtest2", keyname="obj1")

        from app_data.models import DataInstance

        obj = DataInstance.objects.get(classname="nothookedtest2", 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, "Subnet hierarchy and VLANs")
