from datetime import timedelta from django.contrib.auth import get_user_model from django.test import Client, TestCase from django.urls import reverse from django.utils import timezone from analytics.models import PageView, UTMVisit class PublicPageViewTests(TestCase): def setUp(self): self.client = Client() def test_home_records_page_view(self): response = self.client.get("/") self.assertEqual(response.status_code, 200) self.assertEqual(PageView.objects.count(), 1) self.assertEqual(PageView.objects.get().path, "/") def test_about_records_page_view(self): self.client.get(reverse("public:about")) self.assertEqual(PageView.objects.filter(path="/about/").count(), 1) def test_plain_visit_does_not_create_utm_visit(self): self.client.get("/") self.assertEqual(PageView.objects.count(), 1) self.assertEqual(UTMVisit.objects.count(), 0) def test_utm_hit_records_both(self): self.client.get("/?utm_source=test&utm_campaign=demo") self.assertEqual(PageView.objects.count(), 1) self.assertEqual(UTMVisit.objects.count(), 1) def test_healthz_not_recorded(self): self.client.get("/healthz/") self.assertEqual(PageView.objects.count(), 0) def test_portal_and_admin_not_recorded(self): self.client.get("/portal/") self.client.get("/admin/") self.assertEqual(PageView.objects.count(), 0) def test_robots_and_sitemap_not_recorded(self): self.client.get("/robots.txt") self.client.get("/sitemap.xml") self.assertEqual(PageView.objects.count(), 0) def test_missing_page_not_recorded(self): response = self.client.get("/not-a-real-page/") self.assertEqual(response.status_code, 404) self.assertEqual(PageView.objects.count(), 0) def test_contact_post_not_recorded(self): self.client.post(reverse("public:contact"), {}) self.assertEqual(PageView.objects.count(), 0) class AnalyticsReportTests(TestCase): def setUp(self): self.client = Client() user = get_user_model().objects.create_user( username="monica", password="pass-word-1" ) self.client.force_login(user) def test_views_card_uses_public_pageviews(self): self.client.get("/") self.client.get(reverse("public:about")) self.client.get(reverse("public:about")) stale = PageView.objects.create(path="/terms/") PageView.objects.filter(pk=stale.pk).update( created_at=timezone.now() - timedelta(days=31) ) response = self.client.get(reverse("analytics:report")) self.assertEqual(response.status_code, 200) self.assertEqual(response.context["pageviews_last_30_days"], 3) top = {row["path"]: row["count"] for row in response.context["top_pages"]} self.assertEqual(top["/about/"], 2) self.assertEqual(top["/"], 1) self.assertNotIn("/terms/", top) self.assertContains(response, "Top pages") self.assertContains(response, "/about/")