From 41d239780ca7a7c56fdab9e62a79a69bdfed801f Mon Sep 17 00:00:00 2001 From: Clayton Brown Date: Tue, 21 Apr 2026 16:48:15 +1000 Subject: [PATCH] add conftest.py with fixtures to prevent CI hangs --- tests/conftest.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/conftest.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..67554305 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,67 @@ +"""Shared pytest fixtures that prevent CI hangs when API keys are absent.""" + +import os +from unittest.mock import MagicMock, patch + +import pytest + +# --------------------------------------------------------------------------- +# Custom markers +# --------------------------------------------------------------------------- + + +def pytest_configure(config): + for marker in ("unit", "integration", "smoke"): + config.addinivalue_line("markers", f"{marker}: {marker}-level tests") + + +# --------------------------------------------------------------------------- +# Auto-use: placeholder API keys so LLM client init never blocks +# --------------------------------------------------------------------------- + +_API_KEY_ENV_VARS = [ + "OPENAI", + "GOOGLE", + "ANTHROPIC", + "XAI", + "ALPHA_VANTAGE", +] + + +@pytest.fixture(autouse=True) +def _dummy_api_keys(monkeypatch): + for provider in _API_KEY_ENV_VARS: + env_var = f"{provider}_API_KEY" + monkeypatch.setenv(env_var, os.environ.get(env_var, "placeholder")) + + +# --------------------------------------------------------------------------- +# Auto-use: safe DEFAULT_CONFIG override (no real API calls) +# --------------------------------------------------------------------------- + +_SAFE_CONFIG = { + "llm_provider": "openai", + "deep_think_llm": "gpt-5.4-mini", + "quick_think_llm": "gpt-5.4-mini", + "max_debate_rounds": 1, + "max_risk_discuss_rounds": 1, +} + + +@pytest.fixture(autouse=True) +def _safe_default_config(): + with patch.dict("tradingagents.default_config.DEFAULT_CONFIG", _SAFE_CONFIG): + yield + + +# --------------------------------------------------------------------------- +# Reusable mock LLM client +# --------------------------------------------------------------------------- + + +@pytest.fixture() +def mock_llm_client(): + client = MagicMock() + client.get_llm.return_value = MagicMock() + with patch("tradingagents.llm_clients.create_llm_client", return_value=client): + yield client