Files
Faktenkompass/claims/tests.py
T
Pirmin Hinderling (fedora) db3558872e Faktenkompass: UI-Rebrand, Admin-Assistent und Produktions-Setup.
Modernisiert die öffentliche Oberfläche mit Inter, Dark Mode und Live-Suche, ergänzt KI-gestützte Entwürfe im Admin mit Nachweis-Uploads und dokumentiert Daphne/Nginx für den Serverbetrieb.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-07 15:33:58 +02:00

78 lines
3.0 KiB
Python

from django.test import SimpleTestCase
from claims.services.ai_assistant import _image_message_part, _svg_to_png_bytes
from claims.services.article_fetcher import (
ArticleFetchError,
_extract_readable_text,
validate_article_url,
)
class ArticleFetcherSecurityTests(SimpleTestCase):
def test_blocks_file_scheme(self):
with self.assertRaises(ArticleFetchError):
validate_article_url('file:///etc/passwd')
def test_blocks_localhost(self):
with self.assertRaises(ArticleFetchError):
validate_article_url('http://localhost/article')
def test_allows_https_url(self):
validate_article_url('https://example.com/artikel')
class ArticleFetcherExtractionTests(SimpleTestCase):
def test_strips_navigation_and_ads(self):
html = """
<html><body>
<nav>Navigation mit vielen Links die ignoriert werden sollen</nav>
<div class="sidebar-promo">Werbung für ein tolles Angebot heute nur hier</div>
<article>
<h1>Echter Artikeltitel über Klimawandel und Energiepolitik</h1>
<p>Dies ist der eigentliche Artikeltext mit genügend Inhalt für die Extraktion.</p>
<p>Ein zweiter Absatz mit relevanten Fakten zur Erderwärmung und Treibhausgasen.</p>
</article>
<footer>Impressum und Datenschutz und Cookie-Hinweise überall</footer>
</body></html>
"""
text = _extract_readable_text(html)
self.assertIn('Klimawandel', text)
self.assertNotIn('Navigation mit vielen', text)
self.assertNotIn('Werbung für ein tolles', text)
self.assertNotIn('Impressum', text)
def test_handles_tags_without_attrs(self):
html = """
<html><body>
<article>
<h1>Überschrift mit genügend Zeichen für den Parser hier</h1>
<p>Absatz mit ausreichend Inhalt damit die Extraktion erfolgreich klappt.</p>
</article>
</body></html>
"""
text = _extract_readable_text(html)
self.assertIn('Überschrift', text)
class AIAssistantUploadTests(SimpleTestCase):
def test_svg_converts_to_png_for_openai(self):
svg = b'''<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<rect width="100" height="100" fill="teal"/>
<text x="10" y="50">Test</text>
</svg>'''
png = _svg_to_png_bytes(svg)
self.assertIsNotNone(png)
self.assertTrue(png.startswith(b'\x89PNG'))
def test_svg_message_part_uses_png_data_url(self):
from django.core.files.uploadedfile import SimpleUploadedFile
svg = b'<svg xmlns="http://www.w3.org/2000/svg"><text y="20">Faktencheck</text></svg>'
upload = SimpleUploadedFile('chart.svg', svg, content_type='image/svg+xml')
part = _image_message_part(upload)
if part['type'] == 'image_url':
self.assertIn('image/png', part['image_url']['url'])
else:
self.assertIn('SVG-Grafik', part['text'])