"""Tests for views: CatzOverviewView, NotifyOverviewView — auth gate and context.""" import pytest from django.test import Client from django.contrib.auth import get_user_model @pytest.fixture def client(): return Client() @pytest.fixture def superuser(db): User = get_user_model() user = User(username="admin", email="admin@test.local", is_superuser=True) user.set_password("testpass") user.save() return user @pytest.fixture def regular_user(db): User = get_user_model() user = User(username="regular", email="reg@test.local") user.set_password("testpass") user.save() return user @pytest.mark.django_db class TestCatzOverviewView: def test_unauthenticated_redirects_to_login(self, client): resp = client.get("/plugins/dns-bridge/catz/") assert resp.status_code in (302, 403) def test_regular_user_forbidden(self, client, regular_user): client.login(username="regular", password="testpass") resp = client.get("/plugins/dns-bridge/catz/") assert resp.status_code in (302, 403) def test_superuser_can_access(self, client, superuser): client.login(username="admin", password="testpass") resp = client.get("/plugins/dns-bridge/catz/") assert resp.status_code == 200 def test_context_contains_catalog_zones(self, client, superuser, catz_serial, make_zone): zone = make_zone(name="ctx.test") client.login(username="admin", password="testpass") resp = client.get("/plugins/dns-bridge/catz/") assert "catalog_zones" in resp.context cz_list = list(resp.context["catalog_zones"]) assert len(cz_list) >= 1 cz = next(c for c in cz_list if c.view_id == zone.view_id) assert cz.soa_serial == catz_serial def test_context_no_catalog_zones_when_empty(self, client, superuser): client.login(username="admin", password="testpass") resp = client.get("/plugins/dns-bridge/catz/") assert "catalog_zones" in resp.context assert list(resp.context["catalog_zones"]) == [] @pytest.mark.django_db class TestNotifyOverviewView: def test_unauthenticated_redirects_to_login(self, client): resp = client.get("/plugins/dns-bridge/notify/") assert resp.status_code in (302, 403) def test_regular_user_forbidden(self, client, regular_user): client.login(username="regular", password="testpass") resp = client.get("/plugins/dns-bridge/notify/") assert resp.status_code in (302, 403) def test_superuser_can_access(self, client, superuser): client.login(username="admin", password="testpass") resp = client.get("/plugins/dns-bridge/notify/") assert resp.status_code == 200 def test_context_contains_seen_clients(self, client, superuser, make_view): from netbox_dns_bridge.models import SeenTransferClients from django.utils import timezone view = make_view(name="notify-view") SeenTransferClients.objects.create( source_ip="192.0.2.1", view=view, last_seen=timezone.now() ) client.login(username="admin", password="testpass") resp = client.get("/plugins/dns-bridge/notify/") assert "seen_clients" in resp.context clients = list(resp.context["seen_clients"]) assert len(clients) == 1 assert clients[0].source_ip == "192.0.2.1" def test_seen_clients_ordered_by_ip(self, client, superuser, make_view): from netbox_dns_bridge.models import SeenTransferClients from django.utils import timezone view = make_view(name="ord-notify-view") now = timezone.now() for ip in ["10.0.0.3", "10.0.0.1", "10.0.0.2"]: SeenTransferClients.objects.create(source_ip=ip, view=view, last_seen=now) client.login(username="admin", password="testpass") resp = client.get("/plugins/dns-bridge/notify/") ips = [c.source_ip for c in resp.context["seen_clients"]] assert ips == ["10.0.0.1", "10.0.0.2", "10.0.0.3"]