CI/CD Optimization: Guard Rails, Pre-commit Checks, and Test Fixes (#90)
* CI/CD Optimization: Guard Rails, Black Linting, and Pre-commit Hooks
- Fixed all test collection errors (Selenium imports, fixture paths, syntax)
- Implemented pre-commit hooks with Black formatting and isort
- Created comprehensive Makefile with test targets (unit, integration, functional, e2e)
- Added pytest.ini with marker definitions for test categorization
- Established guard rails to prevent future collection errors
- Wrapped optional dependencies (Selenium, MoviePy) in try-except blocks
- Added conftest_markers for automatic test categorization
This ensures a smooth development stream with:
- Fast feedback loops (pre-commit checks before push)
- Consistent code formatting (Black)
- Reliable CI/CD (no collection errors, proper test isolation)
- Clear test organization (unit, integration, functional, E2E)
* Fix CI/CD test failures:
- Export templates from dashboard.app
- Fix model name assertion in test_agent.py
- Fix platform-agnostic path resolution in test_path_resolution.py
- Skip Docker tests in test_docker_deployment.py if docker not available
- Fix test_model_fallback_chain logic in test_ollama_integration.py
* Add preventative pre-commit checks and Docker test skipif decorators:
- Create pre_commit_checks.py script for common CI failures
- Add skipif decorators to Docker tests
- Improve test robustness for CI environments
2026-02-28 11:36:50 -05:00
|
|
|
"""Pytest configuration and fixtures for the test suite."""
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import sqlite3
|
2026-02-19 19:05:01 +00:00
|
|
|
import sys
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
from unittest.mock import MagicMock
|
|
|
|
|
|
|
|
|
|
import pytest
|
CI/CD Optimization: Guard Rails, Pre-commit Checks, and Test Fixes (#90)
* CI/CD Optimization: Guard Rails, Black Linting, and Pre-commit Hooks
- Fixed all test collection errors (Selenium imports, fixture paths, syntax)
- Implemented pre-commit hooks with Black formatting and isort
- Created comprehensive Makefile with test targets (unit, integration, functional, e2e)
- Added pytest.ini with marker definitions for test categorization
- Established guard rails to prevent future collection errors
- Wrapped optional dependencies (Selenium, MoviePy) in try-except blocks
- Added conftest_markers for automatic test categorization
This ensures a smooth development stream with:
- Fast feedback loops (pre-commit checks before push)
- Consistent code formatting (Black)
- Reliable CI/CD (no collection errors, proper test isolation)
- Clear test organization (unit, integration, functional, E2E)
* Fix CI/CD test failures:
- Export templates from dashboard.app
- Fix model name assertion in test_agent.py
- Fix platform-agnostic path resolution in test_path_resolution.py
- Skip Docker tests in test_docker_deployment.py if docker not available
- Fix test_model_fallback_chain logic in test_ollama_integration.py
* Add preventative pre-commit checks and Docker test skipif decorators:
- Create pre_commit_checks.py script for common CI failures
- Add skipif decorators to Docker tests
- Improve test robustness for CI environments
2026-02-28 11:36:50 -05:00
|
|
|
|
|
|
|
|
# Import pytest marker configuration
|
|
|
|
|
try:
|
|
|
|
|
from . import conftest_markers # noqa: F401
|
|
|
|
|
except ImportError:
|
|
|
|
|
import conftest_markers # noqa: F401
|
2026-02-19 19:05:01 +00:00
|
|
|
|
2026-02-21 16:53:16 +00:00
|
|
|
# ── Stub heavy optional dependencies so tests run without them installed ──────
|
|
|
|
|
# Uses setdefault: real module is used if already installed, mock otherwise.
|
2026-02-19 19:05:01 +00:00
|
|
|
for _mod in [
|
|
|
|
|
"agno",
|
|
|
|
|
"agno.agent",
|
|
|
|
|
"agno.models",
|
|
|
|
|
"agno.models.ollama",
|
|
|
|
|
"agno.db",
|
|
|
|
|
"agno.db.sqlite",
|
2026-02-21 16:53:16 +00:00
|
|
|
"airllm",
|
2026-02-22 17:16:12 +00:00
|
|
|
"telegram",
|
|
|
|
|
"telegram.ext",
|
2026-02-25 01:11:14 +00:00
|
|
|
"discord",
|
|
|
|
|
"discord.ext",
|
|
|
|
|
"discord.ext.commands",
|
|
|
|
|
"pyzbar",
|
|
|
|
|
"pyzbar.pyzbar",
|
2026-02-27 02:06:45 +00:00
|
|
|
"requests",
|
2026-03-05 12:09:51 -05:00
|
|
|
"celery",
|
|
|
|
|
"celery.app",
|
|
|
|
|
"celery.result",
|
2026-02-19 19:05:01 +00:00
|
|
|
]:
|
|
|
|
|
sys.modules.setdefault(_mod, MagicMock())
|
|
|
|
|
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
# ── Test mode setup ──────────────────────────────────────────────────────────
|
|
|
|
|
os.environ["TIMMY_TEST_MODE"] = "1"
|
2026-03-04 17:15:46 -05:00
|
|
|
os.environ["TIMMY_DISABLE_CSRF"] = "1"
|
|
|
|
|
os.environ["TIMMY_SKIP_EMBEDDINGS"] = "1"
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
|
2026-02-19 19:05:01 +00:00
|
|
|
|
2026-02-20 14:00:16 +00:00
|
|
|
@pytest.fixture(autouse=True)
|
|
|
|
|
def reset_message_log():
|
|
|
|
|
"""Clear the in-memory chat log before and after every test."""
|
|
|
|
|
from dashboard.store import message_log
|
|
|
|
|
message_log.clear()
|
|
|
|
|
yield
|
|
|
|
|
message_log.clear()
|
|
|
|
|
|
|
|
|
|
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
@pytest.fixture(autouse=True)
|
2026-02-28 19:27:48 -05:00
|
|
|
def clean_database(tmp_path):
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
"""Clean up database tables between tests for isolation.
|
2026-02-28 19:27:48 -05:00
|
|
|
|
2026-03-02 09:58:07 -05:00
|
|
|
Redirects every module-level DB_PATH to the per-test temp directory.
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
"""
|
2026-02-28 19:27:48 -05:00
|
|
|
tmp_swarm_db = tmp_path / "swarm.db"
|
|
|
|
|
tmp_spark_db = tmp_path / "spark.db"
|
|
|
|
|
tmp_self_coding_db = tmp_path / "self_coding.db"
|
|
|
|
|
|
|
|
|
|
_swarm_db_modules = [
|
|
|
|
|
"timmy.memory.vector_store",
|
|
|
|
|
"infrastructure.models.registry",
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
]
|
2026-02-28 19:27:48 -05:00
|
|
|
_spark_db_modules = [
|
|
|
|
|
"spark.memory",
|
|
|
|
|
"spark.eidos",
|
|
|
|
|
]
|
2026-03-02 13:17:38 -05:00
|
|
|
_self_coding_db_modules = []
|
2026-02-28 19:27:48 -05:00
|
|
|
|
|
|
|
|
originals = {}
|
|
|
|
|
for mod_name in _swarm_db_modules:
|
|
|
|
|
try:
|
|
|
|
|
mod = __import__(mod_name, fromlist=["DB_PATH"])
|
|
|
|
|
attr = "DB_PATH"
|
|
|
|
|
originals[(mod_name, attr)] = getattr(mod, attr)
|
|
|
|
|
setattr(mod, attr, tmp_swarm_db)
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
for mod_name in _spark_db_modules:
|
|
|
|
|
try:
|
|
|
|
|
mod = __import__(mod_name, fromlist=["DB_PATH"])
|
|
|
|
|
originals[(mod_name, "DB_PATH")] = getattr(mod, "DB_PATH")
|
|
|
|
|
setattr(mod, "DB_PATH", tmp_spark_db)
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
for mod_name in _self_coding_db_modules:
|
|
|
|
|
try:
|
|
|
|
|
mod = __import__(mod_name, fromlist=["DEFAULT_DB_PATH"])
|
|
|
|
|
originals[(mod_name, "DEFAULT_DB_PATH")] = getattr(mod, "DEFAULT_DB_PATH")
|
|
|
|
|
setattr(mod, "DEFAULT_DB_PATH", tmp_self_coding_db)
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
yield
|
2026-02-28 19:27:48 -05:00
|
|
|
|
|
|
|
|
for (mod_name, attr), original in originals.items():
|
|
|
|
|
try:
|
|
|
|
|
mod = __import__(mod_name, fromlist=[attr])
|
|
|
|
|
setattr(mod, attr, original)
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
|
|
|
def cleanup_event_loops():
|
|
|
|
|
"""Clean up any leftover event loops after each test."""
|
|
|
|
|
import asyncio
|
|
|
|
|
import warnings
|
|
|
|
|
yield
|
|
|
|
|
try:
|
|
|
|
|
try:
|
|
|
|
|
loop = asyncio.get_running_loop()
|
|
|
|
|
return
|
|
|
|
|
except RuntimeError:
|
|
|
|
|
pass
|
|
|
|
|
with warnings.catch_warnings():
|
|
|
|
|
warnings.simplefilter("ignore", DeprecationWarning)
|
|
|
|
|
loop = asyncio.get_event_loop_policy().get_event_loop()
|
|
|
|
|
if loop and not loop.is_closed():
|
|
|
|
|
loop.close()
|
|
|
|
|
except RuntimeError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
2026-02-19 19:05:01 +00:00
|
|
|
@pytest.fixture
|
|
|
|
|
def client():
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
"""FastAPI test client with fresh app instance."""
|
2026-03-05 18:07:59 -05:00
|
|
|
from fastapi.testclient import TestClient
|
2026-02-19 19:05:01 +00:00
|
|
|
from dashboard.app import app
|
|
|
|
|
with TestClient(app) as c:
|
|
|
|
|
yield c
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def db_connection():
|
2026-03-02 09:58:07 -05:00
|
|
|
"""Provide a fresh in-memory SQLite connection for tests."""
|
feat: swarm E2E, MCP tools, timmy-serve L402, tests, notifications
Major Features:
- Auto-spawn persona agents (Echo, Forge, Seer) on app startup
- WebSocket broadcasts for real-time swarm UI updates
- MCP tool integration: web search, file I/O, shell, Python execution
- New /tools dashboard page showing agent capabilities
- Real timmy-serve start with L402 payment gating middleware
- Browser push notifications for briefings and task events
Tests:
- test_docker_agent.py: 9 tests for Docker agent runner
- test_swarm_integration_full.py: 18 E2E lifecycle tests
- Fixed all pytest warnings (436 tests, 0 warnings)
Improvements:
- Fixed coroutine warnings in coordinator broadcasts
- Fixed ResourceWarning for unclosed process pipes
- Added pytest-asyncio config to pyproject.toml
- Test isolation with proper event loop cleanup
2026-02-22 19:01:04 -05:00
|
|
|
conn = sqlite3.connect(":memory:")
|
|
|
|
|
conn.row_factory = sqlite3.Row
|
|
|
|
|
conn.executescript("""
|
|
|
|
|
CREATE TABLE IF NOT EXISTS agents (
|
|
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
|
status TEXT NOT NULL DEFAULT 'idle',
|
|
|
|
|
capabilities TEXT DEFAULT '',
|
|
|
|
|
registered_at TEXT NOT NULL,
|
|
|
|
|
last_seen TEXT NOT NULL
|
|
|
|
|
);
|
|
|
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
|
description TEXT NOT NULL,
|
|
|
|
|
status TEXT NOT NULL DEFAULT 'pending',
|
|
|
|
|
assigned_agent TEXT,
|
|
|
|
|
result TEXT,
|
|
|
|
|
created_at TEXT NOT NULL,
|
|
|
|
|
completed_at TEXT
|
|
|
|
|
);
|
|
|
|
|
""")
|
|
|
|
|
conn.commit()
|
|
|
|
|
yield conn
|
|
|
|
|
conn.close()
|
2026-02-28 11:07:19 -05:00
|
|
|
|
|
|
|
|
|
2026-02-28 16:11:58 -05:00
|
|
|
|
|
|
|
|
|
2026-02-28 11:07:19 -05:00
|
|
|
@pytest.fixture
|
|
|
|
|
def mock_ollama_client():
|
|
|
|
|
"""Provide a mock Ollama client for unit tests."""
|
|
|
|
|
client = MagicMock()
|
|
|
|
|
client.generate = MagicMock(return_value={"response": "Test response"})
|
|
|
|
|
client.chat = MagicMock(return_value={"message": {"content": "Test chat response"}})
|
|
|
|
|
client.list = MagicMock(return_value={"models": [{"name": "llama3.2"}]})
|
|
|
|
|
return client
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def mock_timmy_agent():
|
|
|
|
|
"""Provide a mock Timmy agent for testing."""
|
|
|
|
|
agent = MagicMock()
|
|
|
|
|
agent.name = "Timmy"
|
|
|
|
|
agent.run = MagicMock(return_value="Test response from Timmy")
|
|
|
|
|
agent.chat = MagicMock(return_value="Test chat response")
|
|
|
|
|
return agent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def mock_memory_system():
|
|
|
|
|
"""Provide a mock memory system."""
|
|
|
|
|
memory = MagicMock()
|
|
|
|
|
memory.get_system_context = MagicMock(return_value="Test memory context")
|
|
|
|
|
memory.add_memory = MagicMock()
|
|
|
|
|
memory.search = MagicMock(return_value=[])
|
|
|
|
|
return memory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def mock_event_log():
|
|
|
|
|
"""Provide a mock event logger."""
|
|
|
|
|
logger = MagicMock()
|
|
|
|
|
logger.log_event = MagicMock()
|
|
|
|
|
logger.get_events = MagicMock(return_value=[])
|
|
|
|
|
return logger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def mock_ws_manager():
|
|
|
|
|
"""Provide a mock WebSocket manager."""
|
|
|
|
|
manager = MagicMock()
|
|
|
|
|
manager.broadcast = MagicMock()
|
|
|
|
|
manager.broadcast_json = MagicMock()
|
|
|
|
|
manager.send = MagicMock()
|
|
|
|
|
return manager
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def mock_settings():
|
|
|
|
|
"""Provide mock settings."""
|
|
|
|
|
settings = MagicMock()
|
|
|
|
|
settings.ollama_url = "http://localhost:11434"
|
|
|
|
|
settings.ollama_model = "llama3.2"
|
|
|
|
|
settings.thinking_enabled = True
|
|
|
|
|
settings.thinking_interval_seconds = 300
|
|
|
|
|
settings.error_log_enabled = False
|
|
|
|
|
settings.repo_root = str(Path(__file__).parent.parent)
|
|
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def sample_interview_data():
|
|
|
|
|
"""Provide sample interview data for testing."""
|
|
|
|
|
return {
|
|
|
|
|
"questions": [
|
|
|
|
|
{
|
|
|
|
|
"category": "Identity",
|
|
|
|
|
"question": "Who are you?",
|
|
|
|
|
"expected_keywords": ["Timmy", "agent"],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"category": "Capabilities",
|
|
|
|
|
"question": "What can you do?",
|
2026-03-02 09:58:07 -05:00
|
|
|
"expected_keywords": ["agent", "brain"],
|
2026-02-28 11:07:19 -05:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"expected_response_format": "string",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def sample_task_data():
|
|
|
|
|
"""Provide sample task data for testing."""
|
|
|
|
|
return {
|
|
|
|
|
"id": "task-1",
|
|
|
|
|
"title": "Test Task",
|
|
|
|
|
"description": "This is a test task",
|
|
|
|
|
"assigned_to": "timmy",
|
|
|
|
|
"status": "pending",
|
|
|
|
|
"priority": "normal",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
def sample_agent_data():
|
|
|
|
|
"""Provide sample agent data for testing."""
|
|
|
|
|
return {
|
|
|
|
|
"id": "agent-1",
|
|
|
|
|
"name": "Test Agent",
|
|
|
|
|
"capabilities": ["chat", "reasoning"],
|
|
|
|
|
"status": "active",
|
|
|
|
|
}
|