LinkedinAgent / test_cache.py
Hydra-Bolt
add
3856f78
#!/usr/bin/env python3
"""
Test script to demonstrate the cache system functionality
"""
import time
import logging
from app.services.linkedin_search import LinkedInSearchService
from app.services.cache_service import CacheService
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def test_cache_functionality():
"""Test the cache system functionality"""
logger.info("๐Ÿงช Starting cache system test...")
# Initialize services
linkedin_service = LinkedInSearchService()
cache_service = linkedin_service.cache_service
# Test 1: Check initial cache stats
logger.info("\n๐Ÿ“Š Test 1: Initial cache statistics")
stats = cache_service.get_cache_stats()
logger.info(f"Cache enabled: {stats['cache_enabled']}")
logger.info(f"Cache TTL: {stats['cache_ttl']} seconds")
logger.info(f"Cache max size: {stats['cache_max_size']}")
logger.info(f"Search cache size: {stats['search_cache_size']}")
logger.info(f"Profile cache size: {stats['profile_cache_size']}")
logger.info(f"Query cache size: {stats['query_cache_size']}")
# Test 2: Test search caching
logger.info("\n๐Ÿ” Test 2: Search result caching")
job_description = "Senior Python Developer with React experience"
location = "San Francisco, CA"
# First search (should miss cache)
logger.info("Performing first search (should miss cache)...")
start_time = time.time()
results1 = linkedin_service.search_linkedin_profiles(
job_description=job_description,
location=location,
max_results=5
)
first_search_time = time.time() - start_time
logger.info(f"First search completed in {first_search_time:.2f} seconds")
logger.info(f"Found {len(results1)} candidates")
# Second search (should hit cache)
logger.info("Performing second search (should hit cache)...")
start_time = time.time()
results2 = linkedin_service.search_linkedin_profiles(
job_description=job_description,
location=location,
max_results=5
)
second_search_time = time.time() - start_time
logger.info(f"Second search completed in {second_search_time:.2f} seconds")
logger.info(f"Found {len(results2)} candidates")
# Compare results
if len(results1) == len(results2):
logger.info("โœ… Cache test successful - same number of results returned")
else:
logger.warning("โš ๏ธ Cache test failed - different number of results")
# Check performance improvement
if first_search_time > 0:
improvement = ((first_search_time - second_search_time) / first_search_time) * 100
logger.info(f"Performance improvement: {improvement:.1f}%")
# Test 3: Test query caching
logger.info("\n๐ŸŒ Test 3: Query result caching")
test_query = "site:linkedin.com/in/ Python Developer San Francisco"
# First query (should miss cache)
logger.info("Performing first query (should miss cache)...")
start_time = time.time()
query_results1 = linkedin_service._perform_google_search(test_query, 5)
first_query_time = time.time() - start_time
logger.info(f"First query completed in {first_query_time:.2f} seconds")
logger.info(f"Found {len(query_results1)} query results")
# Second query (should hit cache)
logger.info("Performing second query (should hit cache)...")
start_time = time.time()
query_results2 = linkedin_service._perform_google_search(test_query, 5)
second_query_time = time.time() - start_time
logger.info(f"Second query completed in {second_query_time:.2f} seconds")
logger.info(f"Found {len(query_results2)} query results")
# Test 4: Test profile caching
logger.info("\n๐Ÿ‘ค Test 4: Profile data caching")
if results1:
test_profile_url = results1[0].get('profile_url', '')
if test_profile_url:
logger.info(f"Testing profile caching for: {test_profile_url}")
# First profile scrape (should miss cache)
logger.info("Performing first profile scrape (should miss cache)...")
start_time = time.time()
profile_data1 = linkedin_service._scrape_linkedin_profile(test_profile_url)
first_profile_time = time.time() - start_time
logger.info(f"First profile scrape completed in {first_profile_time:.2f} seconds")
# Second profile scrape (should hit cache)
logger.info("Performing second profile scrape (should hit cache)...")
start_time = time.time()
profile_data2 = linkedin_service._scrape_linkedin_profile(test_profile_url)
second_profile_time = time.time() - start_time
logger.info(f"Second profile scrape completed in {second_profile_time:.2f} seconds")
if profile_data1.get('success') == profile_data2.get('success'):
logger.info("โœ… Profile cache test successful")
else:
logger.warning("โš ๏ธ Profile cache test failed")
# Test 5: Updated cache stats
logger.info("\n๐Ÿ“Š Test 5: Updated cache statistics")
updated_stats = cache_service.get_cache_stats()
logger.info(f"Search cache size: {updated_stats['search_cache_size']}")
logger.info(f"Profile cache size: {updated_stats['profile_cache_size']}")
logger.info(f"Query cache size: {updated_stats['query_cache_size']}")
# Test 6: Cache cleanup
logger.info("\n๐Ÿงน Test 6: Cache cleanup")
cache_service.cleanup_expired_entries()
logger.info("Cache cleanup completed")
# Test 7: Cache clearing
logger.info("\n๐Ÿ—‘๏ธ Test 7: Cache clearing")
cache_service.clear_cache("query") # Clear only query cache
logger.info("Query cache cleared")
final_stats = cache_service.get_cache_stats()
logger.info(f"Query cache size after clearing: {final_stats['query_cache_size']}")
logger.info("\n๐ŸŽ‰ Cache system test completed successfully!")
def test_cache_persistence():
"""Test cache persistence to file"""
logger.info("\n๐Ÿ’พ Testing cache persistence...")
# Initialize cache service
cache_service = CacheService()
# Add some test data
test_data = {
"test_search": [{"name": "Test Candidate", "profile_url": "https://linkedin.com/in/test"}],
"test_profile": {"name": "Test Profile", "success": True}
}
# Set test data
cache_service.set_search_results("test job", "test location", 5, test_data["test_search"])
cache_service.set_profile_data("https://linkedin.com/in/test", test_data["test_profile"])
logger.info("Test data added to cache")
# Force save to persistent storage
cache_service._save_persistent_cache()
logger.info("Cache saved to persistent storage")
# Create new cache service instance (simulates restart)
new_cache_service = CacheService()
# Try to retrieve the data
retrieved_search = new_cache_service.get_search_results("test job", "test location", 5)
retrieved_profile = new_cache_service.get_profile_data("https://linkedin.com/in/test")
if retrieved_search and retrieved_profile:
logger.info("โœ… Cache persistence test successful")
else:
logger.warning("โš ๏ธ Cache persistence test failed")
# Clean up test data
new_cache_service.clear_cache("all")
if __name__ == "__main__":
try:
test_cache_functionality()
test_cache_persistence()
except Exception as e:
logger.error(f"โŒ Test failed: {str(e)}")
raise