Prepare v0.1.0 release dependencies
This commit is contained in:
@@ -205,6 +205,55 @@ class ApiSmokeTests(unittest.TestCase):
|
||||
self.assertEqual(allowed.status_code, 200, allowed.text)
|
||||
self.assertEqual(allowed.json()["user"]["display_name"], "Cookie Admin")
|
||||
|
||||
def test_mailbox_message_listing_reports_total_count(self) -> None:
|
||||
headers, _ = self._login()
|
||||
created_profile = self.client.post(
|
||||
"/api/v1/mail/profiles",
|
||||
headers=headers,
|
||||
json={
|
||||
"name": "Readable mailbox",
|
||||
"smtp": {
|
||||
"host": "mock.smtp",
|
||||
"port": 2525,
|
||||
"username": "sender@example.org",
|
||||
"password": "smtp-secret",
|
||||
"security": "starttls",
|
||||
},
|
||||
"imap": {
|
||||
"enabled": True,
|
||||
"host": "mock.imap",
|
||||
"port": 993,
|
||||
"username": "sender@example.org",
|
||||
"password": "imap-secret",
|
||||
"security": "tls",
|
||||
"sent_folder": "Sent",
|
||||
},
|
||||
},
|
||||
)
|
||||
self.assertEqual(created_profile.status_code, 201, created_profile.text)
|
||||
profile_id = created_profile.json()["id"]
|
||||
|
||||
from govoplan_mail.backend.dev.mock_mailbox import record_imap_append
|
||||
|
||||
for index in range(3):
|
||||
record_imap_append(
|
||||
f"Subject: Mock message {index + 1}\nFrom: sender@example.org\nTo: recipient@example.org\n\nBody {index + 1}".encode("utf-8"),
|
||||
folder="INBOX",
|
||||
imap_host="mock.imap",
|
||||
)
|
||||
|
||||
listed = self.client.get(
|
||||
f"/api/v1/mail/profiles/{profile_id}/mailbox/messages",
|
||||
headers=headers,
|
||||
params={"folder": "INBOX", "limit": 2},
|
||||
)
|
||||
self.assertEqual(listed.status_code, 200, listed.text)
|
||||
payload = listed.json()
|
||||
self.assertEqual(payload["folder"], "INBOX")
|
||||
self.assertEqual(payload["total_count"], 3)
|
||||
self.assertEqual(len(payload["messages"]), 2)
|
||||
self.assertTrue(all(message["folder"] == "INBOX" for message in payload["messages"]))
|
||||
|
||||
def test_encrypted_mail_profile_can_back_campaign_without_exposing_secrets(self) -> None:
|
||||
headers, _ = self._login()
|
||||
created_profile = self.client.post(
|
||||
@@ -2450,6 +2499,37 @@ class ApiSmokeTests(unittest.TestCase):
|
||||
self.assertEqual(denied_recipient_edit.status_code, 403, denied_recipient_edit.text)
|
||||
self.assertEqual(self.client.get(f"/api/v1/campaigns/{campaign_id}", headers=other_headers).status_code, 403)
|
||||
|
||||
def test_policy_responses_include_source_provenance(self) -> None:
|
||||
headers, _ = self._login()
|
||||
|
||||
retention = self.client.get("/api/v1/admin/privacy-retention/policies/tenant", headers=headers)
|
||||
self.assertEqual(retention.status_code, 200, retention.text)
|
||||
retention_payload = retention.json()
|
||||
self.assertEqual([item["label"] for item in retention_payload["effective_policy_sources"]], ["System", "Tenant"])
|
||||
self.assertEqual([item["label"] for item in retention_payload["parent_policy_sources"]], ["System"])
|
||||
self.assertIn("defaults", retention_payload["effective_policy_sources"][0]["applied_fields"])
|
||||
|
||||
created = self.client.post(
|
||||
"/api/v1/campaigns/new",
|
||||
headers=headers,
|
||||
json={"external_id": "policy-source-campaign", "name": "Policy source campaign"},
|
||||
)
|
||||
self.assertEqual(created.status_code, 200, created.text)
|
||||
campaign_id = created.json()["campaign"]["id"]
|
||||
|
||||
updated = self.client.put(
|
||||
f"/api/v1/mail/policies/campaign?scope_id={campaign_id}",
|
||||
headers=headers,
|
||||
json={"policy": {"allow_campaign_profiles": False}},
|
||||
)
|
||||
self.assertEqual(updated.status_code, 200, updated.text)
|
||||
payload = updated.json()
|
||||
self.assertEqual([item["label"] for item in payload["effective_policy_sources"]], ["System", "Tenant", "Owner user", "Campaign"])
|
||||
campaign_source = payload["effective_policy_sources"][-1]
|
||||
self.assertEqual(campaign_source["scope_type"], "campaign")
|
||||
self.assertEqual(campaign_source["scope_id"], campaign_id)
|
||||
self.assertIn("allow_campaign_profiles", campaign_source["applied_fields"])
|
||||
|
||||
def test_campaign_scoped_mail_profile_policy_is_enforced(self) -> None:
|
||||
headers, _ = self._login()
|
||||
created = self.client.post(
|
||||
@@ -2498,6 +2578,78 @@ class ApiSmokeTests(unittest.TestCase):
|
||||
self.assertEqual(blocked.status_code, 422, blocked.text)
|
||||
self.assertIn("blacklist", blocked.json()["detail"])
|
||||
|
||||
def test_campaign_local_mail_policy_blocks_inline_but_allows_reusable_profiles(self) -> None:
|
||||
headers, _ = self._login()
|
||||
created = self.client.post(
|
||||
"/api/v1/campaigns/new",
|
||||
headers=headers,
|
||||
json={"external_id": "campaign-local-mail-policy", "name": "Campaign local mail policy"},
|
||||
)
|
||||
self.assertEqual(created.status_code, 200, created.text)
|
||||
campaign_id = created.json()["campaign"]["id"]
|
||||
version_id = created.json()["version"]["id"]
|
||||
|
||||
tenant_profile = self.client.post(
|
||||
"/api/v1/mail/profiles",
|
||||
headers=headers,
|
||||
json={
|
||||
"name": "Tenant reusable SMTP",
|
||||
"smtp": {"host": "tenant.smtp.local", "port": 2525, "username": "sender@example.org", "password": "secret", "security": "starttls"},
|
||||
},
|
||||
)
|
||||
self.assertEqual(tenant_profile.status_code, 201, tenant_profile.text)
|
||||
tenant_profile_id = tenant_profile.json()["id"]
|
||||
|
||||
policy = self.client.put(
|
||||
f"/api/v1/mail/policies/campaign?scope_id={campaign_id}",
|
||||
headers=headers,
|
||||
json={"policy": {"allow_campaign_profiles": False}},
|
||||
)
|
||||
self.assertEqual(policy.status_code, 200, policy.text)
|
||||
self.assertFalse(policy.json()["effective_policy"]["allow_campaign_profiles"])
|
||||
|
||||
blocked_profile = self.client.post(
|
||||
"/api/v1/mail/profiles",
|
||||
headers=headers,
|
||||
json={
|
||||
"name": "Blocked campaign SMTP",
|
||||
"scope_type": "campaign",
|
||||
"scope_id": campaign_id,
|
||||
"smtp": {"host": "campaign.smtp.local", "port": 2525, "username": "sender@example.org", "password": "secret", "security": "starttls"},
|
||||
},
|
||||
)
|
||||
self.assertEqual(blocked_profile.status_code, 422, blocked_profile.text)
|
||||
self.assertIn("disabled by policy", blocked_profile.json()["detail"])
|
||||
|
||||
detail = self.client.get(f"/api/v1/campaigns/{campaign_id}/versions/{version_id}", headers=headers)
|
||||
self.assertEqual(detail.status_code, 200, detail.text)
|
||||
inline_json = detail.json()["raw_json"]
|
||||
inline_json["server"] = {
|
||||
"smtp": {
|
||||
"host": "campaign.smtp.local",
|
||||
"port": 2525,
|
||||
"username": "sender@example.org",
|
||||
"password": "secret",
|
||||
"security": "starttls",
|
||||
}
|
||||
}
|
||||
blocked_inline = self.client.put(
|
||||
f"/api/v1/campaigns/{campaign_id}/versions/{version_id}",
|
||||
headers=headers,
|
||||
json={"campaign_json": inline_json},
|
||||
)
|
||||
self.assertEqual(blocked_inline.status_code, 422, blocked_inline.text)
|
||||
self.assertIn("Campaign-local inline mail settings", blocked_inline.json()["detail"])
|
||||
|
||||
reusable_json = detail.json()["raw_json"]
|
||||
reusable_json["server"] = {"mail_profile_id": tenant_profile_id}
|
||||
allowed_reusable = self.client.put(
|
||||
f"/api/v1/campaigns/{campaign_id}/versions/{version_id}",
|
||||
headers=headers,
|
||||
json={"campaign_json": reusable_json},
|
||||
)
|
||||
self.assertEqual(allowed_reusable.status_code, 200, allowed_reusable.text)
|
||||
|
||||
def test_allowed_mail_profile_ids_gate_campaign_selection(self) -> None:
|
||||
headers, _ = self._login()
|
||||
created = self.client.post(
|
||||
|
||||
Reference in New Issue
Block a user