# (c) cavaliba.com - tests / app_data.ipam malformed ipam_subnet keyname handling

from django.test import TestCase, override_settings
from django.urls import reverse

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


def _add_subnet_bypassing_validation(keyname, description=""):
    """Insert an ipam_subnet with a keyname that would be rejected by the
    normal dataformat-strict validation - mirrors how a legacy/pre-4.9.0 row
    (or a raw keyname.rename()) can leave an unaligned CIDR in the DB, same
    trick as tests/test_migrate_ipam_subnet_keyname.py."""

    helper.add_schema(classname="ipam_subnet", options={"keyname_mode": "edit"})
    helper.add_instance(
        classname="ipam_subnet", keyname=keyname, fields={"description": description}
    )
    helper.add_schema(
        classname="ipam_subnet", options={"keyname_mode": "dataformat ipv4 subnet strict"}
    )


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

    def test_build_subnet_rows_skips_malformed_entry_keeps_others(self):
        _add_subnet_bypassing_validation("203.0.113.0/24", description="good")
        _add_subnet_bypassing_validation("203.0.9.180/21", description="bad")

        subnets = [
            {"id": 1, "keyname": "203.0.113.0/24", "displayname": ""},
            {"id": 2, "keyname": "203.0.9.180/21", "displayname": ""},
        ]

        rows = build_subnet_rows(subnets, with_subnet_detail=True)

        self.assertEqual([row["keyname"] for row in rows], ["203.0.113.0/24"])

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_list_view_skips_malformed_subnet_instead_of_500(self):
        helper.add_admin_user(login="unittest")
        _add_subnet_bypassing_validation("203.0.113.0/24", description="good")
        _add_subnet_bypassing_validation("203.0.9.180/21", description="bad")

        response = self.client.get(
            reverse("app_data:instance_list", kwargs={"classname": "ipam_subnet"})
        )

        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "203.0.113.0/24")
        self.assertNotContains(response, "203.0.9.180/21")
