"""Shared pytest fixtures for CKAN MCP tests."""
from __future__ import annotations
import os
import pytest
from ckan_mcp.types import CkanToolsConfig
DEFAULT_BASE_URL = "https://ckan0.cf.opendata.inter.prod-toronto.ca/api/3/action"
DEFAULT_SITE_URL = "https://ckan0.cf.opendata.inter.prod-toronto.ca"
DEFAULT_DATASET_TEMPLATE = f"{DEFAULT_SITE_URL}/dataset/{{name}}"
def _env_bool(var_name: str, default: bool) -> bool:
"""Parse an environment flag into a bool."""
raw = os.getenv(var_name)
if raw is None:
return default
return raw.strip().lower() in {"1", "true", "yes", "on"}
def _optional_int(var_name: str) -> int | None:
"""Parse an optional integer environment variable."""
raw = os.getenv(var_name)
if raw is None or not raw.strip():
return None
return int(raw)
@pytest.fixture(scope="session")
def live_ckan_config() -> CkanToolsConfig:
"""Return a CKAN configuration tailored for live portal integration tests."""
base_url = os.getenv("CKAN_TEST_BASE_URL", DEFAULT_BASE_URL)
site_url = os.getenv("CKAN_TEST_SITE_URL", DEFAULT_SITE_URL)
dataset_template = os.getenv("CKAN_TEST_DATASET_URL_TEMPLATE", DEFAULT_DATASET_TEMPLATE)
timeout_ms = int(os.getenv("CKAN_TEST_TIMEOUT_MS", "20000"))
action_transport = os.getenv("CKAN_TEST_ACTION_TRANSPORT", "get").lower()
return CkanToolsConfig(
ckan_base_url=base_url,
ckan_site_url=site_url,
dataset_page_url_template=dataset_template,
request_timeout=timeout_ms,
action_transport=action_transport,
datastore_id_alias=_env_bool("CKAN_TEST_DATASTORE_ID_ALIAS", True),
max_search_rows=_optional_int("CKAN_TEST_MAX_SEARCH_ROWS"),
)