From c634c07bcc6ec245daefbd879a85e9e72ef6d196 Mon Sep 17 00:00:00 2001 From: yoniebans Date: Wed, 20 May 2026 11:08:06 +0200 Subject: [PATCH] test(gateway): pin DEFAULT_DB_PATH in fixtures to prevent real state.db writes Fixtures that instantiate SessionStore() trigger SessionDB() with no args, which resolves to ~/.hermes/state.db via the DEFAULT_DB_PATH module constant (snapshot of get_hermes_home() at hermes_state import time). The autouse _hermetic_environment fixture in tests/conftest.py monkeypatches HERMES_HOME env, but DEFAULT_DB_PATH is already cached by then. Per-test monkeypatch.setattr(hermes_state, 'DEFAULT_DB_PATH', tmp_path/'state.db') forces the DB into tmp_path so the tests can't leak into the real profile. Verified by counting u1-prefixed sessions in real state.db before/after: delta=0. --- .../platforms/test_yuanbao_recall_db_only.py | 11 +++++++++-- tests/gateway/test_load_transcript_db_only.py | 19 ++++++++++++------- tests/gateway/test_session.py | 12 +++++++++--- .../gateway/test_session_dm_thread_seeding.py | 12 ++++++++++-- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/tests/gateway/platforms/test_yuanbao_recall_db_only.py b/tests/gateway/platforms/test_yuanbao_recall_db_only.py index 6186df6787..da697f0193 100644 --- a/tests/gateway/platforms/test_yuanbao_recall_db_only.py +++ b/tests/gateway/platforms/test_yuanbao_recall_db_only.py @@ -3,8 +3,15 @@ from gateway.session import SessionStore from gateway.config import GatewayConfig -def test_recall_falls_through_to_content_match_without_message_id(tmp_path): - """When transcript has no message_id field, A2 content-match still works.""" +def test_recall_falls_through_to_content_match_without_message_id(tmp_path, monkeypatch): + """When transcript has no message_id field, A2 content-match still works. + + Pin DEFAULT_DB_PATH to tmp_path so SessionDB() can't write to the real + ~/.hermes/state.db. (Module-level constant snapshot, see test_load_transcript_db_only.) + """ + import hermes_state + monkeypatch.setattr(hermes_state, "DEFAULT_DB_PATH", tmp_path / "state.db") + config = GatewayConfig() store = SessionStore(sessions_dir=tmp_path, config=config) diff --git a/tests/gateway/test_load_transcript_db_only.py b/tests/gateway/test_load_transcript_db_only.py index bc8b094dd1..2425e495a6 100644 --- a/tests/gateway/test_load_transcript_db_only.py +++ b/tests/gateway/test_load_transcript_db_only.py @@ -1,13 +1,23 @@ """Verify load_transcript returns SQLite messages without any JSONL file.""" from pathlib import Path + import pytest from gateway.session import SessionStore from gateway.config import GatewayConfig -def test_load_transcript_returns_db_messages_when_no_jsonl(tmp_path): - """Reading a transcript must work from SQLite alone — no JSONL fallback needed.""" +def test_load_transcript_returns_db_messages_when_no_jsonl(tmp_path, monkeypatch): + """Reading a transcript must work from SQLite alone — no JSONL fallback needed. + + Pin DEFAULT_DB_PATH to tmp_path so this test cannot write to the real + ~/.hermes/state.db. (DEFAULT_DB_PATH is a module-level constant computed + at hermes_state import time, before pytest's HERMES_HOME monkeypatch + fires — the autouse fixture's HERMES_HOME override doesn't help here.) + """ + import hermes_state + monkeypatch.setattr(hermes_state, "DEFAULT_DB_PATH", tmp_path / "state.db") + config = GatewayConfig() store = SessionStore(sessions_dir=tmp_path, config=config) @@ -16,11 +26,6 @@ def test_load_transcript_returns_db_messages_when_no_jsonl(tmp_path): store.append_to_transcript(sid, {"role": "user", "content": "hello", "timestamp": 1.0}) store.append_to_transcript(sid, {"role": "assistant", "content": "world", "timestamp": 2.0}) - # Delete any JSONL that the current dual-writer left behind - jsonl_path = tmp_path / f"{sid}.jsonl" - if jsonl_path.exists(): - jsonl_path.unlink() - history = store.load_transcript(sid) assert len(history) == 2 assert history[0]["content"] == "hello" diff --git a/tests/gateway/test_session.py b/tests/gateway/test_session.py index 7e5aa1787c..6e2c39f797 100644 --- a/tests/gateway/test_session.py +++ b/tests/gateway/test_session.py @@ -504,7 +504,9 @@ class TestSessionStoreRewriteTranscript: """Regression: /retry and /undo must persist truncated history to DB.""" @pytest.fixture() - def store(self, tmp_path): + def store(self, tmp_path, monkeypatch): + import hermes_state + monkeypatch.setattr(hermes_state, "DEFAULT_DB_PATH", tmp_path / "state.db") config = GatewayConfig() s = SessionStore(sessions_dir=tmp_path, config=config) return s @@ -546,13 +548,17 @@ class TestSessionStoreRewriteTranscript: class TestLoadTranscriptDBOnly: """After spec 002, load_transcript reads only from state.db.""" - def test_db_only_returns_empty_for_nonexistent(self, tmp_path): + def test_db_only_returns_empty_for_nonexistent(self, tmp_path, monkeypatch): + import hermes_state + monkeypatch.setattr(hermes_state, "DEFAULT_DB_PATH", tmp_path / "state.db") config = GatewayConfig() store = SessionStore(sessions_dir=tmp_path, config=config) result = store.load_transcript("nonexistent") assert result == [] - def test_db_only_returns_messages(self, tmp_path): + def test_db_only_returns_messages(self, tmp_path, monkeypatch): + import hermes_state + monkeypatch.setattr(hermes_state, "DEFAULT_DB_PATH", tmp_path / "state.db") config = GatewayConfig() store = SessionStore(sessions_dir=tmp_path, config=config) sid = "db_only_session" diff --git a/tests/gateway/test_session_dm_thread_seeding.py b/tests/gateway/test_session_dm_thread_seeding.py index 8c52225bf2..415e953baa 100644 --- a/tests/gateway/test_session_dm_thread_seeding.py +++ b/tests/gateway/test_session_dm_thread_seeding.py @@ -22,8 +22,16 @@ from gateway.session import SessionSource, SessionStore, build_session_key @pytest.fixture() -def store(tmp_path): - """SessionStore with SQLite — load_transcript reads from DB only.""" +def store(tmp_path, monkeypatch): + """SessionStore with SQLite — load_transcript reads from DB only. + + Pin DEFAULT_DB_PATH to tmp_path so SessionDB() can't write to the real + ~/.hermes/state.db. (DEFAULT_DB_PATH is a module-level constant computed + at hermes_state import time, before pytest's HERMES_HOME monkeypatch + fires — the autouse fixture's HERMES_HOME override doesn't help here.) + """ + import hermes_state + monkeypatch.setattr(hermes_state, "DEFAULT_DB_PATH", tmp_path / "state.db") config = GatewayConfig() s = SessionStore(sessions_dir=tmp_path, config=config) return s