Files
2026-05-22 08:40:04 +02:00

130 lines
3.5 KiB
Python

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