attachment backend use
This commit is contained in:
@@ -252,6 +252,163 @@ class ApiSmokeTests(unittest.TestCase):
|
||||
self.assertEqual(result["send"]["imap_appended_count"], 1)
|
||||
self.assertEqual(result["send"]["imap_failed_count"], 0)
|
||||
|
||||
def test_managed_attachment_patterns_preview_build_and_mock_send(self) -> None:
|
||||
headers, login = self._login()
|
||||
user_id = login["user"]["id"]
|
||||
campaign_json = {
|
||||
"version": "1.0",
|
||||
"campaign": {"id": "managed-attachments", "name": "Managed attachments", "mode": "test"},
|
||||
"fields": [{"name": "invoice_number", "type": "string", "required": True}],
|
||||
"global_values": {},
|
||||
"server": {
|
||||
"smtp": {
|
||||
"host": "smtp.example.invalid",
|
||||
"port": 587,
|
||||
"username": "sender@example.org",
|
||||
"password": "test-secret",
|
||||
"security": "starttls",
|
||||
}
|
||||
},
|
||||
"recipients": {
|
||||
"from": {"email": "sender@example.org", "name": "Sender", "type": "to"},
|
||||
"allow_individual_to": True,
|
||||
},
|
||||
"template": {"subject": "Invoice", "text": "Please see the attached files."},
|
||||
"attachments": {
|
||||
"base_path": "invoices",
|
||||
"base_paths": [
|
||||
{
|
||||
"id": "personal-invoices",
|
||||
"name": "My invoices",
|
||||
"source": f"managed:user:{user_id}",
|
||||
"path": "invoices",
|
||||
"allow_individual": True,
|
||||
}
|
||||
],
|
||||
"global": [],
|
||||
"allow_individual": True,
|
||||
},
|
||||
"entries": {
|
||||
"inline": [
|
||||
{
|
||||
"id": "recipient-1",
|
||||
"to": [{"email": "recipient@example.org", "name": "Recipient", "type": "to"}],
|
||||
"fields": {"invoice_number": "202605-010001"},
|
||||
"attachments": [
|
||||
{
|
||||
"id": "nested-pattern",
|
||||
"label": "Nested workbook",
|
||||
"base_path_id": "personal-invoices",
|
||||
"base_dir": "invoices",
|
||||
"file_filter": "**/{{local:invoice_number}}-report.XLSX",
|
||||
"required": True,
|
||||
},
|
||||
{
|
||||
"id": "exact-pattern",
|
||||
"label": "Exact workbook",
|
||||
"base_path_id": "personal-invoices",
|
||||
"base_dir": "invoices",
|
||||
"file_filter": "{{local:invoice_number}}-90100010-9601741.XLSX",
|
||||
"required": True,
|
||||
},
|
||||
],
|
||||
}
|
||||
]
|
||||
},
|
||||
"validation_policy": {
|
||||
"missing_email": "block",
|
||||
"template_error": "block",
|
||||
"missing_required_attachment": "block",
|
||||
},
|
||||
"delivery": {"imap_append_sent": {"enabled": False}},
|
||||
"status_tracking": {"enabled": True},
|
||||
}
|
||||
|
||||
created = self.client.post("/api/v1/campaigns", headers=headers, json={"config": campaign_json})
|
||||
self.assertEqual(created.status_code, 200, created.text)
|
||||
campaign_id = created.json()["campaign"]["id"]
|
||||
version_id = created.json()["version"]["id"]
|
||||
|
||||
for path, filename, content in [
|
||||
("invoices/archive", "202605-010001-report.XLSX", b"nested workbook"),
|
||||
("invoices", "202605-010001-90100010-9601741.XLSX", b"exact workbook"),
|
||||
]:
|
||||
uploaded = self.client.post(
|
||||
"/api/v1/files/upload",
|
||||
headers=headers,
|
||||
data={
|
||||
"owner_type": "user",
|
||||
"owner_id": user_id,
|
||||
"path": path,
|
||||
"campaign_id": campaign_id,
|
||||
},
|
||||
files=[("files", (filename, content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))],
|
||||
)
|
||||
self.assertEqual(uploaded.status_code, 200, uploaded.text)
|
||||
|
||||
preview = self.client.post(
|
||||
f"/api/v1/campaigns/{campaign_id}/versions/{version_id}/attachments/preview",
|
||||
headers=headers,
|
||||
json={"include_unmatched": True},
|
||||
)
|
||||
self.assertEqual(preview.status_code, 200, preview.text)
|
||||
preview_payload = preview.json()
|
||||
self.assertEqual(len(preview_payload["rules"]), 2)
|
||||
self.assertEqual([rule["match_count"] for rule in preview_payload["rules"]], [1, 1])
|
||||
self.assertEqual(
|
||||
{rule["matches"][0]["filename"] for rule in preview_payload["rules"]},
|
||||
{"202605-010001-report.XLSX", "202605-010001-90100010-9601741.XLSX"},
|
||||
)
|
||||
self.assertEqual(preview_payload["unused_shared_files"], [])
|
||||
|
||||
validated = self.client.post(
|
||||
f"/api/v1/campaigns/versions/{version_id}/validate",
|
||||
headers=headers,
|
||||
json={"check_files": True},
|
||||
)
|
||||
self.assertEqual(validated.status_code, 200, validated.text)
|
||||
self.assertTrue(validated.json()["ok"], validated.text)
|
||||
|
||||
built = self.client.post(
|
||||
f"/api/v1/campaigns/versions/{version_id}/build",
|
||||
headers=headers,
|
||||
json={"write_eml": False},
|
||||
)
|
||||
self.assertEqual(built.status_code, 200, built.text)
|
||||
self.assertEqual(built.json()["built_count"], 1)
|
||||
self.assertEqual(built.json()["messages"][0]["attachment_count"], 2)
|
||||
self.assertEqual(
|
||||
sum(len(item["managed_matches"]) for item in built.json()["messages"][0]["attachments"]),
|
||||
2,
|
||||
)
|
||||
|
||||
mocked = self.client.post(
|
||||
f"/api/v1/campaigns/{campaign_id}/mock-send",
|
||||
headers=headers,
|
||||
json={
|
||||
"version_id": version_id,
|
||||
"send": True,
|
||||
"append_sent": False,
|
||||
"clear_mailbox": True,
|
||||
"check_files": False,
|
||||
},
|
||||
)
|
||||
self.assertEqual(mocked.status_code, 200, mocked.text)
|
||||
result = mocked.json()["result"]
|
||||
self.assertTrue(result["validation"]["ok"], mocked.text)
|
||||
self.assertEqual(result["send"]["sent_count"], 1)
|
||||
self.assertEqual(result["send"]["results"][0]["attachments"][0]["status"], "ok")
|
||||
|
||||
from app.db.models import CampaignAttachmentUse
|
||||
|
||||
with SessionLocal() as session:
|
||||
uses = session.query(CampaignAttachmentUse).filter(CampaignAttachmentUse.campaign_id == campaign_id).all()
|
||||
self.assertEqual(len(uses), 2)
|
||||
self.assertEqual({use.filename_used for use in uses}, {
|
||||
"202605-010001-report.XLSX",
|
||||
"202605-010001-90100010-9601741.XLSX",
|
||||
})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user