53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from contextlib import contextmanager
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from govoplan_campaign.backend.integrations import ImapAppendError, MailCampaignIntegration
|
|
|
|
|
|
def test_older_mail_capability_keeps_single_message_compatibility():
|
|
integration = MailCampaignIntegration(SimpleNamespace())
|
|
with integration.campaign_imap_batch(tenant_id="tenant", campaign_id="campaign") as state:
|
|
assert state is None
|
|
|
|
|
|
def test_optional_batch_forwards_scope_and_cleans_up_when_caller_fails():
|
|
calls = []
|
|
state = SimpleNamespace(connection_count=0, reconnect_count=0)
|
|
|
|
@contextmanager
|
|
def batch(**kwargs):
|
|
calls.append(kwargs)
|
|
try:
|
|
yield state
|
|
finally:
|
|
calls.append("closed")
|
|
|
|
integration = MailCampaignIntegration(SimpleNamespace(campaign_imap_batch=batch))
|
|
with pytest.raises(ValueError, match="caller"):
|
|
with integration.campaign_imap_batch(tenant_id="tenant", campaign_id="campaign") as actual:
|
|
assert actual is state
|
|
raise ValueError("caller failure")
|
|
assert calls == [{"tenant_id": "tenant", "campaign_id": "campaign"}, "closed"]
|
|
|
|
|
|
def test_optional_batch_translates_unknown_outcome_without_losing_flags():
|
|
class ProviderAppendError(RuntimeError):
|
|
temporary = False
|
|
outcome_unknown = True
|
|
|
|
@contextmanager
|
|
def batch(**kwargs):
|
|
raise ProviderAppendError("inspect mailbox")
|
|
yield None
|
|
|
|
integration = MailCampaignIntegration(SimpleNamespace(
|
|
campaign_imap_batch=batch, ImapAppendError=ProviderAppendError,
|
|
))
|
|
with pytest.raises(ImapAppendError) as caught:
|
|
with integration.campaign_imap_batch(tenant_id="tenant", campaign_id="campaign"):
|
|
pass
|
|
assert caught.value.outcome_unknown
|
|
assert caught.value.temporary is False
|