"""Shared pytest fixtures and cost gates for the API Atlas smoke tests. Run: pytest -q (cheap smoke tests only) RUN_EXPENSIVE_TESTS=true pytest -q tests/openai Flags (all default false): RUN_EXPENSIVE_TESTS RUN_REALTIME_TESTS RUN_IMAGE_TESTS RUN_VIDEO_TESTS RUN_ADMIN_TESTS RUN_AUDIO_TESTS RUN_BATCH_TESTS Keys are read from .env via scripts/live.py (never printed). """ from __future__ import annotations import os import sys from pathlib import Path import pytest ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT)) from scripts import live # noqa: E402 (loads .env) FLAGS = ["RUN_EXPENSIVE_TESTS", "RUN_REALTIME_TESTS", "RUN_IMAGE_TESTS", "RUN_VIDEO_TESTS", "RUN_ADMIN_TESTS", "RUN_AUDIO_TESTS", "RUN_BATCH_TESTS"] def flag(name: str) -> bool: return os.environ.get(name, "false").strip().lower() in ("1", "true", "yes", "on") def pytest_configure(config: pytest.Config) -> None: for f in FLAGS: config.addinivalue_line("markers", f"{f.lower()}: requires {f}=true") def pytest_collection_modifyitems(config: pytest.Config, items: list[pytest.Item]) -> None: for item in items: for f in FLAGS: if item.get_closest_marker(f.lower()) and not flag(f): item.add_marker(pytest.mark.skip(reason=f"{f} is not enabled")) @pytest.fixture(scope="session") def openai(): if not os.environ.get("OPENAI_API_KEY"): pytest.skip("OPENAI_API_KEY not set") return live.openai_request @pytest.fixture(scope="session") def anthropic(): if not os.environ.get("ANTHROPIC_API_KEY"): pytest.skip("ANTHROPIC_API_KEY not set") return live.anthropic_request @pytest.fixture(scope="session") def xai(): if not os.environ.get("XAI_API_KEY"): pytest.skip("XAI_API_KEY not set") return live.xai_request @pytest.fixture(scope="session") def gemini(): if not os.environ.get("GEMINI_API_KEY"): pytest.skip("GEMINI_API_KEY not set") return live.gemini_request # Cheapest models used by default in tests (override with env for future runs) OPENAI_CHEAP_MODEL = os.environ.get("ATLAS_OPENAI_CHEAP_MODEL", "gpt-5.4-nano") OPENAI_CHEAP_CHAT_MODEL = os.environ.get("ATLAS_OPENAI_CHEAP_CHAT_MODEL", "gpt-4.1-nano") ANTHROPIC_CHEAP_MODEL = os.environ.get("ATLAS_ANTHROPIC_CHEAP_MODEL", "claude-haiku-4-5-20251001") XAI_CHEAP_MODEL = os.environ.get("ATLAS_XAI_CHEAP_MODEL", "grok-4.3") GEMINI_CHEAP_MODEL = os.environ.get("ATLAS_GEMINI_CHEAP_MODEL", "gemini-3.5-flash-lite") @pytest.fixture(scope="session") def models() -> dict[str, str]: return {"openai": OPENAI_CHEAP_MODEL, "openai_chat": OPENAI_CHEAP_CHAT_MODEL, "anthropic": ANTHROPIC_CHEAP_MODEL, "xai": XAI_CHEAP_MODEL, "gemini": GEMINI_CHEAP_MODEL}