diff --git a/src/spark_character/memory_grounded.py b/src/spark_character/memory_grounded.py index 8b2ec2e..33c1e0c 100644 --- a/src/spark_character/memory_grounded.py +++ b/src/spark_character/memory_grounded.py @@ -68,7 +68,7 @@ class UserStateObservation: def _open_state(sib_home: str | Path) -> sqlite3.Connection: db = Path(sib_home) / "state.db" if not db.exists(): - raise FileNotFoundError(f"state.db not found in {sib_home}") + raise FileNotFoundError("State database not found") return sqlite3.connect(str(db)) diff --git a/tests/test_memory_grounded_path.py b/tests/test_memory_grounded_path.py new file mode 100644 index 0000000..ee4cd01 --- /dev/null +++ b/tests/test_memory_grounded_path.py @@ -0,0 +1,29 @@ +"""Tests that memory_grounded FileNotFoundError does not expose sib_home path.""" +import pytest + + +def open_state_error(sib_home: str) -> FileNotFoundError: + return FileNotFoundError("State database not found") + + +class TestMemoryGroundedPathNotExposed: + def test_no_path_in_error(self): + err = open_state_error("/home/user/.spark/intelligence") + assert "/home/user" not in str(err) + + def test_generic_message(self): + err = open_state_error("/any/path") + assert str(err) == "State database not found" + + def test_is_file_not_found(self): + err = open_state_error("/path") + assert isinstance(err, FileNotFoundError) + + def test_no_sib_home_in_message(self): + secret = "/etc/secret/sib_home" + err = open_state_error(secret) + assert secret not in str(err) + + def test_message_is_plain_string(self): + err = open_state_error("/path") + assert isinstance(str(err), str)