from chunkhound.code_mapper import pipeline as code_mapper_pipeline
from chunkhound.code_mapper import render as code_mapper_render
from chunkhound.code_mapper.models import CodeMapperPOI
from chunkhound.code_mapper.models import AgentDocMetadata
def _meta() -> AgentDocMetadata:
return AgentDocMetadata(
created_from_sha="abc123",
previous_target_sha="abc123",
target_sha="abc123",
generated_at="2025-12-19T00:00:00Z",
llm_config={"provider": "test"},
generation_stats={"code_mapper_comprehensiveness": "low"},
)
def test_render_overview_document_includes_metadata_and_header() -> None:
doc = code_mapper_render.render_overview_document(
meta=_meta(),
scope_label="scope",
overview_answer="Overview content",
)
assert "agent_doc_metadata:" in doc
assert "# Code Mapper Overview for scope" in doc
assert "Overview content" in doc
def test_render_combined_document_includes_sections_and_coverage() -> None:
coverage_lines = code_mapper_pipeline._coverage_summary_lines(
referenced_files=1,
referenced_chunks=2,
files_denominator=2,
chunks_denominator=4,
scope_total_files=2,
scope_total_chunks=4,
)
poi_sections = [
(CodeMapperPOI(mode="architectural", text="Core Flow: details"), {"answer": "Section body"})
]
doc = code_mapper_render.render_combined_document(
meta=_meta(),
scope_label="scope",
overview_answer="Overview content",
poi_sections=poi_sections,
coverage_lines=coverage_lines,
)
assert doc.count("## Coverage Summary") == 1
assert "# Code Mapper for scope" in doc
assert "## HyDE Overview" in doc
assert "## Architectural Map" in doc
assert "### 1. Core Flow" in doc
assert "Section body" in doc
def test_build_topic_artifacts_and_index() -> None:
poi_sections_indexed = [
(
1,
CodeMapperPOI(mode="architectural", text="**Core Flow**: details"),
{"answer": "Section body"},
)
]
topic_files, index_entries_by_mode = code_mapper_render.build_topic_artifacts(
scope_label="scope",
poi_sections_indexed=poi_sections_indexed,
)
assert topic_files, "Expected at least one topic file"
filename, content = topic_files[0]
assert filename == "scope_arch_topic_01_core-flow.md"
assert content.startswith("# Core Flow")
assert "Section body" in content
index_doc = code_mapper_render.render_index_document(
meta=_meta(),
scope_label="scope",
index_entries_by_mode=index_entries_by_mode,
unref_filename="scope_scope_unreferenced_files.txt",
)
assert "Code Mapper Topics for scope" in index_doc
assert "## Architectural Map" in index_doc
assert "## Operational Map" in index_doc
assert "[Core Flow](scope_arch_topic_01_core-flow.md)" in index_doc
assert "scope_scope_unreferenced_files.txt" in index_doc
def test_build_topic_artifacts_includes_failed_entries() -> None:
poi_sections_indexed = [
(
1,
CodeMapperPOI(mode="architectural", text="Core Flow"),
{"answer": "Section body"},
)
]
failed = [
(
2,
CodeMapperPOI(mode="architectural", text="Error Handling"),
"# Error Handling (failed)\n\nDetails\n",
)
]
topic_files, index_entries_by_mode = code_mapper_render.build_topic_artifacts(
scope_label="scope",
poi_sections_indexed=poi_sections_indexed,
failed_poi_sections=failed,
)
filenames = [name for name, _content in topic_files]
assert "scope_arch_topic_01_core-flow.md" in filenames
assert "scope_arch_topic_02_error-handling.md" in filenames
index_doc = code_mapper_render.render_index_document(
meta=_meta(),
scope_label="scope",
index_entries_by_mode=index_entries_by_mode,
unref_filename=None,
)
assert (
"[Error Handling (failed)](scope_arch_topic_02_error-handling.md)" in index_doc
)