generated from coulomb/repo-seed
94 lines
2.6 KiB
Python
94 lines
2.6 KiB
Python
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
|