feat: govern attachment exceptions and ownership transfers
This commit is contained in:
@@ -100,9 +100,9 @@ class CampaignAttachmentBuildTests(unittest.TestCase):
|
||||
cases = {
|
||||
"block": ("build_failed", "blocked", 0, "block", False),
|
||||
"ask": ("built", "needs_review", 0, "ask", True),
|
||||
"drop": ("built", "excluded", 0, "drop", True),
|
||||
"drop": ("built", "needs_review", 0, "ask", True),
|
||||
"warn": ("built", "warning", 1, "warn", True),
|
||||
"continue": ("built", "ready", 1, None, True),
|
||||
"continue": ("built", "warning", 1, None, True),
|
||||
}
|
||||
for behavior, (build_status, validation_status, queueable_count, issue_behavior, has_mime) in cases.items():
|
||||
with self.subTest(behavior=behavior):
|
||||
@@ -133,6 +133,71 @@ class CampaignAttachmentBuildTests(unittest.TestCase):
|
||||
self.assertEqual(coverage_issues[0].behavior, issue_behavior)
|
||||
self.assertEqual(result.built_messages[0].mime is not None, has_mime)
|
||||
|
||||
def test_required_missing_policy_cannot_be_loosened_by_rule(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
campaign_file = root / "campaign.json"
|
||||
campaign_file.write_text("{}", encoding="utf-8")
|
||||
config = self._no_attachment_config(
|
||||
behavior="continue",
|
||||
configure_missing_rule=True,
|
||||
)
|
||||
rule = config.attachments.global_[0]
|
||||
rule.required = True
|
||||
rule.missing_behavior = "continue"
|
||||
config.attachments.missing_behavior = "continue"
|
||||
|
||||
result = build_campaign_messages(
|
||||
config,
|
||||
campaign_file=campaign_file,
|
||||
output_dir=root / "out",
|
||||
write_eml=True,
|
||||
)
|
||||
|
||||
message = result.report.messages[0]
|
||||
self.assertEqual(message.validation_status.value, "blocked")
|
||||
issue = next(
|
||||
item
|
||||
for item in message.issues
|
||||
if item.code == "missing_required_attachment"
|
||||
)
|
||||
self.assertEqual(issue.behavior, "block")
|
||||
self.assertEqual(
|
||||
issue.details["effective_policy"]["requirement_policy"],
|
||||
"block",
|
||||
)
|
||||
self.assertEqual(
|
||||
message.attachments[0].missing_policy["effective_behavior"],
|
||||
"block",
|
||||
)
|
||||
|
||||
def test_optional_missing_policy_warns_by_default(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
campaign_file = root / "campaign.json"
|
||||
campaign_file.write_text("{}", encoding="utf-8")
|
||||
config = self._no_attachment_config(
|
||||
behavior="continue",
|
||||
configure_missing_rule=True,
|
||||
)
|
||||
config.attachments.global_[0].missing_behavior = None
|
||||
|
||||
result = build_campaign_messages(
|
||||
config,
|
||||
campaign_file=campaign_file,
|
||||
output_dir=root / "out",
|
||||
write_eml=True,
|
||||
)
|
||||
|
||||
message = result.report.messages[0]
|
||||
self.assertEqual(message.validation_status.value, "warning")
|
||||
issue = next(
|
||||
item
|
||||
for item in message.issues
|
||||
if item.code == "missing_optional_attachment"
|
||||
)
|
||||
self.assertEqual(issue.behavior, "warn")
|
||||
|
||||
def test_missing_pattern_does_not_create_zip_member_or_count_as_attachment(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
|
||||
Reference in New Issue
Block a user