105 lines
3.3 KiB
Python
105 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import UTC, datetime
|
|
from types import SimpleNamespace
|
|
|
|
from govoplan_campaign.backend.reports.campaigns import _job_evidence_row, _latest_by_job_id
|
|
|
|
|
|
def _dt() -> datetime:
|
|
return datetime(2026, 7, 8, 12, 30, tzinfo=UTC)
|
|
|
|
|
|
def test_job_evidence_row_contains_transport_and_message_evidence() -> None:
|
|
job = SimpleNamespace(
|
|
id="job-1",
|
|
campaign_id="campaign-1",
|
|
campaign_version_id="version-1",
|
|
entry_index=0,
|
|
entry_id="recipient-1",
|
|
recipient_email="recipient@govoplan.test",
|
|
subject="Evidence test",
|
|
message_id_header="<message-1@govoplan.test>",
|
|
eml_storage_key="eml/job-1.eml",
|
|
eml_local_path="/tmp/job-1.eml",
|
|
eml_size_bytes=1234,
|
|
eml_sha256="abc123",
|
|
build_status="built",
|
|
validation_status="ready",
|
|
queue_status="queued",
|
|
send_status="smtp_accepted",
|
|
imap_status="appended",
|
|
attempt_count=2,
|
|
queued_at=_dt(),
|
|
claimed_at=None,
|
|
smtp_started_at=_dt(),
|
|
outcome_unknown_at=None,
|
|
sent_at=_dt(),
|
|
last_error=None,
|
|
resolved_recipients={
|
|
"from": [{"name": "Sender", "email": "sender@govoplan.test"}],
|
|
"to": [{"name": "Recipient", "email": "recipient@govoplan.test"}],
|
|
"cc": [],
|
|
"bcc": [],
|
|
"reply_to": [{"email": "reply@govoplan.test"}],
|
|
},
|
|
resolved_attachments=[
|
|
{
|
|
"matches": [{"filename": "notice.pdf"}, "/tmp/evidence.xlsx"],
|
|
"zip_filename": "bundle.zip",
|
|
"message_filenames": ["notice.pdf"],
|
|
}
|
|
],
|
|
issues_snapshot=[],
|
|
created_at=_dt(),
|
|
updated_at=_dt(),
|
|
)
|
|
smtp = SimpleNamespace(
|
|
job_id="job-1",
|
|
attempt_number=2,
|
|
status="success",
|
|
smtp_status_code=250,
|
|
smtp_response="2.0.0 queued",
|
|
error_type=None,
|
|
error_message=None,
|
|
started_at=_dt(),
|
|
finished_at=_dt(),
|
|
)
|
|
imap = SimpleNamespace(
|
|
job_id="job-1",
|
|
attempt_number=1,
|
|
status="appended",
|
|
folder="Sent",
|
|
error_message=None,
|
|
created_at=_dt(),
|
|
updated_at=_dt(),
|
|
)
|
|
|
|
row = _job_evidence_row(job, latest_smtp=smtp, latest_imap=imap)
|
|
|
|
assert row["campaign_id"] == "campaign-1"
|
|
assert row["campaign_version_id"] == "version-1"
|
|
assert row["message_id_header"] == "<message-1@govoplan.test>"
|
|
assert row["from"] == "Sender <sender@govoplan.test>"
|
|
assert row["to"] == "Recipient <recipient@govoplan.test>"
|
|
assert row["reply_to"] == "reply@govoplan.test"
|
|
assert "bundle.zip" in row["attachment_names"]
|
|
assert "notice.pdf" in row["attachment_names"]
|
|
assert row["latest_smtp_status_code"] == 250
|
|
assert row["latest_smtp_response"] == "2.0.0 queued"
|
|
assert row["latest_imap_status"] == "appended"
|
|
assert row["latest_imap_folder"] == "Sent"
|
|
|
|
|
|
def test_latest_by_job_id_keeps_highest_attempt_number() -> None:
|
|
attempts = [
|
|
SimpleNamespace(job_id="job-1", attempt_number=1),
|
|
SimpleNamespace(job_id="job-1", attempt_number=3),
|
|
SimpleNamespace(job_id="job-2", attempt_number=2),
|
|
]
|
|
|
|
latest = _latest_by_job_id(attempts)
|
|
|
|
assert latest["job-1"].attempt_number == 3
|
|
assert latest["job-2"].attempt_number == 2
|