from pathlib import Path import pytest from click.testing import CliRunner from markitect_tool.cli import main from markitect_tool.explode import ( EXPLODE_MANIFEST_NAME, ExplodeError, explode_markdown_file, implode_markdown_directory, ) ROUNDTRIP_DOC = """--- title: Explode Example --- Opening text before the first heading. # Intro Intro body. ## Detail Detail body. # Later Later body. """ def test_flat_explode_implode_roundtrips_exact_markdown(tmp_path: Path): source = tmp_path / "source.md" output_dir = tmp_path / "exploded" source.write_text(ROUNDTRIP_DOC, encoding="utf-8") result = explode_markdown_file(source, output_dir, variant="flat") imploded = implode_markdown_directory(output_dir) assert Path(result.manifest_path).name == EXPLODE_MANIFEST_NAME assert (output_dir / "00-preamble.md").exists() assert (output_dir / "sections" / "01-intro.md").exists() assert imploded.markdown == ROUNDTRIP_DOC assert imploded.current_hash == result.manifest.source_hash def test_hierarchical_explode_places_child_sections_under_parent(tmp_path: Path): source = tmp_path / "source.md" output_dir = tmp_path / "exploded" source.write_text(ROUNDTRIP_DOC, encoding="utf-8") result = explode_markdown_file(source, output_dir, variant="hierarchical") files = {Path(path).relative_to(output_dir).as_posix() for path in result.written_files} assert "01-intro.md" in files assert "01-intro/02-detail.md" in files assert implode_markdown_directory(output_dir).markdown == ROUNDTRIP_DOC def test_explode_rejects_non_empty_output_without_force(tmp_path: Path): source = tmp_path / "source.md" output_dir = tmp_path / "exploded" output_dir.mkdir() (output_dir / "existing.md").write_text("Existing", encoding="utf-8") source.write_text(ROUNDTRIP_DOC, encoding="utf-8") with pytest.raises(ExplodeError, match="not empty"): explode_markdown_file(source, output_dir) def test_mkt_explode_and_implode(tmp_path: Path): source = tmp_path / "source.md" output_dir = tmp_path / "exploded" rebuilt = tmp_path / "rebuilt.md" source.write_text(ROUNDTRIP_DOC, encoding="utf-8") runner = CliRunner() explode_result = runner.invoke( main, ["explode", str(source), "--output-dir", str(output_dir), "--variant", "flat"], ) implode_result = runner.invoke( main, ["implode", str(output_dir), "--output", str(rebuilt)], ) assert explode_result.exit_code == 0 assert "entries: 4" in explode_result.output assert implode_result.exit_code == 0 assert rebuilt.read_text(encoding="utf-8") == ROUNDTRIP_DOC