kaauh_ats/test_email_integration.py
2025-12-14 12:47:27 +03:00

243 lines
7.4 KiB
Python

#!/usr/bin/env python3
"""
Integration test for email refactoring.
Tests the complete email system end-to-end.
"""
import sys
import os
# Add project root to path
sys.path.insert(0, "/home/ismail/projects/ats/kaauh_ats")
def test_complete_email_workflow():
"""Test complete email workflow with new unified service."""
print("Testing complete email workflow...")
try:
# Test 1: Import all components
from recruitment.services.email_service import UnifiedEmailService
from recruitment.dto.email_dto import (
EmailConfig,
BulkEmailConfig,
EmailTemplate,
EmailPriority,
)
from recruitment.email_templates import EmailTemplates
print("✓ All imports successful")
# Test 2: Create unified service
service = UnifiedEmailService()
template_manager = EmailTemplates()
print("✓ Service and template manager created")
# Test 3: Create email configurations
single_config = EmailConfig(
to_email="test@example.com",
subject="Test Single Email",
template_name=EmailTemplate.BRANDED_BASE.value,
context={
"user_name": "Test User",
"email_message": "This is a test message",
"cta_link": "https://example.com",
"cta_text": "Click Here",
},
priority=EmailPriority.HIGH,
)
print("✓ Single email config created")
bulk_config = BulkEmailConfig(
subject="Test Bulk Email",
template_name=EmailTemplate.BRANDED_BASE.value,
recipients_data=[
{
"email": "user1@example.com",
"name": "User One",
"personalization": {"department": "Engineering"},
},
{
"email": "user2@example.com",
"name": "User Two",
"personalization": {"department": "Marketing"},
},
],
priority=EmailPriority.NORMAL,
async_send=False, # Test synchronous
)
print("✓ Bulk email config created")
# Test 4: Template context building
base_context = template_manager.get_base_context()
interview_context = template_manager.build_interview_context(
type(
"MockCandidate",
(),
{
"full_name": "Test Candidate",
"name": "Test Candidate",
"email": "test@example.com",
"phone": "123-456-7890",
},
)(),
type("MockJob", (), {"title": "Test Job", "department": "IT"})(),
{
"topic": "Test Interview",
"date_time": "2024-01-01 10:00",
"duration": "60 minutes",
"join_url": "https://zoom.us/test",
},
)
print("✓ Template context building works")
# Test 5: Subject line generation
subject = template_manager.get_subject_line(
EmailTemplate.INTERVIEW_INVITATION, interview_context
)
print(f"✓ Subject generation works: {subject}")
# Test 6: Validation
try:
invalid_config = EmailConfig(
to_email="", # Invalid
subject="",
template_name="test.html",
)
print("✗ Validation should have failed")
return False
except ValueError:
print("✓ EmailConfig validation working correctly")
print("\n🎉 Complete workflow test passed!")
print("All components working together correctly.")
return True
except Exception as e:
print(f"✗ Complete workflow test failed: {e}")
import traceback
traceback.print_exc()
return False
def test_migration_compatibility():
"""Test that migrated functions maintain compatibility."""
print("\nTesting migration compatibility...")
try:
# Test legacy function access
from recruitment.utils import send_interview_email
from recruitment.email_service import (
EmailService,
send_interview_invitation_email,
send_bulk_email,
)
print("✓ Legacy functions still accessible")
# Test that they have expected signatures
import inspect
# Check send_interview_email signature
sig = inspect.signature(send_interview_email)
expected_params = ["scheduled_interview"]
actual_params = list(sig.parameters.keys())
if all(param in actual_params for param in expected_params):
print("✓ send_interview_email signature compatible")
else:
print(f"✗ send_interview_email signature mismatch: {actual_params}")
return False
# Check EmailService class
if hasattr(EmailService, "send_email"):
print("✓ EmailService.send_email method available")
else:
print("✗ EmailService.send_email method missing")
return False
return True
except Exception as e:
print(f"✗ Migration compatibility test failed: {e}")
return False
def test_error_handling():
"""Test error handling in new service."""
print("\nTesting error handling...")
try:
from recruitment.services.email_service import UnifiedEmailService
from recruitment.dto.email_dto import EmailConfig
service = UnifiedEmailService()
# Test with invalid template (should handle gracefully)
config = EmailConfig(
to_email="test@example.com",
subject="Test Error Handling",
template_name="nonexistent/template.html", # This should cause an error
context={"test": "data"},
)
# This should not crash, but handle the error gracefully
result = service.send_email(config)
# We expect this to fail gracefully, not crash
if not result.success:
print("✓ Error handling working - graceful failure")
else:
print("✗ Error handling issue - should have failed")
return False
return True
except Exception as e:
print(f"✗ Error handling test failed (crashed): {e}")
return False
def main():
"""Run all integration tests."""
print("=" * 70)
print("Email Refactoring Integration Tests")
print("=" * 70)
tests = [
test_complete_email_workflow,
test_migration_compatibility,
test_error_handling,
]
passed = 0
total = len(tests)
for test in tests:
if test():
passed += 1
print("\n" + "=" * 70)
print(f"Integration Test Results: {passed}/{total} tests passed")
if passed == total:
print("🎉 All integration tests passed!")
print("\n📊 Phase 3 Summary:")
print("✅ Views integration ready")
print("✅ Complete workflow functional")
print("✅ Migration compatibility maintained")
print("✅ Error handling robust")
print("✅ All components working together")
print("\n🚀 Email refactoring complete and ready for production!")
return True
else:
print("❌ Some integration tests failed. Check errors above.")
return False
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)