cuatrolabs-notification-ms / test_email_flow.py
MukeshKapoor25's picture
email testing
0cbb7b5
"""
Standalone test for the SendGrid email flow.
Tests both EmailChannel.is_configured() and EmailChannel.send() directly.
Usage:
cd cuatrolabs-notification-ms
python test_email_flow.py --to recipient@example.com
"""
import asyncio
import argparse
import sys
# ---------------------------------------------------------------------------
# Config β€” edit these or pass via CLI args
# ---------------------------------------------------------------------------
TEST_CONFIG = {
"enabled": True,
"api_key": "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",
"from_email": "no-reply@example.com",
"from_name": "Cuatro Notifications",
"reply_to": "support@example.com",
}
TEST_TEMPLATE_DATA = {
"subject": "Test Email β€” Cuatro Notification MS",
"body": "Hello {{ name }},\n\nThis is a test email from the Cuatro notification service.\n\nRegards,\nCuatro Team",
"html_body": "<p>Hello <strong>{{ name }}</strong>,</p><p>This is a <em>test email</em> from the Cuatro notification service.</p><p>Regards,<br>Cuatro Team</p>",
"name": "Test User",
}
# ---------------------------------------------------------------------------
async def run_test(recipient: str):
# Patch sys.path so we can import app modules without installing the package
import os
sys.path.insert(0, os.path.dirname(__file__))
# Minimal stub for app.core.logging so we don't need the full app stack
import types
import logging
logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s")
core_mod = types.ModuleType("app.core")
core_logging_mod = types.ModuleType("app.core.logging")
core_logging_mod.get_logger = lambda name: logging.getLogger(name)
sys.modules.setdefault("app", types.ModuleType("app"))
sys.modules["app.core"] = core_mod
sys.modules["app.core.logging"] = core_logging_mod
from app.channels.email import EmailChannel
print("\n=== SendGrid Email Flow Test ===\n")
# 1. is_configured check
configured = EmailChannel.is_configured(TEST_CONFIG)
print(f"[1] is_configured: {'βœ“ PASS' if configured else 'βœ— FAIL'}")
if not configured:
print(" Channel config is missing required fields (enabled, api_key, from_email).")
return
# 2. Send test email
print(f"[2] Sending email to: {recipient}")
success, message, provider_id = await EmailChannel.send(
recipient=recipient,
template_name="test_notification",
template_data=TEST_TEMPLATE_DATA,
channel_config=TEST_CONFIG,
)
status = "βœ“ PASS" if success else "βœ— FAIL"
print(f" Result : {status}")
print(f" Message : {message}")
if provider_id:
print(f" Provider ID: {provider_id}")
# 3. Misconfigured channel test (should fail gracefully)
print("\n[3] Testing misconfigured channel (no api_key)...")
bad_config = {"enabled": True, "from_email": "no-reply@example.com"}
configured_bad = EmailChannel.is_configured(bad_config)
print(f" is_configured with missing api_key: {'βœ— FAIL (should be False)' if configured_bad else 'βœ“ PASS (correctly False)'}")
# 4. Disabled channel test
print("\n[4] Testing disabled channel...")
disabled_config = {**TEST_CONFIG, "enabled": False}
configured_disabled = EmailChannel.is_configured(disabled_config)
print(f" is_configured when disabled: {'βœ— FAIL (should be False)' if configured_disabled else 'βœ“ PASS (correctly False)'}")
print("\n=== Done ===\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Test SendGrid email flow")
parser.add_argument(
"--to",
required=True,
help="Recipient email address for the test send",
)
args = parser.parse_args()
asyncio.run(run_test(args.to))