60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""Unit tests for Markdown renderer covering scenarios OUT-002 to OUT-010."""
|
|
|
|
import yaml
|
|
|
|
from src.runtime.candidate.models import CandidateObject
|
|
from src.runtime.storage.markdown_renderer import render_canonical_markdown
|
|
|
|
|
|
def test_render_canonical_markdown_with_front_matter():
|
|
blocks = [
|
|
CandidateObject(
|
|
id="blk_01",
|
|
type="heading",
|
|
text="Primeiro Bloco",
|
|
extractor="trafilatura",
|
|
position=1,
|
|
level=2,
|
|
),
|
|
CandidateObject(
|
|
id="blk_02",
|
|
type="paragraph",
|
|
text="Este é o parágrafo editorial.",
|
|
extractor="trafilatura",
|
|
position=2,
|
|
),
|
|
CandidateObject(
|
|
id="blk_03", type="list_item", text="Item de lista", extractor="trafilatura", position=3
|
|
),
|
|
]
|
|
|
|
rendered = render_canonical_markdown(
|
|
title="Título do Artigo",
|
|
subtitle="Subtítulo informativo",
|
|
fingerprint="a" * 64,
|
|
source_url="https://example.com/art",
|
|
published_date="2026-08-20T10:00:00Z",
|
|
language="pt",
|
|
sentiment="positive",
|
|
tags=["economia", "petrobras", "brasil"],
|
|
ecp_target_id="Q123",
|
|
ecp_target_name="Petrobras",
|
|
body_blocks=blocks,
|
|
)
|
|
|
|
assert rendered.startswith("---\n")
|
|
assert "# Título do Artigo" in rendered
|
|
assert "*Subtítulo informativo*" in rendered
|
|
assert "## Primeiro Bloco" in rendered
|
|
assert "Este é o parágrafo editorial." in rendered
|
|
assert "- Item de lista" in rendered
|
|
|
|
# Verify front matter parses as valid YAML
|
|
parts = rendered.split("---\n")
|
|
front_matter_raw = parts[1]
|
|
parsed_fm = yaml.safe_load(front_matter_raw)
|
|
assert parsed_fm["title"] == "Título do Artigo"
|
|
assert parsed_fm["fingerprint"] == "a" * 64
|
|
assert parsed_fm["sentiment"] == "positive"
|
|
assert parsed_fm["tags"] == ["economia", "petrobras", "brasil"]
|