testsuite fuer mailmerge
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user