#!/usr/bin/env python """ Clean test script for email attachment functionality """ import os import sys import django from django.conf import settings # Configure Django settings BEFORE importing any Django modules if not settings.configured: settings.configure( DEBUG=True, DATABASES={ 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', } }, USE_TZ=True, SECRET_KEY='test-secret-key', INSTALLED_APPS=[ 'django.contrib.contenttypes', 'django.contrib.auth', 'django.contrib.sessions', 'recruitment', ], EMAIL_BACKEND='django.core.mail.backends.console.EmailBackend', MEDIA_ROOT='/tmp/test_media', FILE_UPLOAD_TEMP_DIR='/tmp/test_uploads', ) # Setup Django django.setup() # Now import Django modules from django.test import TestCase, Client from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.base import ContentFile import io from unittest.mock import Mock from recruitment.email_service import send_bulk_email from recruitment.forms import CandidateEmailForm from recruitment.models import JobPosting, Candidate from django.test import RequestFactory from django.contrib.auth.models import User # Setup test database from django.db import connection from django.core.management import execute_from_command_line def setup_test_data(): """Create test data for email attachment testing""" # Create test user user = User.objects.create_user( username='testuser', email='test@example.com', first_name='Test', last_name='User' ) # Create test job job = JobPosting.objects.create( title='Test Job Position', description='This is a test job for email attachment testing.', status='ACTIVE', internal_job_id='TEST-001' ) # Create test candidate candidate = Candidate.objects.create( first_name='John', last_name='Doe', email='john.doe@example.com', phone='+1234567890', address='123 Test Street', job=job, stage='Interview' ) return user, job, candidate def test_email_service_with_attachments(): """Test the email service directly with attachments""" print("Testing email service with attachments...") # Create test files test_files = [] # Test 1: Simple text file text_content = "This is a test attachment content." text_file = ContentFile( text_content.encode('utf-8'), name='test_document.txt' ) test_files.append(('test_document.txt', text_file, 'text/plain')) # Test 2: PDF content (simulated) pdf_content = b'%PDF-1.4\n1 0 obj\n<<\n/Length 100\n>>stream\nxref\nstartxref\n1234\n5678\n/ModDate(D:20250101)\n' pdf_file = ContentFile( pdf_content, name='test_document.pdf' ) test_files.append(('test_document.pdf', pdf_file, 'application/pdf')) # Test 3: Image file (simulated PNG header) image_content = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01' image_file = ContentFile( image_content, name='test_image.png' ) test_files.append(('test_image.png', image_file, 'image/png')) try: # Test email service with attachments result = send_bulk_email( subject='Test Email with Attachments', body='This is a test email with attachments.', from_email='test@example.com', recipient_list=['recipient@example.com'], attachments=test_files ) print(f"Email service result: {result}") print("✓ Email service with attachments test passed") return True except Exception as e: print(f"✗ Email service test failed: {e}") return False def test_candidate_email_form_with_attachments(): """Test the CandidateEmailForm with attachments""" print("\nTesting CandidateEmailForm with attachments...") user, job, candidate = setup_test_data() # Create test files for form text_file = SimpleUploadedFile( "test.txt", b"This is test content for form attachment" ) pdf_file = SimpleUploadedFile( "test.pdf", b"%PDF-1.4 test content" ) form_data = { 'subject': 'Test Subject', 'body': 'Test body content', 'from_email': 'test@example.com', 'recipient_list': 'recipient@example.com', } files_data = { 'attachments': [text_file, pdf_file] } try: form = CandidateEmailForm(data=form_data, files=files_data) if form.is_valid(): print("✓ Form validation passed") print(f"Form cleaned data: {form.cleaned_data}") # Test form processing try: result = form.save() print(f"✓ Form save result: {result}") return True except Exception as e: print(f"✗ Form save failed: {e}") return False else: print(f"✗ Form validation failed: {form.errors}") return False except Exception as e: print(f"✗ Form test failed: {e}") return False def test_email_view_with_attachments(): """Test the email view with attachments""" print("\nTesting email view with attachments...") user, job, candidate = setup_test_data() factory = RequestFactory() # Create a mock request with files text_file = SimpleUploadedFile( "test.txt", b"This is test content for view attachment" ) request = factory.post( '/recruitment/send-candidate-email/', data={ 'subject': 'Test Subject', 'body': 'Test body content', 'from_email': 'test@example.com', 'recipient_list': 'recipient@example.com', }, format='multipart' ) request.FILES['attachments'] = [text_file] request.user = user try: # Import and test the view from recruitment.views import send_candidate_email response = send_candidate_email(request) print(f"View response status: {response.status_code}") if response.status_code == 200: print("✓ Email view test passed") return True else: print(f"✗ Email view test failed with status: {response.status_code}") return False except Exception as e: print(f"✗ Email view test failed: {e}") return False def main(): """Run all email attachment tests""" print("=" * 60) print("EMAIL ATTACHMENT FUNCTIONALITY TESTS") print("=" * 60) # Initialize Django django.setup() # Create tables from django.core.management import execute_from_command_line execute_from_command_line(['manage.py', 'migrate', '--run-syncdb']) results = [] # Run tests results.append(test_email_service_with_attachments()) results.append(test_candidate_email_form_with_attachments()) results.append(test_email_view_with_attachments()) # Summary print("\n" + "=" * 60) print("TEST SUMMARY") print("=" * 60) passed = sum(results) total = len(results) print(f"Tests passed: {passed}/{total}") if passed == total: print("🎉 All email attachment tests passed!") return True else: print("❌ Some email attachment tests failed!") return False if __name__ == '__main__': success = main() exit(0 if success else 1)