"""Tests für dsi_discovery — Shadow-DOM/versteckte Link-Erfassung (Feature A) + Interaktions-Fixpunkt (Feature B).""" from __future__ import annotations import asyncio import pytest from services.dsi_discovery import ( _dom_grew, _expand_to_fixpoint, _find_dsi_links, ) # ── Pure: Fixpunkt-Stopbedingung ──────────────────────────────────── def test_dom_grew_threshold(): assert _dom_grew(100, 200) is True assert _dom_grew(100, 133) is True # 33 > 32 (Schwelle) assert _dom_grew(100, 110) is False # unter Schwelle assert _dom_grew(100, 100) is False # ── Browser-Integration (skip wenn kein chromium) ─────────────────── def _chromium_ok() -> bool: try: from playwright.sync_api import sync_playwright with sync_playwright() as p: b = p.chromium.launch(headless=True, args=["--no-sandbox"]) b.close() return True except Exception: return False _BROWSER = _chromium_ok() _FIXTURE = """ Datenschutz
Mehr Impressum
""" async def _scan_fixture(): from playwright.async_api import async_playwright async with async_playwright() as p: b = await p.chromium.launch(headless=True, args=["--no-sandbox"]) try: page = await (await b.new_context()).new_page() await page.set_content(_FIXTURE) tel = await _expand_to_fixpoint(page) links = await _find_dsi_links(page, "example.com") details_open = await page.evaluate( "() => !!(document.querySelector('details')" " && document.querySelector('details').open)") return links, tel, details_open finally: await b.close() @pytest.mark.skipif(not _BROWSER, reason="chromium nicht installiert") def test_shadow_and_hidden_links_discovered(): links, tel, details_open = asyncio.get_event_loop().run_until_complete( _scan_fixture()) hrefs = [l["href"] for l in links] # A: Shadow-DOM-Link gefunden + geflaggt assert any("cookie-richtlinie" in h for h in hrefs), hrefs assert any(l.get("in_shadow") for l in links) # A: versteckter (display:none) Link gefunden + als hidden geflaggt assert any("datenschutz" in h for h in hrefs), hrefs assert any(not l["visible"] for l in links) # B: Fixpunkt lief + hat das geschlossene Akkordeon geoeffnet assert tel["rounds"] >= 1 assert details_open is True