Files
crawl4ai/tests/conftest.py

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'
}
}