102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
import os
|
|
import json
|
|
from datetime import datetime, timedelta, timezone
|
|
from importlib.util import module_from_spec, spec_from_file_location
|
|
from pathlib import Path
|
|
import sys
|
|
from unittest.mock import patch
|
|
|
|
MODULE_PATH = Path(__file__).resolve().parents[2] / "tools" / "managed_tool_gateway.py"
|
|
MODULE_SPEC = spec_from_file_location("managed_tool_gateway_test_module", MODULE_PATH)
|
|
assert MODULE_SPEC and MODULE_SPEC.loader
|
|
managed_tool_gateway = module_from_spec(MODULE_SPEC)
|
|
sys.modules[MODULE_SPEC.name] = managed_tool_gateway
|
|
MODULE_SPEC.loader.exec_module(managed_tool_gateway)
|
|
resolve_managed_tool_gateway = managed_tool_gateway.resolve_managed_tool_gateway
|
|
|
|
|
|
def test_resolve_managed_tool_gateway_derives_vendor_origin_from_shared_domain():
|
|
with patch.dict(
|
|
os.environ,
|
|
{
|
|
"HERMES_ENABLE_NOUS_MANAGED_TOOLS": "1",
|
|
"TOOL_GATEWAY_DOMAIN": "nousresearch.com",
|
|
},
|
|
clear=False,
|
|
):
|
|
result = resolve_managed_tool_gateway(
|
|
"firecrawl",
|
|
token_reader=lambda: "nous-token",
|
|
)
|
|
|
|
assert result is not None
|
|
assert result.gateway_origin == "https://firecrawl-gateway.nousresearch.com"
|
|
assert result.nous_user_token == "nous-token"
|
|
assert result.managed_mode is True
|
|
|
|
|
|
def test_resolve_managed_tool_gateway_uses_vendor_specific_override():
|
|
with patch.dict(
|
|
os.environ,
|
|
{
|
|
"HERMES_ENABLE_NOUS_MANAGED_TOOLS": "1",
|
|
"BROWSERBASE_GATEWAY_URL": "http://browserbase-gateway.localhost:3009/",
|
|
},
|
|
clear=False,
|
|
):
|
|
result = resolve_managed_tool_gateway(
|
|
"browserbase",
|
|
token_reader=lambda: "nous-token",
|
|
)
|
|
|
|
assert result is not None
|
|
assert result.gateway_origin == "http://browserbase-gateway.localhost:3009"
|
|
|
|
|
|
def test_resolve_managed_tool_gateway_is_inactive_without_nous_token():
|
|
with patch.dict(
|
|
os.environ,
|
|
{
|
|
"HERMES_ENABLE_NOUS_MANAGED_TOOLS": "1",
|
|
"TOOL_GATEWAY_DOMAIN": "nousresearch.com",
|
|
},
|
|
clear=False,
|
|
):
|
|
result = resolve_managed_tool_gateway(
|
|
"firecrawl",
|
|
token_reader=lambda: None,
|
|
)
|
|
|
|
assert result is None
|
|
|
|
|
|
def test_resolve_managed_tool_gateway_is_disabled_without_feature_flag():
|
|
with patch.dict(os.environ, {"TOOL_GATEWAY_DOMAIN": "nousresearch.com"}, clear=False):
|
|
result = resolve_managed_tool_gateway(
|
|
"firecrawl",
|
|
token_reader=lambda: "nous-token",
|
|
)
|
|
|
|
assert result is None
|
|
|
|
|
|
def test_read_nous_access_token_refreshes_expiring_cached_token(tmp_path, monkeypatch):
|
|
monkeypatch.delenv("TOOL_GATEWAY_USER_TOKEN", raising=False)
|
|
monkeypatch.setenv("HERMES_HOME", str(tmp_path))
|
|
expires_at = (datetime.now(timezone.utc) + timedelta(seconds=30)).isoformat()
|
|
(tmp_path / "auth.json").write_text(json.dumps({
|
|
"providers": {
|
|
"nous": {
|
|
"access_token": "stale-token",
|
|
"refresh_token": "refresh-token",
|
|
"expires_at": expires_at,
|
|
}
|
|
}
|
|
}))
|
|
monkeypatch.setattr(
|
|
"hermes_cli.auth.resolve_nous_access_token",
|
|
lambda refresh_skew_seconds=120: "fresh-token",
|
|
)
|
|
|
|
assert managed_tool_gateway.read_nous_access_token() == "fresh-token"
|