From 4f37f0e8375db2589d16698bd97fe304ff6f016a Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 14 Aug 2026 03:18:47 -0700 Subject: [PATCH] fix(tests): mock get_hermes_home with Path, not str, across tui_gateway tests tests/tui_gateway/test_slash_worker_profile_home.py broke main CI after 56a41715dc added `from hermes_state import _BARE_BILLING_PROVIDERS` to tui_gateway/server.py: importing hermes_state evaluates `DEFAULT_DB_PATH = get_hermes_home() / "state.db"` at module level, and the test's sys.modules mock returned a plain str -> TypeError: unsupported operand type(s) for /: 'str' and 'str'. The real get_hermes_home() returns a Path; a str-returning mock is a latent landmine in every test that stubs hermes_constants this way. Fix the class: all 8 tui_gateway test files now mock it with Path("/tmp/..."). Validation: the failing test reproduced at origin/main tip (56a41715dc) in a clean worktree; with this change all 82 tests across the touched files pass. --- tests/tui_gateway/test_compaction_status.py | 3 ++- tests/tui_gateway/test_inline_rpc_gil_starvation.py | 3 ++- tests/tui_gateway/test_moa_reference_emit.py | 3 ++- tests/tui_gateway/test_protocol.py | 3 ++- tests/tui_gateway/test_review_summary_callback.py | 3 ++- tests/tui_gateway/test_slash_worker_profile_home.py | 3 ++- tests/tui_gateway/test_subagent_child_mirror.py | 3 ++- tests/tui_gateway/test_subprocess_encoding.py | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/tests/tui_gateway/test_compaction_status.py b/tests/tui_gateway/test_compaction_status.py index a676f70d4f04c..3c33974d444bc 100644 --- a/tests/tui_gateway/test_compaction_status.py +++ b/tests/tui_gateway/test_compaction_status.py @@ -7,6 +7,7 @@ silently reset mid-turn. """ from __future__ import annotations +from pathlib import Path import importlib @@ -23,7 +24,7 @@ def server(): "sys.modules", { "hermes_constants": MagicMock( - get_hermes_home=MagicMock(return_value="/tmp/hermes_test_compaction") + get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test_compaction")) ), "hermes_cli.env_loader": MagicMock(), "hermes_cli.banner": MagicMock(), diff --git a/tests/tui_gateway/test_inline_rpc_gil_starvation.py b/tests/tui_gateway/test_inline_rpc_gil_starvation.py index e6cfa141dfe3e..d903734b5b2a1 100644 --- a/tests/tui_gateway/test_inline_rpc_gil_starvation.py +++ b/tests/tui_gateway/test_inline_rpc_gil_starvation.py @@ -20,6 +20,7 @@ import sys import threading import time from unittest.mock import MagicMock, patch +from pathlib import Path import pytest @@ -38,7 +39,7 @@ def server(): # the whole test would poison modules first imported inside test bodies # (see tests/tui_gateway/test_protocol.py for the full rationale). with patch.dict("sys.modules", { - "hermes_constants": MagicMock(get_hermes_home=MagicMock(return_value="/tmp/hermes_test")), + "hermes_constants": MagicMock(get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test"))), "hermes_cli.env_loader": MagicMock(), "hermes_cli.banner": MagicMock(), "hermes_state": MagicMock(), diff --git a/tests/tui_gateway/test_moa_reference_emit.py b/tests/tui_gateway/test_moa_reference_emit.py index ee19b3f3b149f..ecf7b35a24732 100644 --- a/tests/tui_gateway/test_moa_reference_emit.py +++ b/tests/tui_gateway/test_moa_reference_emit.py @@ -8,6 +8,7 @@ thinking block tagged with its source model. """ from __future__ import annotations +from pathlib import Path from unittest.mock import MagicMock, patch @@ -22,7 +23,7 @@ def server(): "sys.modules", { "hermes_constants": MagicMock( - get_hermes_home=MagicMock(return_value="/tmp/hermes_test_moa_emit") + get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test_moa_emit")) ), "hermes_cli.env_loader": MagicMock(), "hermes_cli.banner": MagicMock(), diff --git a/tests/tui_gateway/test_protocol.py b/tests/tui_gateway/test_protocol.py index 08934c7201ad4..b50fdcdb5a5a5 100644 --- a/tests/tui_gateway/test_protocol.py +++ b/tests/tui_gateway/test_protocol.py @@ -7,6 +7,7 @@ import threading import time import types from unittest.mock import MagicMock, patch +from pathlib import Path import pytest @@ -28,7 +29,7 @@ def server(): # (a fixed shared path) forever, leaking active-session registry entries # across every later test in the process. Scope the patch to the import. with patch.dict("sys.modules", { - "hermes_constants": MagicMock(get_hermes_home=MagicMock(return_value="/tmp/hermes_test")), + "hermes_constants": MagicMock(get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test"))), "hermes_cli.env_loader": MagicMock(), "hermes_cli.banner": MagicMock(), "hermes_state": MagicMock(), diff --git a/tests/tui_gateway/test_review_summary_callback.py b/tests/tui_gateway/test_review_summary_callback.py index 0f4130a604654..1e7083ec2c65f 100644 --- a/tests/tui_gateway/test_review_summary_callback.py +++ b/tests/tui_gateway/test_review_summary_callback.py @@ -10,6 +10,7 @@ transcript line. """ from __future__ import annotations +from pathlib import Path from unittest.mock import MagicMock, patch @@ -24,7 +25,7 @@ def server(): "sys.modules", { "hermes_constants": MagicMock( - get_hermes_home=MagicMock(return_value="/tmp/hermes_test_review_summary") + get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test_review_summary")) ), "hermes_cli.env_loader": MagicMock(), "hermes_cli.banner": MagicMock(), diff --git a/tests/tui_gateway/test_slash_worker_profile_home.py b/tests/tui_gateway/test_slash_worker_profile_home.py index e8589c7861959..12898be4ab821 100644 --- a/tests/tui_gateway/test_slash_worker_profile_home.py +++ b/tests/tui_gateway/test_slash_worker_profile_home.py @@ -4,6 +4,7 @@ import os import subprocess import sys from unittest.mock import MagicMock, patch, call +from pathlib import Path import pytest @@ -11,7 +12,7 @@ import pytest def test_slash_worker_accepts_profile_home(): """_SlashWorker.__init__ accepts profile_home parameter.""" with patch.dict("sys.modules", { - "hermes_constants": MagicMock(get_hermes_home=MagicMock(return_value="/tmp/hermes_test")), + "hermes_constants": MagicMock(get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test"))), }): with patch("subprocess.Popen") as mock_popen: mock_popen.return_value.stdout = MagicMock() diff --git a/tests/tui_gateway/test_subagent_child_mirror.py b/tests/tui_gateway/test_subagent_child_mirror.py index 5a94dc8ed0b18..79ecc439a5dfa 100644 --- a/tests/tui_gateway/test_subagent_child_mirror.py +++ b/tests/tui_gateway/test_subagent_child_mirror.py @@ -9,6 +9,7 @@ shows a real midstream turn instead of sitting silent until persistence. """ from __future__ import annotations +from pathlib import Path from unittest.mock import MagicMock, patch @@ -23,7 +24,7 @@ def server(): "sys.modules", { "hermes_constants": MagicMock( - get_hermes_home=MagicMock(return_value="/tmp/hermes_test_child_mirror") + get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test_child_mirror")) ), "hermes_cli.env_loader": MagicMock(), "hermes_cli.banner": MagicMock(), diff --git a/tests/tui_gateway/test_subprocess_encoding.py b/tests/tui_gateway/test_subprocess_encoding.py index 91cabb187d628..8ab03adb3c8da 100644 --- a/tests/tui_gateway/test_subprocess_encoding.py +++ b/tests/tui_gateway/test_subprocess_encoding.py @@ -13,6 +13,7 @@ the crash class cannot silently regress. """ from __future__ import annotations +from pathlib import Path import subprocess from unittest.mock import MagicMock, patch @@ -42,7 +43,7 @@ def test_slash_worker_popen_uses_utf8_replace(): """ with patch.dict("sys.modules", { "hermes_constants": MagicMock( - get_hermes_home=MagicMock(return_value="/tmp/hermes_test") + get_hermes_home=MagicMock(return_value=Path("/tmp/hermes_test")) ), }): with patch("subprocess.Popen") as mock_popen: