# (c) cavaliba.com - tests / app_data.ipam.subnet_ip_list

from django.test import TestCase

import app_home.cache as cache
from app_data.ipam import subnet_ip_list
from tests import helper


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

    def test_lists_ips_within_subnet_ordered_by_keyname(self):
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.20"})
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.10"})

        result = subnet_ip_list("203.0.113.0/24")

        self.assertEqual([row["displayname"] for row in result], ["203.0.113.10", "203.0.113.20"])

    def test_excludes_ips_outside_subnet(self):
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.10"})
        helper.add_instance(classname="ipam_ip", fields={"displayname": "198.51.100.10"})

        result = subnet_ip_list("203.0.113.0/24")

        self.assertEqual(len(result), 1)
        self.assertEqual(result[0]["displayname"], "203.0.113.10")

    def test_collected_flag(self):
        helper.add_instance(
            classname="ipam_ip", fields={"displayname": "203.0.113.10", "collected": True}
        )

        result = subnet_ip_list("203.0.113.0/24")

        self.assertTrue(result[0]["collected"])

    def test_referrers_populated_from_eav(self):
        helper.add_instance(
            classname="iplisttest", keyname="host01", fields={"ip_address": "203.0.113.10"}
        )

        result = subnet_ip_list("203.0.113.0/24")

        self.assertEqual(len(result), 1)
        referrers = result[0]["referrers"]
        self.assertEqual(len(referrers), 1)
        self.assertEqual(referrers[0]["classname"], "iplisttest")
        self.assertEqual(referrers[0]["keyname"], "host01")

    def test_gated_to_small_subnets(self):
        """Default max_size=1024 (/22) - a /24 (256 addresses) is small
        enough, but 0.0.0.0/0 (the whole IPv4 space) is not."""
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.10"})

        self.assertEqual(len(subnet_ip_list("203.0.113.0/24")), 1)
        self.assertEqual(subnet_ip_list("0.0.0.0/0"), [])

    def test_max_size_parameter_overridable(self):
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.10"})

        self.assertEqual(subnet_ip_list("203.0.113.0/24", max_size=100), [])
        self.assertEqual(len(subnet_ip_list("203.0.113.0/24", max_size=256)), 1)

    def test_invalid_cidr_returns_empty(self):
        self.assertEqual(subnet_ip_list("not-a-cidr"), [])

    def test_empty_subnet_returns_empty(self):
        self.assertEqual(subnet_ip_list("203.0.113.0/24"), [])
