# (c) cavaliba.com - tests / ipam / cache2_ipam_subnet_index precise invalidation
# (Instance.cache_purge() in app_data/data.py, mirroring the existing _enumerate special-case)

from django.test import TestCase

import app_home.cache as cache
from app_ipam.common import IpamSubnet, get_subnet_index
from tests import helper


class IpamSubnetIndexInvalidationTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_schema(
            classname="ipam_subnet",
            options={"keyname_mode": "edit"},
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
                "subnet": {
                    "dataformat": "ipv4",
                    "dataformat_ext": "subnet strict",
                    "displayname": "Subnet",
                },
            },
        )

    def test_new_subnet_appears_without_manual_cache_clear(self):
        # warm the cache with the index as it stood before any new subnet exists
        before = {ref.subnet for ref in get_subnet_index()}
        self.assertNotIn("203.0.113.0/28", before)

        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.113.0/28",
            fields={"subnet": "203.0.113.0/28", "description": "new"},
        )

        after = {ref.subnet for ref in get_subnet_index()}
        self.assertIn("203.0.113.0/28", after)

    def test_edited_description_is_visible_without_manual_cache_clear(self):
        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.113.0/28",
            fields={"subnet": "203.0.113.0/28", "description": "before"},
        )
        # warm the cache
        get_subnet_index()

        helper.add_instance(
            classname="ipam_subnet",
            action="update",
            keyname="203.0.113.0/28",
            fields={"description": "after"},
        )

        index = get_subnet_index()
        ref = next(r for r in index if r.subnet == "203.0.113.0/28")
        self.assertEqual(ref.description, "after")

    def test_deleted_subnet_disappears_without_manual_cache_clear(self):
        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.113.0/28",
            fields={"subnet": "203.0.113.0/28", "description": "temp"},
        )
        # warm the cache
        before = {ref.subnet for ref in get_subnet_index()}
        self.assertIn("203.0.113.0/28", before)

        instance = IpamSubnet("203.0.113.0/28").instance
        instance.delete()

        after = {ref.subnet for ref in get_subnet_index()}
        self.assertNotIn("203.0.113.0/28", after)
