Files
markitect-tool/tests/test_parse_contract.py

90 lines
2.8 KiB
Python

from pathlib import Path
import pytest
from click.testing import CliRunner
from markitect_tool import MarkdownParseError, parse_markdown, parse_markdown_file
from markitect_tool.cli import main
def test_parse_markdown_preserves_headings_and_paragraphs():
document = parse_markdown("# Heading\n\nThis is a paragraph.")
assert document.frontmatter == {}
assert document.headings[0].level == 1
assert document.headings[0].text == "Heading"
assert [block.type for block in document.blocks] == ["heading", "paragraph"]
assert document.sections[0].heading.text == "Heading"
assert document.sections[0].blocks[0].text == "This is a paragraph."
assert document.tokens[0]["type"] == "heading_open"
def test_parse_markdown_extracts_yaml_frontmatter():
markdown = """---
title: YAML Frontmatter Test Document
tags:
- yaml
- frontmatter
published: true
nested:
priority: high
---
# YAML Frontmatter Test Document
Body text.
"""
document = parse_markdown(markdown)
assert document.frontmatter["title"] == "YAML Frontmatter Test Document"
assert document.frontmatter["tags"] == ["yaml", "frontmatter"]
assert document.frontmatter["published"] is True
assert document.frontmatter["nested"]["priority"] == "high"
assert document.headings[0].line == 11
assert document.body.lstrip().startswith("# YAML Frontmatter Test Document")
def test_parse_markdown_without_frontmatter_is_graceful():
document = parse_markdown("# Document Without Frontmatter\n\nText.")
assert document.frontmatter == {}
assert document.headings[0].text == "Document Without Frontmatter"
def test_parse_markdown_rejects_non_mapping_frontmatter():
with pytest.raises(MarkdownParseError, match="Frontmatter must be a mapping"):
parse_markdown("---\n- nope\n---\n\n# Bad")
def test_parse_markdown_file_records_source_path(tmp_path: Path):
source = tmp_path / "doc.md"
source.write_text("# Test Document\n\nBody", encoding="utf-8")
document = parse_markdown_file(source)
assert document.source_path == str(source)
assert document.headings[0].text == "Test Document"
def test_mkt_parse_outputs_json(tmp_path: Path):
source = tmp_path / "doc.md"
source.write_text("# Test Document\n\nBody", encoding="utf-8")
result = CliRunner().invoke(main, ["parse", str(source)])
assert result.exit_code == 0
assert '"headings"' in result.output
assert "Test Document" in result.output
def test_mkt_parse_outputs_tree(tmp_path: Path):
source = tmp_path / "doc.md"
source.write_text("# One\n\n## Two\n", encoding="utf-8")
result = CliRunner().invoke(main, ["parse", str(source), "--format", "tree"])
assert result.exit_code == 0
assert "# One" in result.output
assert "## Two" in result.output