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>
This commit is contained in:
+76
-2
@@ -1,3 +1,77 @@
|
||||
from django.test import TestCase
|
||||
from django.test import SimpleTestCase
|
||||
|
||||
# Create your tests here.
|
||||
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'])
|
||||
|
||||
Reference in New Issue
Block a user