# (c) cavaliba.com - tests / ipam_ip auto-discovery from ipv4 fields

from django.test import TestCase

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


class IpamIpDiscoverTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_schema(
            classname="discotest",
            field_definition={
                "ip_address": {"dataformat": "ipv4", "displayname": "IP"},
            },
        )

    def test_pure_ip_creates_collected_ipam_ip(self):
        helper.add_instance(
            classname="discotest", keyname="host01", fields={"ip_address": "10.20.30.40"}
        )

        ipam = Instance.from_keyname(classname="ipam_ip", keyname="0a141e28")
        self.assertIsNotNone(ipam)
        self.assertEqual(ipam.displayname, "10.20.30.40")
        self.assertTrue(ipam.is_field_true("collected"))

    def test_existing_ipam_ip_entry_not_overwritten(self):
        helper.add_instance(classname="ipam_ip", fields={"displayname": "10.20.30.41"})
        ipam_before = Instance.from_keyname(classname="ipam_ip", keyname="0a141e29")
        self.assertIsNotNone(ipam_before)
        self.assertFalse(ipam_before.is_field_true("collected"))

        helper.add_instance(
            classname="discotest", keyname="host02", fields={"ip_address": "10.20.30.41"}
        )

        ipam_after = Instance.from_keyname(classname="ipam_ip", keyname="0a141e29")
        self.assertEqual(ipam_after.id, ipam_before.id)
        self.assertFalse(ipam_after.is_field_true("collected"))

    def test_subnet_field_not_discovered(self):
        helper.add_schema(
            classname="discotest2",
            field_definition={
                "subnet_field": {
                    "dataformat": "ipv4",
                    "dataformat_ext": "subnet",
                    "displayname": "Subnet",
                },
            },
        )
        helper.add_instance(
            classname="discotest2", keyname="net01", fields={"subnet_field": "10.20.40.0/24"}
        )

        ipam = Instance.from_keyname(classname="ipam_ip", keyname="0a142800")
        self.assertIsNone(ipam)
