130 lines
3.5 KiB
Python
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
|