from unittest import mock from django.contrib.auth import get_user_model from django.core.management import call_command from django.test import TestCase, override_settings from django.utils import timezone from .markdown import render_markdown from .models import GuidePage User = get_user_model() def make_user(email, role): return User.objects.create_user( email=email, password="pass1234", role=role, full_name=email.split("@")[0], is_staff=True, ) def make_page(path, content="# Heading\n\nBody text", title=None): return GuidePage.objects.create( path=path, title=title or path.rsplit("/", 1)[-1], audience=GuidePage.map_audience(path), content=content, updated_at=timezone.now(), ) class GuideAudienceFilterTests(TestCase): def setUp(self): self.shared = make_page("user-guides/index", "# User Guides\n\nWelcome.", title="Landing Page") self.buyer = make_page("user-guides/buyer/getting-started", title="Getting Started Guide") self.buyer2 = make_page("user-guides/buyer/dashboard", title="Dashboard Guide") self.ops = make_page("user-guides/ops/batches", title="Ops Batches Guide") self.admin = make_page("user-guides/admin/overview", title="Admin Overview Guide") self.buyer_user = make_user("buyer@ixg.local", "buyer") self.ops_user = make_user("ops@ixg.local", "ops") self.admin_user = make_user("admin@ixg.local", "admin") def test_buyer_index_shows_shared_and_buyer_only(self): self.client.force_login(self.buyer_user) resp = self.client.get("/portal/help/") self.assertEqual(resp.status_code, 200) content = resp.content.decode() self.assertContains(resp, self.shared.title) self.assertContains(resp, self.buyer.title) self.assertContains(resp, self.buyer2.title) self.assertNotContains(resp, self.ops.title) self.assertNotContains(resp, self.admin.title) def test_ops_index_shows_shared_and_ops_only(self): self.client.force_login(self.ops_user) resp = self.client.get("/ops/help/") self.assertEqual(resp.status_code, 200) content = resp.content.decode() self.assertContains(resp, self.shared.title) self.assertContains(resp, self.ops.title) self.assertNotContains(resp, self.buyer.title) self.assertNotContains(resp, self.admin.title) def test_admin_index_sees_all(self): self.client.force_login(self.admin_user) for url in ("/portal/help/", "/ops/help/"): resp = self.client.get(url) self.assertEqual(resp.status_code, 200, msg=url) self.assertContains(resp, self.buyer.title, msg_prefix=url) self.assertContains(resp, self.ops.title, msg_prefix=url) self.assertContains(resp, self.admin.title, msg_prefix=url) def test_buyer_cannot_access_ops_or_admin_guide(self): self.client.force_login(self.buyer_user) resp = self.client.get("/portal/help/ops/batches/") self.assertEqual(resp.status_code, 404) resp = self.client.get("/portal/help/admin/overview/") self.assertEqual(resp.status_code, 404) def test_ops_cannot_access_buyer_guide(self): self.client.force_login(self.ops_user) resp = self.client.get("/ops/help/buyer/getting-started/") self.assertEqual(resp.status_code, 404) def test_buyer_can_access_buyer_guide(self): self.client.force_login(self.buyer_user) resp = self.client.get("/portal/help/buyer/getting-started/") self.assertEqual(resp.status_code, 200) self.assertContains(resp, "alert('x') world", "user-guides/buyer/test", "/portal/help/", ) self.assertNotIn("