# (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_ip_view_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_ip_view_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, "/ipam/private/ip/?ip=203.0.113.5")

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

    def test_ipam_subnet_field_links_to_subnet_view_not_instance_detail(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, "/ipam/private/subnet/?subnet=203.0.113.0/28")

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

        row = DataInstance.objects.get(classname="ipam_vlan", keyname="CLICKVLAN")
        response = self.client.get(reverse("app_data:instance_detail", args=[row.id]))
        self.assertContains(response, "/ipam/private/subnet/?subnet=203.0.113.0/28")

    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)
