"""Shared fixtures for the integration suite. These tests require a running langgraph-api server at `LANGGRAPH_INTEGRATION_URL` (defaults to `http://localhost:2024`). Stand it up via the docker stack in `libs/sdk-py/integration/`: cd libs/sdk-py/integration && docker compose up -d The `integration` marker is registered in `pyproject.toml` and excluded by default in pytest's `addopts`; opt in with `pytest -m integration`. """ from __future__ import annotations import os from collections.abc import AsyncIterator, Iterator import httpx import pytest BASE_URL = os.environ.get("LANGGRAPH_INTEGRATION_URL", "http://localhost:2024") ASSISTANT_ID = "agent" TOOLS_ASSISTANT_ID = "tools_agent" DEEP_AGENT_ASSISTANT_ID = "deep_agent" FACTORY_ASSISTANT_ID = "factory_agent" EXPECTED_TERMINAL_ITEMS = ["streamed", "tool", "asked", "sub"] @pytest.fixture(scope="session", autouse=True) def _require_running_api() -> None: """Skip the whole integration suite if the API isn't reachable. Autouse + session-scoped so a missing stack short-circuits before any test runs (no per-test connection timeouts piling up). """ try: resp = httpx.get(f"{BASE_URL}/ok", timeout=2.0) resp.raise_for_status() except Exception as err: pytest.skip( f"langgraph-api not reachable at {BASE_URL}: {err!r}. " f"Bring up the stack with `cd libs/sdk-py/integration && docker compose up -d`." ) @pytest.fixture async def async_threads() -> AsyncIterator[tuple[object, httpx.AsyncClient]]: """Build an async ThreadsClient. Yields `(threads, raw_httpx)` so tests can close raw.""" from langgraph_sdk._async.http import HttpClient from langgraph_sdk._async.threads import ThreadsClient raw = httpx.AsyncClient(base_url=BASE_URL, timeout=30.0) try: yield ThreadsClient(HttpClient(raw)), raw finally: await raw.aclose() @pytest.fixture def sync_threads() -> Iterator[tuple[object, httpx.Client]]: """Build a sync ThreadsClient. Yields `(threads, raw_httpx)` so tests can close raw.""" from langgraph_sdk._sync.http import SyncHttpClient from langgraph_sdk._sync.threads import SyncThreadsClient raw = httpx.Client(base_url=BASE_URL, timeout=30.0) try: yield SyncThreadsClient(SyncHttpClient(raw)), raw finally: raw.close()