Files
gatehouse-api/test_email.py
T
coryHawkvelt 02e95a4199 feat(organizations): email inviter when membership invite is accepted
When a user accepts an org invite, send a notification email to the
person who sent the invite with membership details (member name, email,
org name, role) and an optional View Organization button.

Added build_invite_accepted_html() template to email_templates.py,
wired it into the accept_invite() handler, and added a test case.
2026-04-26 18:36:58 +09:30

178 lines
6.9 KiB
Python

#!/usr/bin/env python3
"""Test script to verify email delivery with HTML templates."""
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from dotenv import load_dotenv
load_dotenv(".env")
from gatehouse_app import create_app
from gatehouse_app.services.email_provider import EmailProviderFactory, EmailMessage
from gatehouse_app.services import email_templates
def test_html_email():
app = create_app()
print("Testing HTML Email Templates...")
print(f"EMAIL_PROVIDER: {app.config.get('EMAIL_PROVIDER')}")
print(f"MAILGUN_DOMAIN: {app.config.get('MAILGUN_DOMAIN')}")
with app.app_context():
provider = EmailProviderFactory.get_provider()
print(f"Provider class: {provider.__class__.__name__}")
# Test 1: Email Verification
print("\n--- Test 1: Email Verification ---")
html_body = email_templates.build_email_verification_html(
user_name="Cory",
verify_link="https://secuird.tech/verify-email?token=test123",
expiry_hours=24,
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="Verify your Secuird email address",
body="Plain text version: Please verify your email by clicking the link.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 2: Password Reset
print("\n--- Test 2: Password Reset ---")
html_body = email_templates.build_password_reset_html(
user_name="Cory",
reset_link="https://secuird.tech/reset-password?token=test456",
expiry_hours=2,
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="Reset your Secuird password",
body="Plain text version: Reset your password by clicking the link.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 3: MFA Deadline Reminder
print("\n--- Test 3: MFA Deadline Reminder ---")
html_body = email_templates.build_mfa_deadline_reminder_html(
user_name="Cory",
org_name="Acme Corp",
days_remaining=5,
deadline_date="2026-04-09 23:59 UTC",
mfa_methods="Authenticator app (TOTP) or Passkey (WebAuthn)",
setup_link="https://secuird.tech/settings/security",
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="Action Required: MFA enrollment deadline in 5 days",
body="Plain text version: MFA enrollment required.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 4: MFA Suspension
print("\n--- Test 4: MFA Suspension ---")
html_body = email_templates.build_mfa_suspension_html(
user_name="Cory",
org_name="Acme Corp",
mfa_methods="Authenticator app (TOTP) or Passkey (WebAuthn)",
setup_link="https://secuird.tech/settings/security",
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="Account Access Restricted - MFA Enrollment Required",
body="Plain text version: Your account has been suspended.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 5: Organization Invite
print("\n--- Test 5: Organization Invite ---")
html_body = email_templates.build_org_invite_html(
inviter_name="Admin User",
org_name="Acme Corporation",
invite_link="https://secuird.tech/invite?token=test789",
role="Member",
expiry_days=7,
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="You're invited to join Acme Corporation on Secuird",
body="Plain text version: You've been invited to join.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 6: Account Activation
print("\n--- Test 6: Account Activation ---")
html_body = email_templates.build_account_activation_html(
user_name="Cory",
activation_link="https://secuird.tech/activate?code=testabc",
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="Activate your Secuird account",
body="Plain text version: Activate your account.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 7: Email Verification Resend
print("\n--- Test 7: Email Verification Resend ---")
html_body = email_templates.build_email_verification_resend_html(
user_name="Cory",
verify_link="https://secuird.tech/verify-email?token=testxyz",
expiry_hours=24,
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="Verify your Secuird email address",
body="Plain text version: Please verify your email.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
# Test 8: Invite Accepted
print("\n--- Test 8: Invite Accepted ---")
html_body = email_templates.build_invite_accepted_html(
inviter_name="Admin User",
member_name="New Member",
member_email="newmember@example.com",
org_name="Acme Corporation",
role="Member",
org_link="https://secuird.tech/organizations/org-123",
)
message = EmailMessage(
to="cory@hawkvelt.id.au",
subject="New Member accepted your invitation to Acme Corporation",
body="Plain text version: New Member has accepted your invitation.",
html_body=html_body,
from_address="Secuird <noreply@secuird.tech>",
)
success = provider.send(message)
print(f"Result: {'✅ SUCCESS' if success else '❌ FAILED'}")
print("\n" + "=" * 50)
print("All 8 email templates sent!")
print("=" * 50)
if __name__ == "__main__":
test_html_email()