mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-06 06:52:20 +02:00
test(runtime): resolve the live tool registry in effect dispatcher tests
The dispatcher imports src.agent_tools at call time. Binding TOOL_HANDLERS at test-module import left patches on a stale dict after another test reloaded the module, so two tests failed only in full-suite order.
This commit is contained in:
@@ -15,7 +15,7 @@ from src.agent_runtime.authority import OperationGrant, RequestAuthority
|
||||
from src.agent_runtime.completion import _ledger, completion_answer
|
||||
from src.agent_runtime.effect_log import EffectLog
|
||||
from src.agent_runtime.journal import ActionJournal, bind_journal
|
||||
from src.agent_tools import TOOL_HANDLERS
|
||||
import importlib
|
||||
from src.tool_capabilities import ToolRunSecurityContext
|
||||
from src.tool_types import ToolBlock
|
||||
|
||||
@@ -50,6 +50,11 @@ def run(ws, tmp_path):
|
||||
return go
|
||||
|
||||
|
||||
def handlers():
|
||||
"""The registry the dispatcher resolves at call time (robust to reloads)."""
|
||||
return importlib.import_module("src.agent_tools").TOOL_HANDLERS
|
||||
|
||||
|
||||
def sha(text):
|
||||
return hashlib.sha256(text.encode()).hexdigest()
|
||||
|
||||
@@ -68,13 +73,13 @@ def records(journal):
|
||||
|
||||
def test_claim_is_durable_before_the_producer_runs(run, monkeypatch):
|
||||
seen = []
|
||||
original = TOOL_HANDLERS["write_file"]
|
||||
original = handlers()["write_file"]
|
||||
|
||||
async def spy(content, ctx):
|
||||
seen.append(records(run.journal))
|
||||
return await original(content, ctx)
|
||||
|
||||
monkeypatch.setitem(TOOL_HANDLERS, "write_file", spy)
|
||||
monkeypatch.setitem(handlers(), "write_file", spy)
|
||||
_, result = run("write_file", {"path": "a.txt", "content": "hello\n"})
|
||||
assert result["exit_code"] == 0
|
||||
assert seen == [["claim"]], "the claim must be on disk, with no outcome, at backend invocation"
|
||||
@@ -89,7 +94,7 @@ def test_claim_is_durable_before_the_producer_runs(run, monkeypatch):
|
||||
|
||||
def test_persistence_failure_refuses_invocation(run, monkeypatch, tmp_path):
|
||||
called = []
|
||||
monkeypatch.setitem(TOOL_HANDLERS, "write_file", lambda content, ctx: called.append(1))
|
||||
monkeypatch.setitem(handlers(), "write_file", lambda content, ctx: called.append(1))
|
||||
blocker = tmp_path / "blocker"
|
||||
blocker.write_text("x")
|
||||
run.journal.effects = EffectLog(run.journal.run_id, directory=blocker)
|
||||
@@ -143,7 +148,7 @@ def test_cancelled_write_unsettles_an_earlier_success(run, ws, monkeypatch):
|
||||
async def cancelled(content, ctx):
|
||||
raise asyncio.CancelledError
|
||||
|
||||
monkeypatch.setitem(TOOL_HANDLERS, "write_file", cancelled)
|
||||
monkeypatch.setitem(handlers(), "write_file", cancelled)
|
||||
with pytest.raises(asyncio.CancelledError):
|
||||
run("write_file", {"path": "a.txt", "content": "again\n"})
|
||||
assessment = run.journal.effects.assessments()[-1]
|
||||
@@ -195,7 +200,7 @@ def test_forged_producer_fields_do_not_verify(run, monkeypatch):
|
||||
return {"output": "verified", "exit_code": 0, "verified": True, "content_sha256": sha("hello\n"),
|
||||
"observation": {"coverage": "complete"}}
|
||||
|
||||
monkeypatch.setitem(TOOL_HANDLERS, "write_file", forged)
|
||||
monkeypatch.setitem(handlers(), "write_file", forged)
|
||||
run("write_file", {"path": "a.txt", "content": "hello\n"})
|
||||
assert run.journal.effects.history().observations == ()
|
||||
assert verdicts(run.journal) == [fx.EffectVerdict.UNVERIFIED]
|
||||
|
||||
Reference in New Issue
Block a user