109 lines
6.0 KiB
Python
109 lines
6.0 KiB
Python
# agents/tests/unit/test_agent.py
|
|
# OSVauco-NMTMD-GCOS — Unit tests for ADK orchestrator agent
|
|
# Run: pytest agents/tests/unit/ -v
|
|
|
|
import os
|
|
import sys
|
|
import pytest
|
|
|
|
# ── path setup ───────────────────────────────────────────────
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "core-logic"))
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 1: Python version
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_python_version():
|
|
"""Require Python 3.11 or higher."""
|
|
assert sys.version_info >= (3, 11), (
|
|
f"Python 3.11+ required, got {sys.version_info.major}.{sys.version_info.minor}"
|
|
)
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 2: ADK import
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_adk_import():
|
|
"""google-adk must be importable."""
|
|
try:
|
|
import google.adk # noqa: F401
|
|
except ImportError as e:
|
|
pytest.fail(f"google-adk not importable: {e}")
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 3: Agent import
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_agent_import():
|
|
"""agents/core-logic/agent.py must export root_agent."""
|
|
try:
|
|
from agent import root_agent # noqa: F401
|
|
except ImportError as e:
|
|
pytest.skip(f"Skipping — dependencies not installed: {e}")
|
|
except Exception as e:
|
|
pytest.fail(f"Unexpected error importing root_agent: {e}")
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 4: Required env vars present
|
|
# ─────────────────────────────────────────────────────────────
|
|
REQUIRED_ENV_VARS = [
|
|
"PROJECT_ID",
|
|
"REGION",
|
|
"ORCHESTRATOR_MODEL",
|
|
"SUBAGENT_MODEL",
|
|
]
|
|
|
|
@pytest.mark.parametrize("var", REQUIRED_ENV_VARS)
|
|
def test_required_env_var(var):
|
|
"""All required env vars must be set (non-empty)."""
|
|
val = os.environ.get(var, "")
|
|
assert val, f"Required env var '{var}' is not set or empty"
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 5: RAG env vars present if RAG enabled
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_rag_env_vars():
|
|
"""If RAG_CORPUS_NAME is set, related vars must also be set."""
|
|
corpus = os.environ.get("RAG_CORPUS_NAME", "")
|
|
if not corpus:
|
|
pytest.skip("RAG_CORPUS_NAME not set — skipping RAG env var check")
|
|
assert os.environ.get("RAG_CORPUS_DISPLAY_NAME"), "RAG_CORPUS_DISPLAY_NAME must be set"
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 6: Memory Bank env vars present if enabled
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_memory_bank_env_vars():
|
|
"""If MEMORY_BANK_INSTANCE is set, related vars must also be set."""
|
|
mb = os.environ.get("MEMORY_BANK_INSTANCE", "")
|
|
if not mb:
|
|
pytest.skip("MEMORY_BANK_INSTANCE not set — skipping Memory Bank env var check")
|
|
assert os.environ.get("MEMORY_INSTANCE_DISPLAY_NAME"), "MEMORY_INSTANCE_DISPLAY_NAME must be set"
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 7: Safety callback smoke test
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_safety_callback_import():
|
|
"""before_model_callback must be importable from agent module."""
|
|
try:
|
|
from agent import before_model_callback # noqa: F401
|
|
except ImportError as e:
|
|
pytest.skip(f"Skipping — dependencies not installed: {e}")
|
|
except Exception as e:
|
|
pytest.fail(f"Unexpected error importing before_model_callback: {e}")
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
# Test 8: cloudbuild.yaml exists
|
|
# ─────────────────────────────────────────────────────────────
|
|
def test_cloudbuild_yaml_exists():
|
|
"""cloudbuild.yaml must exist at repo root."""
|
|
repo_root = os.path.abspath(
|
|
os.path.join(os.path.dirname(__file__), "..", "..", "..")
|
|
)
|
|
cb_path = os.path.join(repo_root, "cloudbuild.yaml")
|
|
assert os.path.isfile(cb_path), f"cloudbuild.yaml not found at {cb_path}"
|