mempalace/tests
mvalentsev c933095a2f fix(palace): stratify state messages for empty/missing palace (#1498)
`mempalace status`, `search`, and `compress` printed the same misleading
"No palace found / Run: mempalace init" output for three distinct
palace states (no dir / no DB / no collection). Most user-visible on
the first-run state where `init` had run but `mine` had not: the hint
to re-run `init` is a no-op and wastes the user's time.

Backend gets a new typed exception `CollectionNotInitializedError`
(subclass of `PalaceNotFoundError`, transitively `FileNotFoundError`,
so legacy callers keep working). `ChromaBackend.get_collection(
create=False)` wraps chromadb's bare `NotFoundError` as the new typed
exception instead of leaking the chromadb-specific class to callers.

A new internal helper `_open_collection_or_explain` in `palace.py`
runs filesystem-first state checks before the backend call to avoid
chromadb's lazy `chroma.sqlite3` creation as a side-effect of a
read-only inspection, then catches the typed exceptions and prints a
state-specific actionable message. `BackendClosedError` is explicitly
re-raised so a programmer error is not masked as a UX hint.

Two CLI bug sites route through the helper: `miner.status` and
`cli.cmd_compress`. `searcher.search` catches the typed exceptions
directly so it can preserve the cause chain in `SearchError(...) from
e` for programmatic search-API consumers. `cli.cmd_sync` gained an
inline filesystem distinction (no helper needed: it does not use the
collection handle). `repair.status` (capacity check, which by design
must work on corrupted palaces without opening a chromadb client) got
the same distinction via `sqlite_drawer_count`-based empty detection.
The MCP `tool_status` is intentionally left alone: PR #831 already
fixed it there with a `create=True` bootstrap strategy appropriate
for programmatic clients.
2026-05-17 03:57:19 +05:00
..
benchmarks test(mcp): migrate _kg monkeypatches to _get_kg (#1136) 2026-05-03 17:43:00 +05:00
conftest.py Update conftest.py as part of fix(tests): isolate palace lock subprocess state 2026-05-09 11:20:33 +02:00
test_backends.py fix(palace): stratify state messages for empty/missing palace (#1498) 2026-05-17 03:57:19 +05:00
test_chroma_collection_lock.py fix(tests): use spawn instead of fork for lock-test subprocesses 2026-05-09 20:11:08 -03:00
test_claude_plugin_hook_config.py test(hooks): use hook.get("type") for graceful assert message 2026-05-13 22:53:48 +05:00
test_claude_plugin_hook_wrappers.py test: normalize wrapper script path for bash on Windows 2026-04-19 10:34:11 +02:00
test_cli.py fix(palace): stratify state messages for empty/missing palace (#1498) 2026-05-17 03:57:19 +05:00
test_closet_llm.py test(closet_llm): use _ for unused return values per copilot review 2026-05-07 12:49:27 -03:00
test_closets.py test(diary): write fixture with explicit utf-8 to fix Windows hash assert 2026-05-07 17:41:19 -03:00
test_collection_metric_invariant.py fix(test): use tmp_path for full-stack invariant test (Windows CI) 2026-04-25 00:39:37 -03:00
test_config.py fix(config): catch OverflowError in coercion; correct "stricter" wording 2026-05-15 11:01:48 -03:00
test_config_extra.py test(config): make palace_path tests portable across POSIX and Windows 2026-04-24 11:13:51 +02:00
test_convo_miner.py feat(normalize): auto-rebuild stale drawers via NORMALIZE_VERSION schema gate 2026-04-13 16:20:55 -03:00
test_convo_miner_size_cap.py Raise convo_miner MAX_FILE_SIZE cap 10 MB → 500 MB 2026-04-18 12:52:01 -03:00
test_convo_miner_unit.py fix(test): remove duplicate pytest import breaking lint on develop 2026-05-15 10:46:41 -03:00
test_convo_scanner.py fix(llm): tighter refinement — word boundaries, JSON extraction, authoritative sources 2026-04-24 01:30:40 -03:00
test_corpus_origin.py feat(init): context-aware corpus detection 2026-04-26 12:37:26 -07:00
test_corpus_origin_integration.py feat(privacy): blocking consent gate for env-fallback LLM API keys 2026-04-27 00:44:57 -07:00
test_dedup.py refactor: route all chromadb access through ChromaBackend 2026-04-14 00:31:16 -03:00
test_dialect.py fix: align cmd_compress dict keys with compression_stats() return values (#569) 2026-04-11 16:16:31 -07:00
test_embedding.py test: isolate embedding module state with monkeypatch 2026-04-24 23:11:29 +00:00
test_empty_chromadb_results.py fix(searcher): guard against empty ChromaDB query results (#195) (#865) 2026-04-15 00:26:38 -07:00
test_entity_detector.py feat(graph): cross-wing tunnels by shared topics (#1180) 2026-04-24 23:06:26 -03:00
test_entity_registry.py fix(entity_registry): atomic write to prevent partial corruption on crash 2026-05-04 11:08:14 +02:00
test_exporter.py fix(exporter): refuse symlinks at file targets and skip tests on Windows 2026-05-07 12:51:47 -03:00
test_fact_checker.py fix(cli, fact-checker): per-stream stdio errors policy on Windows 2026-05-03 21:37:12 +05:00
test_general_extractor.py style: format test files with ruff 2026-04-08 21:08:49 +03:00
test_hall_detection.py fix: README audit — 42 TDD tests + hall detection + 7 claim fixes (#835) 2026-04-13 17:11:11 -07:00
test_hnsw_capacity.py fix: use configured collection in recovery paths 2026-05-07 09:10:00 -03:00
test_hnsw_payload_health.py style: ruff format test_hnsw_payload_health.py (#1461 follow-up) 2026-05-14 19:17:26 -03:00
test_hooks_cli.py ci(test_hooks_cli): re-apply ruff 0.4.x format (CI pins ruff<0.5) 2026-05-10 12:56:28 +02:00
test_hooks_shell.py fix(hooks): MEMPAL_PYTHON override for .sh hooks' internal python3 calls 2026-04-21 01:43:08 -03:00
test_hybrid_candidate_union.py fix(searcher): address Copilot review on #1306 2026-05-03 06:09:10 -03:00
test_hybrid_search.py merge: pr/closet-llm-generic + harden LLM regen path for production 2026-04-13 18:40:36 -03:00
test_i18n.py Merge pull request #1051 from itfarrier/feat/i18n-belarusian 2026-04-21 01:09:54 -03:00
test_i18n_lang_case.py fix(i18n): resolve language codes case-insensitively (#927) 2026-04-15 23:33:42 +02:00
test_init.py fix(init): keep PYTHONPATH env for embedded callers, strip only in CLI entry points 2026-05-13 22:53:36 +05:00
test_init_gitignore_protection.py fix(init): auto-add per-project files to .gitignore in git repos (#185) (#866) 2026-04-15 00:26:41 -07:00
test_instructions_cli.py fix: add explicit UTF-8 encoding to read_text() calls (#776) 2026-04-16 16:00:29 +05:00
test_kg_thread_safety.py fix: add missing self._lock to KnowledgeGraph.close() 2026-04-14 13:09:10 -07:00
test_knowledge_graph.py fix(kg): close sqlite connections during cleanup 2026-05-08 14:44:04 +00:00
test_knowledge_graph_extra.py test: bring coverage to 85%, set threshold to 85, reset version to 3.0.11 2026-04-08 21:38:12 +03:00
test_known_entities_registry.py feat(graph): cross-wing tunnels by shared topics (#1180) 2026-04-24 23:06:26 -03:00
test_layers.py fix: guard None metadata/doc in tool_check_duplicate and Layer1/Layer2 2026-04-19 11:13:50 +03:00
test_llm_client.py feat(privacy): blocking consent gate for env-fallback LLM API keys 2026-04-27 00:44:57 -07:00
test_llm_refine.py feat(graph): cross-wing tunnels by shared topics (#1180) 2026-04-24 23:06:26 -03:00
test_mcp_server.py fix(mcp): structured -32602 for unknown parameter name (#1512) 2026-05-15 13:48:29 +02:00
test_mcp_stdio_protection.py fix(mcp): redirect stdout to stderr during import to protect JSON-RPC channel (#225) (#864) 2026-04-15 00:26:51 -07:00
test_migrate.py fix(migrate): verify write roundtrip before bailout 2026-05-05 09:01:05 +00:00
test_miner.py fix(palace): stratify state messages for empty/missing palace (#1498) 2026-05-17 03:57:19 +05:00
test_miner_jsonl_visibility.py Harden sweeper for production: verbatim tool blocks, full session_id, logged failures 2026-04-18 13:14:32 -03:00
test_normalize.py fix(normalize): discard user/gemini turns before session_metadata sentinel 2026-04-27 21:41:48 +00:00
test_onboarding.py fix: add explicit UTF-8 encoding to read_text() calls (#776) 2026-04-16 16:00:29 +05:00
test_palace.py fix(palace): stratify state messages for empty/missing palace (#1498) 2026-05-17 03:57:19 +05:00
test_palace_graph.py fix(palace_graph): skip None metadata in build_graph 2026-04-25 11:06:32 -07:00
test_palace_graph_tunnels.py style: ruff format three test files 2026-04-28 22:18:22 -03:00
test_palace_locks.py Merge remote-tracking branch 'origin/develop' into pr-1417-fix-kg-datetimes 2026-05-09 21:12:40 -03:00
test_project_scanner.py feat(graph): cross-wing tunnels by shared topics (#1180) 2026-04-24 23:06:26 -03:00
test_query_sanitizer.py fix: make quote trimming explicit 2026-04-12 22:19:58 -03:00
test_readme_claims.py docs+tests: fix CI after README slim (#875) 2026-04-14 21:59:55 -03:00
test_repair.py fix(palace): stratify state messages for empty/missing palace (#1498) 2026-05-17 03:57:19 +05:00
test_room_detector_local.py fix: skip unreachable reparse points in detect_rooms_from_folders (#558) 2026-04-11 16:16:06 -07:00
test_save_hook_mines.py test(hooks): skip bash subprocess validator test on Windows 2026-04-27 02:45:04 -03:00
test_save_hook_verbose.py feat: add MEMPAL_VERBOSE toggle — developers see diaries in chat (#871) 2026-04-14 10:55:56 -07:00
test_searcher.py Merge develop into main for v3.3.5 release 2026-05-10 01:05:36 -03:00
test_sources.py chore(tests): wrap sqlite3 connections in contextlib.closing 2026-05-09 20:25:47 -03:00
test_spellcheck.py style: format test files with ruff 2026-04-08 21:08:49 +03:00
test_spellcheck_extra.py test: bring coverage to 85%, set threshold to 85, reset version to 3.0.11 2026-04-08 21:38:12 +03:00
test_split_mega_files.py test: expand coverage to 70%, fix mcp_server CI crash (threshold 60%) 2026-04-08 21:07:03 +03:00
test_sweeper.py Address Copilot review: cursor tie-break, honest metrics, accurate comments 2026-04-18 13:22:18 -03:00
test_sync.py fix(test_sync): use tmp_dir for elsewhere path so it stays absolute on Windows 2026-05-09 04:12:18 +05:00
test_version_consistency.py fix: unify package and MCP version reporting 2026-04-07 08:53:25 +01:00