Files
cleveragents-core/features/environment.py
T

120 lines
3.8 KiB
Python

"""Behave environment setup for feature tests."""
import os
import shutil
from pathlib import Path
def before_all(context):
"""Set up test environment before all tests."""
# Use the actual Plandex repository if it exists
plandex_path = Path("/app/plandex")
if plandex_path.exists():
context.plandex_root = plandex_path
else:
# Tests will skip if Plandex directory doesn't exist
context.plandex_root = None
# Set up mock AI provider for all tests
try:
from cleveragents.application.container import get_container, override_providers
from features.mocks.mock_ai_provider import MockAIProvider
# Override the AI provider with mock for all tests
mock_provider = MockAIProvider()
override_providers(ai_provider=mock_provider)
except ImportError:
pass # Container not needed for all tests
def before_scenario(context, scenario):
"""Set up before each scenario."""
# Store original working directory
context.original_cwd = os.getcwd()
# Initialize cleanup list
context._cleanup_handlers = []
# Re-apply mock AI provider after container reset
try:
from cleveragents.application.container import get_container, override_providers
from features.mocks.mock_ai_provider import MockAIProvider
# Override the AI provider with mock for all tests
mock_provider = MockAIProvider()
override_providers(ai_provider=mock_provider)
except ImportError:
pass # Container not needed for all tests
def after_scenario(context, scenario):
"""Clean up after each scenario."""
# Return to original directory first
if hasattr(context, "original_cwd"):
os.chdir(context.original_cwd)
# Run all cleanup handlers in reverse order
if hasattr(context, "_cleanup_handlers"):
for handler in reversed(context._cleanup_handlers):
try:
handler()
except Exception:
pass # Ignore cleanup errors
context._cleanup_handlers = []
# Clean up any test directories
if hasattr(context, "test_dir") and context.test_dir:
try:
if Path(context.test_dir).exists():
shutil.rmtree(context.test_dir)
except Exception:
pass # Ignore cleanup errors
context.test_dir = None
# Clean up environment variables set during tests
if hasattr(context, "env_vars_to_clean"):
for key in context.env_vars_to_clean:
os.environ.pop(key, None)
context.env_vars_to_clean = []
# Reset Settings singleton if it was used
try:
from cleveragents.config.settings import Settings
Settings._instance = None
except ImportError:
pass
# Reset global container singleton
try:
from cleveragents.application.container import reset_container
reset_container()
except ImportError:
pass
# Clean up service instances
for attr in ["context_service", "plan_service", "project_service"]:
if hasattr(context, attr):
delattr(context, attr)
# Clean up any remaining attributes that might hold state
for attr in ["plan", "plans", "project", "changes", "added_files", "all_plans"]:
if hasattr(context, attr):
delattr(context, attr)
# Clean up in-memory database engine cache to ensure each scenario
# gets a fresh database. This is critical for tests using :memory: databases
try:
from cleveragents.infrastructure.database.engine_cache import MEMORY_ENGINES
# Dispose of all cached engines and clear the cache
for url, engine in list(MEMORY_ENGINES.items()):
try:
engine.dispose()
except Exception:
pass
MEMORY_ENGINES.clear()
except ImportError:
pass