# (c) cavaliba.com - tests / ipam / click-through links in generic instance detail/list views
# (app_data/templates/app_data/fields/_datapoint.html and _datapoint_nolink.html)

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 ClickThroughTest(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_schema(
            classname="ipam_vlan",
            field_definition={
                "description": {"dataformat": "string", "displayname": "Description"},
                "subnet": {
                    "dataformat": "schema",
                    "dataformat_ext": "ipam_subnet",
                    "cardinal_max": 0,
                    "displayname": "Subnet",
                },
            },
        )
        helper.add_schema(
            classname="clicktest",
            field_definition={
                "ip_address": {"dataformat": "ipv4", "displayname": "IP"},
            },
        )
        # default dataview only shows keyname/displayname/last_update - add ip_address
        # explicitly so the list view (used by
        # test_plain_ipv4_field_links_to_ipam_ip_jump_in_list) actually renders it
        helper.add_instance(
            classname="_dataview",
            keyname="clicktest_default",
            fields={"target_class": "clicktest", "content": "columns:\n  - ip_address\n"},
        )

        helper.add_instance(
            classname="ipam_subnet",
            keyname="203.0.113.0/28",
            fields={"subnet": "203.0.113.0/28", "description": "test subnet"},
        )
        helper.add_instance(
            classname="ipam_vlan",
            keyname="CLICKVLAN",
            fields={"displayname": "Click VLAN", "subnet": ["203.0.113.0/28"]},
        )
        helper.add_instance(
            classname="clicktest", keyname="obj01", fields={"ip_address": "203.0.113.5"}
        )

    def test_plain_ipv4_field_links_to_ipam_ip_jump_in_detail(self):
        from app_data.models import DataInstance

        row = DataInstance.objects.get(classname="clicktest", keyname="obj01")
        response = self.client.get(reverse("app_data:instance_detail", args=[row.id]))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "/data/private/ipam_ip/jump/?ip=203.0.113.5")

    def test_plain_ipv4_field_links_to_ipam_ip_jump_in_list(self):
        response = self.client.get(reverse("app_data:instance_list", args=["clicktest"]))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "/data/private/ipam_ip/jump/?ip=203.0.113.5")

    def test_plain_ipv4_subnet_field_links_to_ipam_subnet_list(self):
        from app_data.models import DataInstance

        row = DataInstance.objects.get(classname="ipam_subnet", keyname="203.0.113.0/28")
        response = self.client.get(reverse("app_data:instance_detail", args=[row.id]))
        self.assertContains(
            response,
            reverse("app_data:instance_list", kwargs={"classname": "ipam_subnet"})
            + "?query=203.0.113.0/28",
        )

    def test_ipam_vlan_schema_field_links_to_ipam_subnet_instance_detail(self):
        from app_data.data import Instance
        from app_data.models import DataInstance

        row = DataInstance.objects.get(classname="ipam_vlan", keyname="CLICKVLAN")
        subnet = Instance.from_keyname(classname="ipam_subnet", keyname="203.0.113.0/28")
        response = self.client.get(reverse("app_data:instance_detail", args=[row.id]))
        self.assertContains(response, reverse("app_data:instance_detail", kwargs={"id": subnet.id}))

    def test_ipam_vlan_field_links_to_vlan_view_in_list(self):
        response = self.client.get(reverse("app_data:instance_list", args=["ipam_vlan"]))
        self.assertEqual(response.status_code, 200)
