# (c) cavaliba.com - tests / ipam / subnet_list()

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

import app_home.cache as cache
from tests import helper


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class SubnetListTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")

        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_instance(
            classname="ipam_subnet",
            keyname="192.0.2.0/24",
            fields={"subnet": "192.0.2.0/24", "description": "site A"},
        )
        helper.add_instance(
            classname="ipam_subnet",
            keyname="198.51.100.0/24",
            fields={"subnet": "198.51.100.0/24", "description": "site B"},
        )

    def test_list_shows_all_subnets(self):
        response = self.client.get(reverse("app_ipam:subnet_list"))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "192.0.2.0/24")
        self.assertContains(response, "198.51.100.0/24")

    def test_query_filters_by_cidr_prefix(self):
        response = self.client.get(reverse("app_ipam:subnet_list"), {"query": "192.0.2."})
        self.assertContains(response, "192.0.2.0/24")
        self.assertNotContains(response, "198.51.100.0/24")

    def test_query_filters_by_description(self):
        response = self.client.get(reverse("app_ipam:subnet_list"), {"query": "site B"})
        self.assertContains(response, "198.51.100.0/24")
        self.assertNotContains(response, "192.0.2.0/24")

    def test_size_class_distinguishes_large_medium_small(self):
        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.0.0/16",
            fields={"subnet": "203.0.0.0/16", "description": "region"},
        )
        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.1.0/28",
            fields={"subnet": "203.0.1.0/28", "description": "vlan"},
        )
        cache.clear()
        response = self.client.get(reverse("app_ipam:subnet_list"))
        self.assertContains(response, "cv-ipam-size-large")
        self.assertContains(response, "cv-ipam-size-medium")  # the /24s from setUp
        self.assertContains(response, "cv-ipam-size-small")

    def test_occupancy_columns_and_progress_bar_present(self):
        # a /30 (4 addresses) with 2 hosts = 50% occupancy -> a clean, non-trivial pixel
        # width (widthratio(50, 100, 70) = 35px), unlike the setUp's /24 subnets where a
        # couple of hosts round down to 0px and wouldn't actually exercise the bar's sizing
        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.113.0/30",
            fields={"subnet": "203.0.113.0/30", "description": "tiny"},
        )
        helper.add_schema(
            classname="listocctest",
            field_definition={"ip_address": {"dataformat": "ipv4", "displayname": "IP"}},
        )
        helper.add_instance(
            classname="listocctest", keyname="h1", fields={"ip_address": "203.0.113.1"}
        )
        helper.add_instance(
            classname="listocctest", keyname="h2", fields={"ip_address": "203.0.113.2"}
        )
        cache.clear()
        response = self.client.get(reverse("app_ipam:subnet_list"))
        self.assertContains(response, 'class="progress-bar"')
        self.assertContains(response, 'style="width: 35px"')
