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

from django.test import TestCase

import app_home.cache as cache
from app_data.data import Instance
from app_data.keyname import rename
from app_home.migrator import migrate_ipam_subnet_dataview_keyname


def _revert_to_pre_4_10_0_name():
    """Simulate a pre-5.0.0 database: the builtin ipam_subnet list dataview
    still named "ipam_subnet" (bootstrap always creates it under the current,
    already-renamed "ipam_subnet_default" - this undoes that so a test can
    exercise the migration itself)."""
    report = rename(
        classname="_dataview", oldkeyname="ipam_subnet_default", newkeyname="ipam_subnet",
        dryrun=False,
    )  # fmt: skip
    assert not report["errors"], report["errors"]


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

    def test_renames_old_keyname_to_default(self):
        _revert_to_pre_4_10_0_name()

        migrate_ipam_subnet_dataview_keyname()

        self.assertIsNone(Instance.from_keyname(classname="_dataview", keyname="ipam_subnet"))
        renamed = Instance.from_keyname(classname="_dataview", keyname="ipam_subnet_default")
        self.assertIsNotNone(renamed)
        self.assertEqual(renamed.fields["target_class"].get_value(), ["ipam_subnet"])

    def test_already_renamed_is_noop(self):
        # bootstrap already created it as "ipam_subnet_default" - nothing to do
        migrate_ipam_subnet_dataview_keyname()

        self.assertIsNotNone(
            Instance.from_keyname(classname="_dataview", keyname="ipam_subnet_default")
        )

    def test_idempotent_second_run(self):
        _revert_to_pre_4_10_0_name()

        migrate_ipam_subnet_dataview_keyname()
        migrate_ipam_subnet_dataview_keyname()

        renamed = Instance.from_keyname(classname="_dataview", keyname="ipam_subnet_default")
        self.assertIsNotNone(renamed)
