Archon/python/tests/conftest.py

125 lines
3.9 KiB
Python

"""Simple test configuration for Archon - Essential tests only."""
import os
from unittest.mock import MagicMock, patch
import pytest
from fastapi.testclient import TestClient
# Set test environment
os.environ["TEST_MODE"] = "true"
os.environ["TESTING"] = "true"
# Set fake database credentials to prevent connection attempts
os.environ["SUPABASE_URL"] = "https://test.supabase.co"
os.environ["SUPABASE_SERVICE_KEY"] = "test-key"
# Set required port environment variables for ServiceDiscovery
os.environ.setdefault("ARCHON_SERVER_PORT", "8181")
os.environ.setdefault("ARCHON_MCP_PORT", "8051")
os.environ.setdefault("ARCHON_AGENTS_PORT", "8052")
@pytest.fixture(autouse=True)
def prevent_real_db_calls():
"""Automatically prevent any real database calls in all tests."""
with patch("supabase.create_client") as mock_create:
# Make create_client raise an error if called without our mock
mock_create.side_effect = Exception("Real database calls are not allowed in tests!")
yield
@pytest.fixture
def mock_supabase_client():
"""Mock Supabase client for testing."""
mock_client = MagicMock()
# Mock table operations with chaining support
mock_table = MagicMock()
mock_select = MagicMock()
mock_insert = MagicMock()
mock_update = MagicMock()
mock_delete = MagicMock()
# Setup method chaining for select
mock_select.execute.return_value.data = []
mock_select.eq.return_value = mock_select
mock_select.neq.return_value = mock_select
mock_select.order.return_value = mock_select
mock_select.limit.return_value = mock_select
mock_table.select.return_value = mock_select
# Setup method chaining for insert
mock_insert.execute.return_value.data = [{"id": "test-id"}]
mock_table.insert.return_value = mock_insert
# Setup method chaining for update
mock_update.execute.return_value.data = [{"id": "test-id"}]
mock_update.eq.return_value = mock_update
mock_table.update.return_value = mock_update
# Setup method chaining for delete
mock_delete.execute.return_value.data = []
mock_delete.eq.return_value = mock_delete
mock_table.delete.return_value = mock_delete
# Make table() return the mock table
mock_client.table.return_value = mock_table
# Mock auth operations
mock_client.auth = MagicMock()
mock_client.auth.get_user.return_value = None
# Mock storage operations
mock_client.storage = MagicMock()
return mock_client
@pytest.fixture
def client(mock_supabase_client):
"""FastAPI test client with mocked database."""
# Patch all the ways Supabase client can be created
with patch(
"src.server.services.client_manager.create_client", return_value=mock_supabase_client
):
with patch(
"src.server.services.credential_service.create_client",
return_value=mock_supabase_client,
):
with patch(
"src.server.services.client_manager.get_supabase_client",
return_value=mock_supabase_client,
):
with patch("supabase.create_client", return_value=mock_supabase_client):
# Import app after patching to ensure mocks are used
from src.server.main import app
return TestClient(app)
@pytest.fixture
def test_project():
"""Simple test project data."""
return {"title": "Test Project", "description": "A test project for essential tests"}
@pytest.fixture
def test_task():
"""Simple test task data."""
return {
"title": "Test Task",
"description": "A test task for essential tests",
"status": "todo",
"assignee": "User",
}
@pytest.fixture
def test_knowledge_item():
"""Simple test knowledge item data."""
return {
"url": "https://example.com/test",
"title": "Test Knowledge Item",
"content": "This is test content for knowledge base",
"source_id": "test-source",
}