""" Gemeinsame Fixtures für die Mailmerge-Tests. Liefert ein minimales DOCX-Template, eine passende CSV und einen authentifizierten Django-Testclient. """ from __future__ import annotations import io from pathlib import Path import pytest from django.contrib.auth import get_user_model from django.core.files.uploadedfile import SimpleUploadedFile from docx import Document # --------------------------------------------------------------------------- # DOCX-Helfer # --------------------------------------------------------------------------- def _build_minimal_docx(placeholders: list[str]) -> bytes: """Erzeugt ein DOCX im Speicher mit den übergebenen Jinja-Platzhaltern.""" doc = Document() doc.add_paragraph("Sehr {{ anrede_brief }} {{ nachname }},") doc.add_paragraph(" ".join(f"{{{{ {p} }}}}" for p in placeholders)) doc.add_paragraph("Mit freundlichen Grüßen") buf = io.BytesIO() doc.save(buf) return buf.getvalue() @pytest.fixture def template_placeholders() -> list[str]: return ["anrede_brief", "nachname", "vorname", "ort"] @pytest.fixture def docx_bytes(template_placeholders) -> bytes: return _build_minimal_docx(template_placeholders) @pytest.fixture def docx_file_on_disk(tmp_path, docx_bytes) -> Path: p = tmp_path / "template.docx" p.write_bytes(docx_bytes) return p # --------------------------------------------------------------------------- # CSV-Helfer # --------------------------------------------------------------------------- CSV_VALID = ( "anrede_brief,nachname,vorname,ort\n" "geehrte Frau,Huber,Andrea,Eisenstadt\n" "geehrter Herr,Müller,Bernhard,Neusiedl\n" ) CSV_MISSING_COLUMN = ( "anrede_brief,nachname,vorname\n" # 'ort' fehlt "geehrte Frau,Huber,Andrea\n" ) CSV_EXTRA_COLUMN = ( "anrede_brief,nachname,vorname,ort,personalnr\n" "geehrte Frau,Huber,Andrea,Eisenstadt,12345\n" ) CSV_NO_DATA = "anrede_brief,nachname,vorname,ort\n" CSV_NO_HEADER = "" @pytest.fixture def csv_valid_bytes() -> bytes: return CSV_VALID.encode("utf-8") @pytest.fixture def csv_uploaded_valid(csv_valid_bytes) -> SimpleUploadedFile: return SimpleUploadedFile( "recipients.csv", csv_valid_bytes, content_type="text/csv" ) # --------------------------------------------------------------------------- # Django-User / Client # --------------------------------------------------------------------------- @pytest.fixture def user(db): User = get_user_model() return User.objects.create_user( username="testuser", password="topsecret-123", email="test@example.com", ) @pytest.fixture def auth_client(client, user): client.force_login(user) return client # --------------------------------------------------------------------------- # LetterTemplate-Fixture (DB-persistent, mit echter DOCX-Datei) # --------------------------------------------------------------------------- @pytest.fixture def letter_template(db, user, docx_bytes, tmp_path, settings): """Erzeugt ein LetterTemplate-DB-Objekt inkl. hochgeladener DOCX-Datei.""" from mailmerge.models import LetterTemplate # MEDIA_ROOT auf tmp_path lenken, damit Testdateien isoliert bleiben settings.MEDIA_ROOT = str(tmp_path / "media") tpl = LetterTemplate( name="Testvorlage", description="Pytest-Fixture", created_by=user, ) tpl.file.save( "test-template.docx", SimpleUploadedFile("test-template.docx", docx_bytes), save=True, ) return tpl