"""In-memory mail server for tests (AD-1).""" from __future__ import annotations from .base import MailMessage, MailRejected, MailUnavailable class FakeMailer: """Records what was sent. `unavailable` makes every send fail temporarily; recipients in `rejected` are refused for good.""" def __init__(self) -> None: self.sent: list[MailMessage] = [] self.unavailable = False self.rejected: set[str] = set() self.attempts = 0 def send(self, message: MailMessage) -> None: self.attempts += 1 if self.unavailable: raise MailUnavailable("The mail server is not available") if message.recipient in self.rejected: raise MailRejected("The mail server refused the message (550)") self.sent.append(message)