# (c) cavaliba.com - tests / app_home.migrator.delete_malformed_ipam_subnet

from django.test import TestCase

import app_home.cache as cache
from app_data.data import Instance
from app_home.migrator import delete_malformed_ipam_subnet
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 - simulates a row left over from a
    raw keyname.rename() or a pre-4.9.0 database, 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 DeleteMalformedIpamSubnetTest(TestCase):
    def setUp(self):
        cache.clear()

    def test_malformed_keyname_is_deleted(self):
        _add_subnet_bypassing_validation("203.0.9.180/21", description="bad")

        delete_malformed_ipam_subnet()

        self.assertIsNone(Instance.from_keyname(classname="ipam_subnet", keyname="203.0.9.180/21"))

    def test_well_formed_keyname_is_untouched(self):
        helper.add_instance(
            classname="ipam_subnet", keyname="203.0.113.0/24", fields={"description": "good"}
        )

        delete_malformed_ipam_subnet()

        self.assertIsNotNone(
            Instance.from_keyname(classname="ipam_subnet", keyname="203.0.113.0/24")
        )

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

        delete_malformed_ipam_subnet()

        self.assertIsNotNone(
            Instance.from_keyname(classname="ipam_subnet", keyname="203.0.113.0/24")
        )
        self.assertIsNone(Instance.from_keyname(classname="ipam_subnet", keyname="203.0.9.180/21"))

    def test_idempotent_on_second_run(self):
        _add_subnet_bypassing_validation("203.0.9.180/21", description="bad")

        delete_malformed_ipam_subnet()
        delete_malformed_ipam_subnet()

        self.assertIsNone(Instance.from_keyname(classname="ipam_subnet", keyname="203.0.9.180/21"))
