"""Shared setup for the live integration tests. They run against real services, configured by nisse-test.yaml beside this file: an ordinary agent config aimed at test resources, committed to the repository. Its secrets are ${…} references, supplied by CI as environment variables and locally by .env at the repository root. A missing secret is a failure, not a skip. A half-configured environment must not pass quietly as a skip: that is how a broken CI credential hides. """ from pathlib import Path import pytest from nisse_core.envfile import load_env_file from nisse_core.gitea import GiteaClient from nisse_core.models.llm import AnthropicPassthroughClient, LiteLLMClient from nisse_dev.config import AgentConfig REPO = Path(__file__).resolve().parents[2] TEST_CONFIG = Path(__file__).parent / "nisse-test.yaml" # The secrets nisse-test.yaml refers to, for local runs. CI sets them as real # environment variables, which win over the file. load_env_file(REPO / ".env") @pytest.fixture(scope="session") def live_config() -> AgentConfig: return AgentConfig.from_file(TEST_CONFIG) @pytest.fixture def live_model(live_config: AgentConfig) -> str: """The model the live tests drive and delegate with.""" return live_config.roles.driver @pytest.fixture def litellm(live_config: AgentConfig) -> LiteLLMClient: return LiteLLMClient( live_config.llm_base_url, live_config.llm_token, max_tokens=live_config.max_output_tokens, ) @pytest.fixture def passthrough(live_config: AgentConfig) -> AnthropicPassthroughClient: return AnthropicPassthroughClient( live_config.llm_base_url, live_config.llm_token, max_tokens=live_config.max_output_tokens, ) @pytest.fixture def gitea(live_config: AgentConfig) -> GiteaClient: client = GiteaClient(live_config.gitea_url, live_config.gitea_token) yield client client.close()