test(cron): cover provider "custom" → providers.custom resolution

Add execution-time coverage that bare `provider="custom"` resolves a literal
providers.custom endpoint (and still falls through when none exists), plus
creation-time coverage that `_resolve_model_override` keeps a resolvable
"custom" and only pins the main provider when it is unresolvable.
This commit is contained in:
xxxigm
2026-06-10 14:39:03 -07:00
committed by Teknium
parent acd4f34e65
commit f7a6d6a6a1
2 changed files with 121 additions and 0 deletions
+51
View File
@@ -452,3 +452,54 @@ class TestUnifiedCronjobTool:
assert updated["success"] is True
stored = get_job(created["job_id"])
assert stored["deliver"] == "telegram"
# =========================================================================
# Per-job model/provider override resolution
# =========================================================================
from tools.cronjob_tools import _resolve_model_override # noqa: E402
class TestResolveModelOverride:
"""`_resolve_model_override` must not silently hijack a job that meant to
use a configured custom endpoint (e.g. ``providers.custom`` → cliproxy).
Regression for cron jobs with ``provider: "custom"`` falling back to codex.
"""
def test_keeps_bare_custom_when_a_named_entry_exists(self, monkeypatch):
import hermes_cli.runtime_provider as rp_mod
monkeypatch.setattr(rp_mod, "has_named_custom_provider", lambda name: True)
provider, model = _resolve_model_override(
{"provider": "custom", "model": "gpt-5.4"}
)
assert provider == "custom"
assert model == "gpt-5.4"
def test_pins_main_provider_when_bare_custom_unresolvable(self, monkeypatch):
import hermes_cli.config as cfg_mod
import hermes_cli.runtime_provider as rp_mod
monkeypatch.setattr(rp_mod, "has_named_custom_provider", lambda name: False)
monkeypatch.setattr(
cfg_mod, "load_config", lambda: {"model": {"provider": "openai-codex"}}
)
provider, model = _resolve_model_override(
{"provider": "custom", "model": "gpt-5.4"}
)
# No matching custom entry → fall back to pinning the main provider.
assert provider == "openai-codex"
assert model == "gpt-5.4"
def test_keeps_explicit_custom_name_unchanged(self, monkeypatch):
import hermes_cli.runtime_provider as rp_mod
# Even if the resolver claims no entry, the canonical "custom:<name>"
# form is never stripped or pinned.
monkeypatch.setattr(rp_mod, "has_named_custom_provider", lambda name: False)
provider, model = _resolve_model_override(
{"provider": "custom:cliproxy", "model": "gpt-5.4"}
)
assert provider == "custom:cliproxy"
assert model == "gpt-5.4"