#!/usr/bin/env python """ Test script for tracking integration in newsletter sender. Tests tracking pixel injection and link replacement. """ import sys from pathlib import Path # Add backend directory to path backend_dir = Path(__file__).parent.parent / 'backend' sys.path.insert(0, str(backend_dir)) from tracking_integration import inject_tracking_pixel, replace_article_links def test_inject_tracking_pixel(): """Test that tracking pixel is correctly injected into HTML""" print("\n" + "="*70) print("TEST 1: Inject Tracking Pixel") print("="*70) # Test HTML html = """

Newsletter content

""" tracking_id = "test-tracking-123" api_url = "http://localhost:5001" # Inject pixel result = inject_tracking_pixel(html, tracking_id, api_url) # Verify pixel is present expected_pixel = f'' if expected_pixel in result: print("✓ Tracking pixel correctly injected") print(f" Pixel URL: {api_url}/api/track/pixel/{tracking_id}") return True else: print("✗ Tracking pixel NOT found in HTML") print(f" Expected: {expected_pixel}") print(f" Result: {result}") return False def test_replace_article_links(): """Test that article links are correctly replaced with tracking URLs""" print("\n" + "="*70) print("TEST 2: Replace Article Links") print("="*70) # Test HTML with article links html = """ Article 1 Article 2 Untracked Link """ # Tracking map link_tracking_map = { "https://example.com/article1": "track-id-1", "https://example.com/article2": "track-id-2" } api_url = "http://localhost:5001" # Replace links result = replace_article_links(html, link_tracking_map, api_url) # Verify replacements success = True # Check article 1 link expected_url_1 = f"{api_url}/api/track/click/track-id-1" if expected_url_1 in result: print(f"✓ Article 1 link replaced: {expected_url_1}") else: print(f"✗ Article 1 link NOT replaced") success = False # Check article 2 link expected_url_2 = f"{api_url}/api/track/click/track-id-2" if expected_url_2 in result: print(f"✓ Article 2 link replaced: {expected_url_2}") else: print(f"✗ Article 2 link NOT replaced") success = False # Check untracked link remains unchanged if "https://example.com/untracked" in result: print(f"✓ Untracked link preserved: https://example.com/untracked") else: print(f"✗ Untracked link was modified (should remain unchanged)") success = False return success def test_full_integration(): """Test full integration: pixel + link replacement""" print("\n" + "="*70) print("TEST 3: Full Integration (Pixel + Links)") print("="*70) # Test HTML html = """

Newsletter

Read Article """ api_url = "http://localhost:5001" pixel_tracking_id = "pixel-123" link_tracking_map = { "https://example.com/article": "link-456" } # First inject pixel html = inject_tracking_pixel(html, pixel_tracking_id, api_url) # Then replace links html = replace_article_links(html, link_tracking_map, api_url) # Verify both are present success = True pixel_url = f"{api_url}/api/track/pixel/{pixel_tracking_id}" if pixel_url in html: print(f"✓ Tracking pixel present: {pixel_url}") else: print(f"✗ Tracking pixel NOT found") success = False link_url = f"{api_url}/api/track/click/link-456" if link_url in html: print(f"✓ Tracking link present: {link_url}") else: print(f"✗ Tracking link NOT found") success = False if success: print("\n✓ Full integration successful!") print("\nFinal HTML:") print("-" * 70) print(html) print("-" * 70) return success if __name__ == '__main__': print("\n" + "="*70) print("TRACKING INTEGRATION TEST SUITE") print("="*70) results = [] # Run tests results.append(("Inject Tracking Pixel", test_inject_tracking_pixel())) results.append(("Replace Article Links", test_replace_article_links())) results.append(("Full Integration", test_full_integration())) # Summary print("\n" + "="*70) print("TEST SUMMARY") print("="*70) passed = sum(1 for _, result in results if result) total = len(results) for test_name, result in results: status = "✓ PASS" if result else "✗ FAIL" print(f"{status}: {test_name}") print("-" * 70) print(f"Results: {passed}/{total} tests passed") print("="*70 + "\n") # Exit with appropriate code sys.exit(0 if passed == total else 1)