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

from django.test import TestCase

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


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

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

        result = subnet_occupancy("203.0.113.0/24")

        self.assertEqual(result["count"], 2)
        self.assertAlmostEqual(result["percent"], 2 / 256 * 100, places=2)

    def test_excludes_ips_outside_the_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_occupancy("203.0.113.0/24")

        self.assertEqual(result["count"], 1)

    def test_boundary_addresses_included(self):
        # network and broadcast address themselves must count too
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.0"})
        helper.add_instance(classname="ipam_ip", fields={"displayname": "203.0.113.255"})

        result = subnet_occupancy("203.0.113.0/24")

        self.assertEqual(result["count"], 2)

    def test_narrow_subnet_no_size_gating(self):
        """Unlike app_ipam's cached compute_subnet_occupancy(), there's no
        CAVALIBA_IPAM_OCCUPANCY_MINPREFIX gate - always computed live."""
        helper.add_instance(classname="ipam_ip", fields={"displayname": "10.0.0.0"})

        result = subnet_occupancy("0.0.0.0/0")

        self.assertGreaterEqual(result["count"], 1)

    def test_invalid_cidr_returns_zero(self):
        self.assertEqual(subnet_occupancy("not-a-cidr"), {"count": 0, "percent": 0.0})

    def test_empty_subnet_is_zero_percent(self):
        result = subnet_occupancy("203.0.113.0/24")
        self.assertEqual(result, {"count": 0, "percent": 0.0})
