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 = """

Echter Artikeltitel über Klimawandel und Energiepolitik

Dies ist der eigentliche Artikeltext mit genügend Inhalt für die Extraktion.

Ein zweiter Absatz mit relevanten Fakten zur Erderwärmung und Treibhausgasen.

""" 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 = """

Überschrift mit genügend Zeichen für den Parser hier

Absatz mit ausreichend Inhalt damit die Extraktion erfolgreich klappt.

""" text = _extract_readable_text(html) self.assertIn('Überschrift', text) class AIAssistantUploadTests(SimpleTestCase): def test_svg_converts_to_png_for_openai(self): svg = b''' Test ''' 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'Faktencheck' 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'])