# (c) cavaliba.com - tests / ipam / classify_query

from django.test import TestCase

from app_data.ipam import align_to_subnet, classify_query, is_ipv4, is_ipv4_subnet


class ClassifyQueryTest(TestCase):
    def test_full_ipv4_address_is_ip(self):
        self.assertEqual(classify_query("10.2.1.5"), ("ip", "10.2.1.5"))

    def test_aligned_cidr_is_subnet(self):
        self.assertEqual(classify_query("10.2.0.0/16"), ("subnet", "10.2.0.0/16"))

    def test_unaligned_cidr_is_aligned_subnet(self):
        self.assertEqual(classify_query("10.1.2.34/24"), ("subnet", "10.1.2.0/24"))

    def test_partial_prefix_one_octet_pads_to_slash8(self):
        self.assertEqual(classify_query("10"), ("subnet", "10.0.0.0/8"))

    def test_partial_prefix_two_octets_pads_to_slash16(self):
        self.assertEqual(classify_query("10.2"), ("subnet", "10.2.0.0/16"))

    def test_partial_prefix_trailing_dot_pads_to_slash16(self):
        self.assertEqual(classify_query("10.2."), ("subnet", "10.2.0.0/16"))

    def test_partial_prefix_three_octets_pads_to_slash24(self):
        self.assertEqual(classify_query("10.2.1"), ("subnet", "10.2.1.0/24"))

    def test_partial_prefix_out_of_range_octet_is_text(self):
        self.assertEqual(classify_query("10.999"), ("text", "10.999"))

    def test_five_segments_is_text_not_partial_prefix(self):
        self.assertEqual(classify_query("10.2.1.5.24"), ("text", "10.2.1.5.24"))

    def test_free_text_is_text(self):
        self.assertEqual(classify_query("PARIS-VLAN10"), ("text", "PARIS-VLAN10"))

    def test_ipv6_address_is_unsupported(self):
        self.assertEqual(classify_query("::1"), ("ipv6_unsupported", "::1"))

    def test_ipv6_range_is_unsupported(self):
        self.assertEqual(classify_query("2001:db8::/32"), ("ipv6_unsupported", "2001:db8::/32"))

    def test_empty_string_is_empty(self):
        self.assertEqual(classify_query(""), ("empty", ""))

    def test_whitespace_only_is_empty(self):
        self.assertEqual(classify_query("   "), ("empty", ""))

    def test_is_ipv4_rejects_ipv6(self):
        self.assertFalse(is_ipv4("::1"))

    def test_is_ipv4_accepts_v4(self):
        self.assertTrue(is_ipv4("10.2.1.5"))

    def test_is_ipv4_subnet_rejects_ipv6(self):
        self.assertFalse(is_ipv4_subnet("2001:db8::/32"))

    def test_is_ipv4_subnet_accepts_unaligned(self):
        self.assertTrue(is_ipv4_subnet("10.1.2.34/24"))

    def test_align_to_subnet(self):
        self.assertEqual(align_to_subnet("10.1.2.34/24"), "10.1.2.0/24")
