import sys from pathlib import Path from xml.etree import ElementTree as ET sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from flatten_epub_toc import flatten_nav, flatten_ncx, set_xhtml_direction def test_flatten_nav_after_flatten_ncx_preserves_default_xhtml_namespace(): """Contract: flatten_nav must re-register the default XHTML namespace so that element serialization does not emit unwanted 'ns0:' namespace prefixes even if flatten_ncx was called previously. """ nav_xml = """ TOC """ ncx_xml = """ 1 Chapter 1 """ # Call flatten_ncx first, which registers default NCX namespace flatten_ncx(ncx_xml, "Title", "TOC") # Calling flatten_nav afterwards should still output clean XHTML without ns0: prefix result = flatten_nav(nav_xml, "Title", "TOC").decode("utf-8") assert " TOC """ result = flatten_nav(nav_xml, "Title Page", "Contents").decode("utf-8") assert 'id="toc-li-title-page" class="chapter-group"' not in result assert 'id="toc-li-contents" class="chapter-group"' not in result def test_flatten_ncx_after_flatten_nav_preserves_default_ncx_namespace(): """Contract: flatten_ncx must output default NCX namespace without ns0: prefix even if flatten_nav ran first.""" nav_xml = """ TOC """ ncx_xml = """ 1 Chapter 1 """ # Run nav first, then ncx flatten_nav(nav_xml, "Title", "TOC") result = flatten_ncx(ncx_xml, "Title", "TOC").decode("utf-8") assert " TOC """ result = flatten_nav(nav_xml, "Title Page", "Contents").decode("utf-8") title_pos = result.find('id="toc-li-title-page"') contents_pos = result.find('id="toc-li-contents"') ch1_pos = result.find('href="ch1.xhtml"') assert title_pos != -1 assert contents_pos != -1 assert ch1_pos != -1 assert title_pos < contents_pos < ch1_pos assert 'class="chapter-group"' in result[ch1_pos - 100 : ch1_pos + 100] def test_rtl_helpers_use_requested_language_and_keep_code_ltr(): nav_xml = """ """ content_xml = """

עברית

print('hello')""" nav = flatten_nav( nav_xml, "עמוד השער", "תוכן העניינים", rtl=True, language="he" ) nav_root = ET.fromstring(nav) assert nav_root.get("dir") == "rtl" assert nav_root.get("{http://www.w3.org/XML/1998/namespace}lang") == "he" content = set_xhtml_direction(content_xml, language="he") content_root = ET.fromstring(content) assert content_root.get("dir") == "rtl" assert content_root.get("lang") == "he" assert content_root.get("{http://www.w3.org/XML/1998/namespace}lang") == "he" code = content_root.find(".//{http://www.w3.org/1999/xhtml}code") assert code.get("dir") == "ltr"