| """TDD para el parser de erratas (New/Old text + set por H1 interno).""" |
| from scripts.parse_errata import ( |
| _set_from_h1, |
| parse_errata_doc, |
| render_errata_md, |
| ) |
|
|
|
|
| |
| |
| |
|
|
| def test_set_from_h1_origins(): |
| assert _set_from_h1("Origins Cards") == "origins" |
|
|
|
|
| def test_set_from_h1_spiritforged(): |
| assert _set_from_h1("Spiritforged Cards") == "spiritforged" |
|
|
|
|
| def test_set_from_h1_unleashed(): |
| assert _set_from_h1("Unleashed Cards") == "unleashed" |
|
|
|
|
| def test_set_from_h1_non_set_header_returns_none(): |
| assert _set_from_h1("Card Errata") is None |
| assert _set_from_h1("Summary") is None |
|
|
|
|
| |
| |
| |
|
|
| _ORIGINS_DOC = """\ |
| # Riftbound: Origins Card Errata |
| |
| ## Overview |
| |
| Some intro text, not a card. |
| |
| # Card Errata |
| |
| ## Baited Hook |
| |
| ### New Text |
| |
| ```text |
| Kill a friendly unit. Banish then play. |
| ``` |
| |
| ### Old Text |
| |
| ```text |
| Kill a friendly unit. Play. |
| ``` |
| |
| ## Dune Drake |
| |
| ### New Text |
| |
| ```text |
| When I attack, give me +2 this turn. |
| ``` |
| |
| ### Old Text |
| |
| ```text |
| When I attack, give me +2. |
| ``` |
| """ |
|
|
|
|
| def test_parse_default_set_doc_extracts_only_real_cards(): |
| cards = parse_errata_doc(_ORIGINS_DOC, default_set="origins") |
| names = [c["card"] for c in cards] |
| |
| assert names == ["Baited Hook", "Dune Drake"] |
|
|
|
|
| def test_parse_default_set_assigns_default_set(): |
| cards = parse_errata_doc(_ORIGINS_DOC, default_set="origins") |
| assert all(c["set"] == "origins" for c in cards) |
|
|
|
|
| def test_parse_new_and_old_text_captured_without_fences(): |
| cards = parse_errata_doc(_ORIGINS_DOC, default_set="origins") |
| baited = next(c for c in cards if c["card"] == "Baited Hook") |
| assert baited["new_text"] == "Kill a friendly unit. Banish then play." |
| assert baited["old_text"] == "Kill a friendly unit. Play." |
|
|
|
|
| |
| |
| |
|
|
| _MULTI_DOC = """\ |
| # Unleashed Errata Updates |
| |
| Intro paragraph. |
| |
| # Spiritforged Cards |
| |
| ## Guards! |
| |
| ### New Text |
| |
| Play a token. Then do this: ready it. |
| |
| ### Old Text |
| |
| Play a token. You may ready it. |
| |
| # Unleashed Cards |
| |
| ## Death from Below |
| |
| ### New Text |
| |
| Kill a unit. Then do this: play from trash. |
| |
| ### Old Text |
| |
| Kill a unit. You may play from trash. |
| """ |
|
|
|
|
| def test_parse_multi_set_routes_by_internal_h1(): |
| cards = parse_errata_doc(_MULTI_DOC, default_set="unleashed") |
| by_name = {c["card"]: c["set"] for c in cards} |
| assert by_name["Guards!"] == "spiritforged" |
| assert by_name["Death from Below"] == "unleashed" |
|
|
|
|
| |
| |
| |
|
|
| def test_render_new_text_is_body_old_text_is_marked(): |
| cards = [{ |
| "card": "Dune Drake", |
| "set": "origins", |
| "new_text": "When I attack, give me +2 this turn.", |
| "old_text": "When I attack, give me +2.", |
| }] |
| md = render_errata_md(cards, set_name="origins") |
| assert "## Dune Drake" in md |
| assert "When I attack, give me +2 this turn." in md |
| |
| assert "Texto anterior (reemplazado):" in md |
| |
| assert md.index("give me +2 this turn") < md.index("Texto anterior") |
|
|
|
|
| def test_render_skips_old_block_when_no_old_text(): |
| cards = [{"card": "X", "set": "origins", "new_text": "New only.", "old_text": None}] |
| md = render_errata_md(cards, set_name="origins") |
| assert "New only." in md |
| assert "Texto anterior" not in md |
|
|