"""Tests für Cookie-Policy-Agent.""" from __future__ import annotations import asyncio import pytest from compliance.services.specialist_agents import ( REGISTRY, AgentInput, CookiePolicyAgent, Severity, ) FULL_POLICY = """Cookie-Richtlinie Stand: 1. Juni 2026 Wir verwenden auf unserer Website verschiedene Cookies. Diese werden in folgende Kategorien eingeteilt: 1. Essentielle Cookies (unbedingt erforderlich) Zweck: Diese Cookies dienen der grundlegenden Funktion der Website. Rechtsgrundlage: § 25 Abs. 2 TDDDG Laufzeit: Session 2. Funktionale Cookies Zweck: Speichern Ihre Präferenzen wie Sprache und Region. Rechtsgrundlage: Art. 6 Abs. 1 lit. a DSGVO Laufzeit: 30 Tage 3. Analytics-Cookies (Performance) Drittanbieter: Google LLC, USA Zweck: Nutzungsstatistiken erheben. Laufzeit: 24 Monate Cookies: _ga, _gid Drittland: USA — Standardvertragsklauseln + Data Privacy Framework 4. Marketing-Cookies (Tracking) Drittanbieter: Meta Platforms Inc., USA Cookies: _fbp, _fbc Laufzeit: 90 Tage Sie können Ihre Cookie-Einstellungen jederzeit ändern über den Link unten oder das Banner erneut öffnen. Browser-Einstellungen: Auch in Chrome, Firefox, Safari und Edge können Sie Cookies blockieren oder löschen. Kontakt: datenschutz@example.com Datenschutzbeauftragter: Max Mustermann """ GAPPY_POLICY = """Cookies Wir verwenden Cookies um die Website zu betreiben. Cookies werden so lange gespeichert wie nötig. """ def _run(coro): return asyncio.get_event_loop().run_until_complete(coro) def test_agent_is_registered(): agent = REGISTRY.get("cookie_policy") assert agent is not None assert agent.doc_type == "cookie" def test_short_text_skipped(monkeypatch): async def _no_cascade(*a, **kw): return None, [] monkeypatch.setattr( "compliance.services.specialist_agents.cookie_policy.agent.cascade", _no_cascade, ) agent = CookiePolicyAgent() out = _run(agent.evaluate(AgentInput(doc_type="cookie", text="x"))) assert out.mc_total > 0 assert all(c.status == "skipped" for c in out.mc_coverage) def test_full_policy_has_few_high_findings(monkeypatch): async def _no_cascade(*a, **kw): return None, [] monkeypatch.setattr( "compliance.services.specialist_agents.cookie_policy.agent.cascade", _no_cascade, ) agent = CookiePolicyAgent() out = _run(agent.evaluate(AgentInput(doc_type="cookie", text=FULL_POLICY))) high = [f for f in out.findings if f.severity == Severity.HIGH.value] assert not high, f"unexpected HIGH findings: {[f.field_id for f in high]}" def test_gappy_policy_triggers_high(monkeypatch): async def _no_cascade(*a, **kw): return None, [] monkeypatch.setattr( "compliance.services.specialist_agents.cookie_policy.agent.cascade", _no_cascade, ) agent = CookiePolicyAgent() out = _run(agent.evaluate(AgentInput(doc_type="cookie", text=GAPPY_POLICY))) field_ids = {f.field_id for f in out.findings} # 4 Kategorien fehlen, Vendoren fehlen, Opt-Out fehlt, Tabelle fehlt assert "categories_named" in field_ids assert "vendor_recipients" in field_ids assert "opt_out_mechanism" in field_ids def test_cmp_vendor_cross_check_emits_finding(monkeypatch): async def _no_cascade(*a, **kw): return None, [] monkeypatch.setattr( "compliance.services.specialist_agents.cookie_policy.agent.cascade", _no_cascade, ) agent = CookiePolicyAgent() out = _run(agent.evaluate(AgentInput( doc_type="cookie", text=FULL_POLICY, context={"cmp_vendors": [ {"name": "Hotjar"}, # NICHT in Policy {"name": "Google LLC"}, # IN Policy ]}, ))) field_ids = {f.field_id for f in out.findings} assert "vendor_consistency" in field_ids cmp_f = next(f for f in out.findings if f.field_id == "vendor_consistency") assert "Hotjar" in cmp_f.evidence assert "Google" not in cmp_f.evidence def test_recommendations_are_built(): agent = CookiePolicyAgent() out = _run(agent.evaluate(AgentInput(doc_type="cookie", text=GAPPY_POLICY))) assert out.recommendations # Jede Recommendation hat mind. ein related_finding for r in out.recommendations: assert r.related_finding_ids