# (c) cavaliba.com - tests / ipam / IpamVLAN (was an empty stub - bug fix)

from django.test import TestCase

import app_home.cache as cache
from app_ipam.common import IpamVLAN
from tests import helper


class IpamVLANTest(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",
                },
            },
        )
        helper.add_schema(
            classname="ipam_vlan",
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
                "vlan_id": {"dataformat": "int", "displayname": "VLAN ID"},
                "subnet": {
                    "dataformat": "schema",
                    "dataformat_ext": "ipam_subnet",
                    "cardinal_max": 0,
                    "displayname": "Subnet",
                },
            },
        )

        helper.add_instance(
            classname="ipam_subnet",
            keyname="10.9.0.64/28",
            fields={"subnet": "10.9.0.64/28", "description": "server vlan subnet"},
        )
        helper.add_instance(
            classname="ipam_vlan",
            keyname="TEST-VLAN50",
            fields={
                "displayname": "TEST Server VLAN",
                "description": "Servers",
                "vlan_id": 50,
                "subnet": ["10.9.0.64/28"],
            },
        )

    def test_vlan_fields_are_exposed(self):
        vlan = IpamVLAN("TEST-VLAN50")
        self.assertIsNotNone(vlan.instance)
        self.assertEqual(vlan.vlan, "TEST-VLAN50")
        self.assertEqual(vlan.description, "Servers")
        self.assertEqual(vlan.vlan_id, 50)

    def test_vlan_subnet_is_resolved_to_ipamsubnet(self):
        vlan = IpamVLAN("TEST-VLAN50")
        self.assertEqual(len(vlan.subnet), 1)
        self.assertEqual(vlan.subnet[0].subnet, "10.9.0.64/28")
        self.assertEqual(vlan.subnet[0].description, "server vlan subnet")

    def test_unknown_vlan_is_unbound(self):
        vlan = IpamVLAN("NO-SUCH-VLAN")
        self.assertIsNone(vlan.instance)
        self.assertEqual(vlan.subnet, [])

    def test_no_data_is_unbound(self):
        vlan = IpamVLAN(None)
        self.assertIsNone(vlan.instance)
