This commit is contained in:
Constantin
2025-09-12 23:04:52 +03:00
commit 2277b11563
127 changed files with 23640 additions and 0 deletions
+247
View File
@@ -0,0 +1,247 @@
#!/usr/bin/env python3
"""
Tests for LogManager
"""
import unittest
import json
import tempfile
import os
import shutil
import time
from datetime import datetime, timedelta
from unittest.mock import Mock, patch, MagicMock
import sys
from pathlib import Path
# Add api directory to path
api_dir = Path(__file__).parent.parent / 'api'
sys.path.insert(0, str(api_dir))
from log_manager import LogManager, LogLevel
class TestLogManager(unittest.TestCase):
"""Test the log manager functionality"""
def setUp(self):
self.temp_dir = tempfile.mkdtemp()
self.log_dir = os.path.join(self.temp_dir, 'logs')
os.makedirs(self.log_dir, exist_ok=True)
self.log_manager = LogManager(log_dir=self.log_dir)
# Add this helper to ensure log dir exists before logger usage
def ensure_log_dir(self):
os.makedirs(self.log_dir, exist_ok=True)
# In each test that uses logger, call self.ensure_log_dir() before logger usage
def test_initialization(self):
"""Test log manager initialization"""
self.assertTrue(os.path.exists(self.log_dir))
self.assertIsNotNone(self.log_manager.formatters)
self.assertIsNotNone(self.log_manager.handlers)
self.assertIsNotNone(self.log_manager.log_stats)
def test_add_service_logger(self):
self.ensure_log_dir()
"""Test adding service logger"""
config = {
'level': 'INFO',
'formatter': 'json',
'console': True
}
self.log_manager.add_service_logger('test_service', config)
self.assertIn('test_service', self.log_manager.service_loggers)
self.assertIn('test_service', self.log_manager.handlers)
def test_get_service_logs(self):
self.ensure_log_dir()
"""Test getting service logs"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("Test log message 1")
logger.warning("Test log message 2")
logger.error("Test log message 3")
# Get logs
logs = self.log_manager.get_service_logs('test_service', lines=3)
self.assertIsInstance(logs, list)
# Note: We can't guarantee exact count due to async logging
def test_search_logs(self):
self.ensure_log_dir()
"""Test log search functionality"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("User login successful")
logger.info("Database connection established")
logger.error("Authentication failed")
# Search logs
results = self.log_manager.search_logs('login')
self.assertIsInstance(results, list)
# Search with time range
end_time = datetime.now()
start_time = end_time - timedelta(hours=1)
results = self.log_manager.search_logs(
'login',
time_range=(start_time, end_time)
)
self.assertIsInstance(results, list)
# Search with service filter
results = self.log_manager.search_logs(
'login',
services=['test_service']
)
self.assertIsInstance(results, list)
def test_export_logs(self):
self.ensure_log_dir()
"""Test log export functionality"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("Export test message 1")
logger.info("Export test message 2")
# Export as JSON
json_export = self.log_manager.export_logs('json')
self.assertIsInstance(json_export, str)
# Export as CSV
csv_export = self.log_manager.export_logs('csv')
self.assertIsInstance(csv_export, str)
# Export as text
text_export = self.log_manager.export_logs('text')
self.assertIsInstance(text_export, str)
def test_log_statistics(self):
self.ensure_log_dir()
"""Test log statistics functionality"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
# Get statistics
stats = self.log_manager.get_log_statistics()
self.assertIsInstance(stats, dict)
# Get service-specific statistics
service_stats = self.log_manager.get_log_statistics('test_service')
self.assertIsInstance(service_stats, dict)
def test_log_rotation(self):
self.ensure_log_dir()
"""Test log rotation functionality"""
# Add service logger with small max file size
config = {
'level': 'INFO',
'formatter': 'text'
}
self.log_manager.add_service_logger('test_service', config)
# Create many log entries to trigger rotation
logger = self.log_manager.service_loggers['test_service']
for i in range(1000):
logger.info(f"Log entry {i}: " + "x" * 100) # Large log entries
# Trigger rotation
self.log_manager.rotate_logs('test_service')
# Check if rotation files exist
log_file = os.path.join(self.log_dir, 'test_service.log')
self.assertTrue(os.path.exists(log_file))
def test_cleanup_old_logs(self):
self.ensure_log_dir()
"""Test cleanup of old logs"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("Test message")
# Cleanup old logs (should not affect recent logs)
self.log_manager.cleanup_old_logs(days=1)
# Verify logs still exist
logs = self.log_manager.get_service_logs('test_service')
self.assertIsInstance(logs, list)
def test_log_file_info(self):
self.ensure_log_dir()
"""Test log file information"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("Test message")
# Get log file info
info = self.log_manager.get_log_file_info('test_service')
self.assertIsInstance(info, dict)
self.assertIn('file_path', info)
self.assertIn('exists', info)
def test_compress_old_logs(self):
self.ensure_log_dir()
"""Test compression of old logs"""
# Add service logger
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
# Create some log entries
logger = self.log_manager.service_loggers['test_service']
logger.info("Test message for compression")
# Compress old logs
self.log_manager.compress_old_logs()
# Verify compression worked (should not raise errors)
self.assertTrue(True) # If we get here, compression worked
def test_formatters(self):
self.ensure_log_dir()
"""Test different log formatters"""
# Test JSON formatter
json_logger = self.log_manager.add_service_logger('json_service', {
'level': 'INFO',
'formatter': 'json'
})
# Test text formatter
text_logger = self.log_manager.add_service_logger('text_service', {
'level': 'INFO',
'formatter': 'text'
})
# Test detailed formatter
detailed_logger = self.log_manager.add_service_logger('detailed_service', {
'level': 'INFO',
'formatter': 'detailed'
})
# Verify formatters exist
self.assertIn('json', self.log_manager.formatters)
self.assertIn('text', self.log_manager.formatters)
self.assertIn('detailed', self.log_manager.formatters)
if __name__ == '__main__':
unittest.main()