# (c) cavaliba.com - tests / ipam / private() landing page dispatcher

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

    def test_ip_query_redirects_to_ipam_ip_jump(self):
        response = self.client.get(reverse("app_data:ipam_private"), {"query": "10.2.1.5"})
        self.assertRedirects(
            response,
            "/data/private/ipam_ip/jump/?ip=10.2.1.5",
            fetch_redirect_response=False,
        )

    def test_subnet_query_redirects_to_existing_instance_detail(self):
        helper.add_instance(
            classname="ipam_subnet",
            keyname="10.1.2.0/24",
            fields={"subnet": "10.1.2.0/24"},
        )
        from app_data.data import Instance

        subnet = Instance.from_keyname(classname="ipam_subnet", keyname="10.1.2.0/24")

        response = self.client.get(reverse("app_data:ipam_private"), {"query": "10.1.2.34/24"})
        self.assertRedirects(
            response,
            reverse("app_data:instance_detail", kwargs={"id": subnet.id}),
            fetch_redirect_response=False,
        )

    def test_subnet_query_falls_back_to_list_when_unregistered(self):
        response = self.client.get(reverse("app_data:ipam_private"), {"query": "10.2"})
        self.assertRedirects(
            response,
            reverse("app_data:instance_list", kwargs={"classname": "ipam_subnet"})
            + "?query=10.2.0.0%2F16",
            fetch_redirect_response=False,
        )

    def test_text_query_redirects_to_ipam_vlan_list(self):
        response = self.client.get(reverse("app_data:ipam_private"), {"query": "PARIS-VLAN10"})
        self.assertRedirects(
            response,
            reverse("app_data:instance_list", kwargs={"classname": "ipam_vlan"})
            + "?query=PARIS-VLAN10",
            fetch_redirect_response=False,
        )

    def test_ipv6_query_stays_on_page_with_error(self):
        response = self.client.get(reverse("app_data:ipam_private"), {"query": "::1"})
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "IPv6")

    def test_no_query_renders_landing_page(self):
        response = self.client.get(reverse("app_data:ipam_private"))
        self.assertEqual(response.status_code, 200)
