import unittest
import main
class TestOrgParser(unittest.TestCase):
def setUp(self):
self.known_paths = {"note1.org", "note2.org"}
self.id_to_path = {"id-123": "note1.org"}
self.path_to_slug = {"note1.org": "id-123", "note2.org": "note2.org"}
def render(self, content, show_webhook=False):
return main.render_org_to_html(
content=content,
source_relative_path="source.org",
known_paths=self.known_paths,
id_to_path=self.id_to_path,
path_to_slug=self.path_to_slug,
show_webhook=show_webhook,
)
def test_external_links(self):
content = "See [[https://hungryroot.atlassian.net/browse/BE-7924][BE-7924]] for details."
rendered = self.render(content)
self.assertIn("BE-7924", rendered)
def test_internal_links(self):
content = "Check [[note1.org][Note 1]] or [[id:id-123][Note 1 ID]]."
rendered = self.render(content)
self.assertIn("Note 1", rendered)
self.assertIn("Note 1 ID", rendered)
def test_inline_formatting(self):
content = "Added flat replacements (=author_id=, ~python~, *always present*, /italic text/, _underlined_, +deleted+)."
rendered = self.render(content)
self.assertIn("author_id", rendered)
self.assertIn("python", rendered)
self.assertIn("always present", rendered)
self.assertIn("italic text", rendered)
self.assertIn("underlined", rendered)
self.assertIn("deleted", rendered)
def test_code_blocks(self):
content = "#+begin_src python\ndef hello():\n return 'world'\n#+end_src"
rendered = self.render(content)
self.assertIn("
def hello():\n return 'world'
", rendered)
def test_tables(self):
content = (
"| Field | List default |\n"
"|-------+--------------|\n"
"| =author= | present |\n"
)
rendered = self.render(content)
self.assertIn("", rendered)
self.assertIn("| Field | List default |
", rendered)
self.assertIn("author | present |
", rendered)
def test_lists(self):
content = "- =GET /api/v3/cookbooks/=\n- =GET /api/v3/cookbooks//="
rendered = self.render(content)
self.assertIn("", rendered)
self.assertIn("GET /api/v3/cookbooks/ ", rendered)
ordered_content = "1. Item one\n2. Item two"
ordered_rendered = self.render(ordered_content)
self.assertIn("", ordered_rendered)
self.assertIn("- Item one
", ordered_rendered)
def test_comments_ignored(self):
content = "#+CREATED: [2026-08-04]\n# This is a comment\nReal text"
rendered = self.render(content)
self.assertNotIn("#+CREATED", rendered)
self.assertNotIn("This is a comment", rendered)
self.assertIn("Real text
", rendered)
def test_headings_with_todo_and_tags(self):
content = "* TODO Fix auth issue :bug:backend:"
rendered = self.render(content)
self.assertIn("TODO", rendered)
self.assertIn("Fix auth issue", rendered)
self.assertIn("bug", rendered)
self.assertIn("backend", rendered)
def test_headings_build_collapsible_sections(self):
content = (
"#+TITLE: Doc title\n"
"* Top\n"
"Some content.\n"
"** Sub\n"
"Deeper content.\n"
"* Sibling\n"
"Sibling content.\n"
)
rendered = self.render(content)
self.assertIn("Doc title
", rendered)
self.assertIn("", rendered)
self.assertIn("", rendered)
self.assertIn("class='org-heading'", rendered)
self.assertIn("class='org-collapse-toggle'", rendered)
self.assertIn("class='org-section-body'", rendered)
self.assertIn("Some content.
", rendered)
self.assertIn("Deeper content.
", rendered)
self.assertIn("Sibling content.
", rendered)
self.assertNotIn("", rendered)
def test_level3_and_deeper_start_collapsed(self):
content = (
"* One\n"
"** Sub\n"
"Body A\n"
"*** Deep\n"
"Body B\n"
"* Two\n"
"Body C\n"
)
rendered = self.render(content)
self.assertIn("", rendered)
self.assertIn("", rendered)
self.assertIn("", rendered)
self.assertIn("aria-expanded='false'", rendered)
self.assertIn(">▸", rendered)
def test_nested_section_contains_deeper_heading(self):
content = "* Top\n** Sub\nDeep text\n* End\nTail text"
rendered = self.render(content)
top = rendered.index("")
sub = rendered.index("")
end = rendered.index("", top + 1)
self.assertTrue(top < sub < end)
def test_heading_stars_capped_at_level_6(self):
content = "****** Deep heading\nBody text"
rendered = self.render(content)
self.assertIn("", rendered)
self.assertIn("
Body text
", rendered)
def test_multiline_emphasis(self):
content = '*The safe ordering is always "clients first, flag flips\nsecond." Until then.*'
rendered = self.render(content)
self.assertIn(
"The safe ordering is always "clients first, flag flips\nsecond." Until then.",
rendered,
)
def test_code_with_internal_marker(self):
content = "Request =?expand=pairing_ids,product_ids= on the list endpoint."
rendered = self.render(content)
self.assertIn("?expand=pairing_ids,product_ids", rendered)
def test_soft_wrapped_paragraph_is_single_p(self):
content = "First line of prose\nsecond line of prose\n\nNext paragraph"
rendered = self.render(content)
self.assertIn("First line of prose\nsecond line of prose
", rendered)
self.assertIn("Next paragraph
", rendered)
def test_add_to_inbox_creates_inbox_at_top_after_preamble(self):
content = "#+TITLE: Notes\n* Work\nSome text.\n"
updated = main.add_to_inbox(content, "Call dentist")
lines = updated.splitlines()
self.assertEqual(lines[0], "#+TITLE: Notes")
self.assertEqual(lines[1], "* Inbox")
self.assertEqual(lines[2], "** TODO Call dentist")
self.assertEqual(lines[3], "* Work")
self.assertEqual(lines[4], "Some text.")
def test_add_to_inbox_appends_to_existing_inbox(self):
content = "* Inbox\n** TODO Existing\n* Work\n"
updated = main.add_to_inbox(content, "New task")
lines = updated.splitlines()
self.assertEqual(lines[0], "* Inbox")
self.assertEqual(lines[1], "** TODO Existing")
self.assertEqual(lines[2], "** TODO New task")
self.assertEqual(lines[3], "* Work")
def test_add_to_inbox_moves_existing_inbox_to_top(self):
content = "* Work\nSome text.\n* Inbox\n** TODO Old task\n"
updated = main.add_to_inbox(content, "New task")
lines = updated.splitlines()
self.assertEqual(lines[0], "* Inbox")
self.assertEqual(lines[1], "** TODO Old task")
self.assertEqual(lines[2], "** TODO New task")
self.assertEqual(lines[3], "* Work")
self.assertEqual(lines[4], "Some text.")
def test_add_to_inbox_blank_text_is_noop(self):
content = "* Inbox\n** TODO Keep\n"
self.assertEqual(main.add_to_inbox(content, " "), content)
if __name__ == "__main__":
unittest.main()