# (c) cavaliba.com - tests / views / app_data:ipam_ip_jump (replaces app_ipam's ip_view)

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

import app_home.cache as cache
from app_data.models import DataInstance
from tests import helper


class ViewsIpamIpJumpTest(TestCase):
    def setUp(self):
        cache.clear()

    def test_unauthenticated_redirects_to_login(self):
        response = self.client.get(
            reverse("app_data:ipam_ip_jump"), {"ip": "10.1.1.1"}, follow=True
        )
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Sign in to your account", status_code=200)

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_existing_ip_redirects_to_instance_detail(self):
        helper.add_admin_user(login="unittest")
        helper.add_instance(classname="ipam_ip", fields={"displayname": "10.20.30.40"})

        from app_data.data import Instance

        ipam = Instance.from_keyname(classname="ipam_ip", keyname="0a141e28")
        self.assertIsNotNone(ipam)

        response = self.client.get(reverse("app_data:ipam_ip_jump"), {"ip": "10.20.30.40"})
        self.assertRedirects(
            response,
            reverse("app_data:instance_detail", kwargs={"id": ipam.id}),
            fetch_redirect_response=False,
        )

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_unknown_ip_redirects_to_list_without_creating(self):
        helper.add_admin_user(login="unittest")

        response = self.client.get(reverse("app_data:ipam_ip_jump"), {"ip": "10.20.30.41"})
        self.assertRedirects(
            response,
            reverse("app_data:instance_list", kwargs={"classname": "ipam_ip"})
            + "?query=10.20.30.41",
            fetch_redirect_response=False,
        )
        self.assertFalse(
            DataInstance.objects.filter(classname="ipam_ip", keyname="0a141e29").exists()
        )

    @override_settings(CAVALIBA_AUTH_MODE="unittest")
    def test_invalid_ip_redirects_to_list(self):
        helper.add_admin_user(login="unittest")

        response = self.client.get(reverse("app_data:ipam_ip_jump"), {"ip": "not-an-ip"})
        self.assertRedirects(
            response,
            reverse("app_data:instance_list", kwargs={"classname": "ipam_ip"}),
            fetch_redirect_response=False,
        )
