151 lines
4.4 KiB
Python
151 lines
4.4 KiB
Python
"""
|
|
Shared pytest fixtures for Crawl4AI tests.
|
|
"""
|
|
|
|
import pytest
|
|
import tempfile
|
|
import os
|
|
from pathlib import Path
|
|
from unittest.mock import Mock, patch
|
|
from crawl4ai.telemetry.config import TelemetryConfig, TelemetryConsent
|
|
from crawl4ai.telemetry.environment import Environment
|
|
|
|
|
|
@pytest.fixture
|
|
def temp_config_dir():
|
|
"""Provide a temporary directory for telemetry config testing."""
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
yield Path(tmpdir)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_telemetry_config(temp_config_dir):
|
|
"""Provide a mocked telemetry config for testing."""
|
|
config = TelemetryConfig(config_dir=temp_config_dir)
|
|
yield config
|
|
|
|
|
|
@pytest.fixture
|
|
def clean_environment():
|
|
"""Clean environment variables before and after test."""
|
|
# Store original environment
|
|
original_env = os.environ.copy()
|
|
|
|
# Clean telemetry-related env vars
|
|
telemetry_vars = [
|
|
'CRAWL4AI_TELEMETRY',
|
|
'CRAWL4AI_DOCKER',
|
|
'CRAWL4AI_API_SERVER',
|
|
'CRAWL4AI_TEST_MODE'
|
|
]
|
|
|
|
for var in telemetry_vars:
|
|
if var in os.environ:
|
|
del os.environ[var]
|
|
|
|
# Set test mode
|
|
os.environ['CRAWL4AI_TEST_MODE'] = '1'
|
|
|
|
yield
|
|
|
|
# Restore original environment
|
|
os.environ.clear()
|
|
os.environ.update(original_env)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_sentry_provider():
|
|
"""Provide a mocked Sentry provider for testing."""
|
|
with patch('crawl4ai.telemetry.providers.sentry.SentryProvider') as mock:
|
|
provider_instance = Mock()
|
|
provider_instance.initialize.return_value = True
|
|
provider_instance.send_exception.return_value = True
|
|
provider_instance.is_initialized = True
|
|
mock.return_value = provider_instance
|
|
yield provider_instance
|
|
|
|
|
|
@pytest.fixture
|
|
def enabled_telemetry_config(temp_config_dir): # noqa: F811
|
|
"""Provide a telemetry config with telemetry enabled."""
|
|
config = Mock()
|
|
config.get_consent.return_value = TelemetryConsent.ALWAYS
|
|
config.is_enabled.return_value = True
|
|
config.should_send_current.return_value = True
|
|
config.get_email.return_value = "test@example.com"
|
|
config.update_from_env.return_value = None
|
|
yield config
|
|
|
|
|
|
@pytest.fixture
|
|
def disabled_telemetry_config(temp_config_dir): # noqa: F811
|
|
"""Provide a telemetry config with telemetry disabled."""
|
|
config = Mock()
|
|
config.get_consent.return_value = TelemetryConsent.DENIED
|
|
config.is_enabled.return_value = False
|
|
config.should_send_current.return_value = False
|
|
config.update_from_env.return_value = None
|
|
yield config
|
|
|
|
|
|
@pytest.fixture
|
|
def docker_environment():
|
|
"""Mock Docker environment detection."""
|
|
with patch('crawl4ai.telemetry.environment.EnvironmentDetector.detect', return_value=Environment.DOCKER):
|
|
yield
|
|
|
|
|
|
@pytest.fixture
|
|
def cli_environment():
|
|
"""Mock CLI environment detection."""
|
|
with patch('crawl4ai.telemetry.environment.EnvironmentDetector.detect', return_value=Environment.CLI):
|
|
with patch('sys.stdin.isatty', return_value=True):
|
|
yield
|
|
|
|
|
|
@pytest.fixture
|
|
def jupyter_environment():
|
|
"""Mock Jupyter environment detection."""
|
|
with patch('crawl4ai.telemetry.environment.EnvironmentDetector.detect', return_value=Environment.JUPYTER):
|
|
yield
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def reset_telemetry_singleton():
|
|
"""Reset telemetry singleton between tests."""
|
|
from crawl4ai.telemetry import TelemetryManager
|
|
# Reset the singleton instance
|
|
if hasattr(TelemetryManager, '_instance'):
|
|
TelemetryManager._instance = None # noqa: SLF001
|
|
yield
|
|
# Clean up after test
|
|
if hasattr(TelemetryManager, '_instance'):
|
|
TelemetryManager._instance = None # noqa: SLF001
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_exception():
|
|
"""Provide a sample exception for testing."""
|
|
try:
|
|
raise ValueError("Test exception for telemetry")
|
|
except ValueError as e:
|
|
return e
|
|
|
|
|
|
@pytest.fixture
|
|
def privacy_test_data():
|
|
"""Provide test data that should NOT be captured by telemetry."""
|
|
return {
|
|
'url': 'https://example.com/private-page',
|
|
'content': 'This is private content that should not be sent',
|
|
'user_data': {
|
|
'email': 'user@private.com',
|
|
'password': 'secret123',
|
|
'api_key': 'sk-1234567890abcdef'
|
|
},
|
|
'pii': {
|
|
'ssn': '123-45-6789',
|
|
'phone': '+1-555-123-4567',
|
|
'address': '123 Main St, Anytown, USA'
|
|
}
|
|
} |