# (c) cavaliba.com - tests / ipam / ip_list() - curated ipam_ip instances only, not EAV

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 IpListTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")

        helper.add_schema(
            classname="ipam_ip",
            options={"keyname_mode": "edit"},
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
            },
        )
        helper.add_instance(
            classname="ipam_ip",
            keyname="192.0.2.1",
            fields={"displayname": "Gateway", "description": "default gateway"},
        )
        helper.add_instance(
            classname="ipam_ip",
            keyname="192.0.2.2",
            fields={"displayname": "DNS server", "description": "primary resolver"},
        )

        # an unrelated schema with an ipv4 field - must never appear in this list, which is
        # scoped to curated ipam_ip instances only, not an EAV-wide scan
        helper.add_schema(
            classname="iplisttest",
            field_definition={"ip_address": {"dataformat": "ipv4", "displayname": "IP"}},
        )
        helper.add_instance(
            classname="iplisttest", keyname="host1", fields={"ip_address": "203.0.113.9"}
        )

    def test_list_shows_curated_ips_only(self):
        response = self.client.get(reverse("app_ipam:ip_list"))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "192.0.2.1")
        self.assertContains(response, "192.0.2.2")
        self.assertContains(response, "default gateway")
        self.assertNotContains(response, "203.0.113.9")

    def test_query_filters_by_description(self):
        response = self.client.get(reverse("app_ipam:ip_list"), {"query": "resolver"})
        self.assertContains(response, "192.0.2.2")
        self.assertNotContains(response, "192.0.2.1")

    def test_query_filters_by_keyname(self):
        response = self.client.get(reverse("app_ipam:ip_list"), {"query": "192.0.2.1"})
        self.assertContains(response, "192.0.2.1")
        self.assertNotContains(response, "192.0.2.2")

    def test_private_page_links_to_ip_list_with_count(self):
        response = self.client.get(reverse("app_ipam:private"))
        self.assertContains(response, "/ipam/private/ip/list/")
        self.assertContains(response, "IPAM IPs")
        self.assertContains(response, "2 IPs")
