# (c) cavaliba.com - tests / ipam_ip related objects (matched by IP, not keyname)

from django.test import TestCase

import app_home.cache as cache
from app_data.data import Instance
from tests import helper


class IpamIpRelatedTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_schema(
            classname="reltest",
            field_definition={
                "ip_address": {"dataformat": "ipv4", "displayname": "IP"},
            },
        )
        helper.add_instance(
            classname="reltest", keyname="host01", fields={"ip_address": "10.40.40.40"}
        )

    def _get_ipam_ip(self):
        return Instance.from_keyname(classname="ipam_ip", keyname="0a282828")

    def test_related_finds_referencing_instance_by_ip(self):
        ipam = self._get_ipam_ip()
        self.assertIsNotNone(ipam)

        related = ipam.related()

        self.assertIn("reltest", related)
        self.assertEqual(related["reltest"]["count"], 1)
        keynames = {i.keyname for i in related["reltest"]["instances"]}
        self.assertIn("host01", keynames)

    def test_related_generic_lookup_by_keyname_finds_nothing(self):
        """Sanity check: the hex keyname itself is never written anywhere,
        so the *generic* get_related() path (classname:keyname match) would
        find nothing - this is exactly why ipam_ip needs the special case."""
        from app_data.related import get_related

        ipam = self._get_ipam_ip()
        generic = get_related(classname="ipam_ip", keyname=ipam.keyname)
        self.assertEqual(generic.get("reltest", {}).get("count", 0), 0)

    def test_related_respects_aaa_permission_filtering(self):
        ipam = self._get_ipam_ip()

        related_open = ipam.related(aaa={"perms": ["p_data_admin"]})
        self.assertIn("reltest", related_open)

        related_denied = ipam.related(aaa={"perms": []})
        self.assertNotIn("reltest", related_denied)
