# (c) cavaliba.com - tests / ipam / IpamIP.get_related_objects (EAV + curated ipam_ip merge)

from django.test import TestCase

import app_home.cache as cache
from app_ipam.common import IpamIP
from tests import helper


class IpamIPLookupTest(TestCase):
    def setUp(self):
        cache.clear()

        helper.add_schema(
            classname="iplooktest",
            field_definition={
                "ip_address": {"dataformat": "ipv4", "displayname": "IP"},
            },
        )
        helper.add_schema(
            classname="ipam_ip",
            options={"keyname_mode": "edit"},
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
            },
        )

        helper.add_instance(
            classname="iplooktest", keyname="vm01", fields={"ip_address": "192.0.2.42"}
        )

    def test_eav_hit_is_found(self):
        ip = IpamIP("192.0.2.42")
        related = ip.get_related_objects()
        classnames_keynames = {(r.classname, r.keyname) for r in related}
        self.assertIn(("iplooktest", "vm01"), classnames_keynames)

    def test_curated_ipam_ip_with_no_ipv4_field_is_found_by_keyname(self):
        """ipam_ip has no ipv4-format field (its IP is the keyname) - it must still show up."""
        helper.add_instance(
            classname="ipam_ip", keyname="192.0.2.42", fields={"description": "gateway"}
        )
        ip = IpamIP("192.0.2.42")
        related = ip.get_related_objects()
        classnames_keynames = {(r.classname, r.keyname) for r in related}
        self.assertIn(("ipam_ip", "192.0.2.42"), classnames_keynames)
        self.assertIn(("iplooktest", "vm01"), classnames_keynames)

    def test_no_duplicate_rows_for_same_instance(self):
        ip = IpamIP("192.0.2.42")
        related = ip.get_related_objects()
        iids = [r.iid for r in related]
        self.assertEqual(len(iids), len(set(iids)))

    def test_unrelated_ip_returns_nothing(self):
        ip = IpamIP("203.0.113.5")
        related = ip.get_related_objects()
        self.assertEqual(list(related), [])
