Skip to content

Commit ff39778

Browse files
committed
bunch o tests
1 parent ace1b72 commit ff39778

6 files changed

Lines changed: 307 additions & 18 deletions

tests/test_github_alerts.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from md2bbcode.main import process_readme
2+
3+
4+
def test_github_alert_blockquote_renders_as_admonition():
5+
for kind in ["note", "tip", "important", "warning", "caution"]:
6+
markdown = f"""> [!{kind.upper()}]
7+
> Body for {kind}.
8+
""".lstrip()
9+
10+
result = process_readme(markdown, domain="")
11+
lowered = result.lower()
12+
13+
assert f"[admonition={kind}]" in lowered
14+
assert f"body for {kind}." in lowered
15+
assert f"[!{kind}]" not in lowered
16+
17+
18+
def test_normal_blockquote_is_not_admonition():
19+
markdown = """> Just a quote.
20+
> Still quoted.
21+
""".lstrip()
22+
23+
result = process_readme(markdown, domain="")
24+
lowered = result.lower()
25+
26+
assert "[quote]" in lowered
27+
assert "[admonition=" not in lowered
28+
29+
30+
def test_unknown_alert_marker_does_not_trigger_admonition():
31+
markdown = """> [!FOO]
32+
> Not a supported GitHub alert type.
33+
""".lstrip()
34+
35+
result = process_readme(markdown, domain="")
36+
lowered = result.lower()
37+
38+
assert "[quote]" in lowered
39+
assert "[admonition=" not in lowered
40+
assert "[!foo]" in lowered
41+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from md2bbcode.main import process_readme
2+
3+
4+
def test_html_font_tag_converts_to_xf_bbcode():
5+
markdown = '<font color="red" size="3" face="Times New Roman">Hello</font>\n'
6+
result = process_readme(markdown, domain="")
7+
lowered = result.lower()
8+
9+
assert "[color=red]" in lowered
10+
assert "[size=3]" in lowered
11+
assert "[font=times new roman]hello[/font]" in lowered
12+
assert "[/size][/color]" in lowered
13+
14+
15+
def test_html_style_attribute_converts_to_xf_bbcode():
16+
markdown = (
17+
'<span style="color: #f00; font-size: 12px; font-family: Arial; '
18+
'font-weight: bold; font-style: italic; text-decoration: underline line-through;">X</span>\n'
19+
)
20+
result = process_readme(markdown, domain="")
21+
lowered = result.lower()
22+
23+
assert "[color=#f00]" in lowered
24+
assert "[size=12px]" in lowered
25+
assert "[font=arial]" in lowered
26+
assert "[b]" in lowered
27+
assert "[i]" in lowered
28+
assert "[u]" in lowered
29+
assert "[s]" in lowered
30+
31+
32+
def test_inline_code_does_not_convert_html_inside_icode():
33+
markdown = '<font color="red">Red</font> and `<font color="red">Code</font>`\n'
34+
result = process_readme(markdown, domain="")
35+
lowered = result.lower()
36+
37+
# Outside inline code: should convert
38+
assert "[color=red]" in lowered
39+
# Inside inline code: should remain literal HTML, not converted
40+
assert '[icode]<font color="red">code</font>[/icode]' in lowered
41+

tests/test_html2bbcode_tags.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
from md2bbcode.main import process_readme
2+
3+
4+
def test_html_basic_formatting_and_links():
5+
markdown = (
6+
"<b>bold</b> <i>italic</i> <u>under</u> <s>strike</s> "
7+
"<ins>insert</ins> <mark>mark</mark> <kbd>kbd</kbd><br>"
8+
"<a href=\"https://example.com\">link</a> "
9+
"<img src=\"https://example.com/x.png\" alt=\"alt text\">"
10+
"<hr>"
11+
)
12+
result = process_readme(markdown, domain="")
13+
lowered = result.lower()
14+
15+
assert "[b]bold[/b]" in lowered
16+
assert "[i]italic[/i]" in lowered
17+
assert "[u]under[/u]" in lowered
18+
assert "[s]strike[/s]" in lowered
19+
assert "[u]insert[/u]" in lowered
20+
assert "[mark]mark[/mark]" in lowered
21+
assert "[icode]kbd[/icode]" in lowered
22+
assert "[url=https://example.com]link[/url]" in lowered
23+
assert "[img alt=\"alt text\"]https://example.com/x.png[/img]" in lowered
24+
assert "[hr][/hr]" in lowered
25+
26+
27+
def test_html_code_blocks_and_inline_code():
28+
markdown = (
29+
"<pre><code class=\"language-python\">print('hi')</code></pre>"
30+
" and <code>inline</code>"
31+
)
32+
result = process_readme(markdown, domain="")
33+
lowered = result.lower()
34+
35+
assert "[code=python]print('hi')[/code]" in lowered
36+
assert "[icode]inline[/icode]" in lowered
37+
38+
39+
def test_html_lists_and_tables():
40+
markdown = (
41+
"<ul><li>One</li><li>Two</li></ul>"
42+
"<ol><li>First</li><li>Second</li></ol>"
43+
"<table>"
44+
"<tr><th>H</th><th>H2</th></tr>"
45+
"<tr><td>A</td><td>B</td></tr>"
46+
"</table>"
47+
)
48+
result = process_readme(markdown, domain="")
49+
lowered = result.lower()
50+
51+
assert "[list]" in lowered
52+
assert "[*]one" in lowered
53+
assert "[*]two" in lowered
54+
assert "[list=1]" in lowered
55+
assert "[*]first" in lowered
56+
assert "[*]second" in lowered
57+
assert "[table]" in lowered
58+
assert "[tr]" in lowered
59+
assert "[th]h[/th]" in lowered
60+
assert "[td]a[/td]" in lowered
61+
62+
63+
def test_html_anchor_and_abbr():
64+
markdown = (
65+
"<a name=\"section\">Target</a> "
66+
"<a href=\"#section\">Jump</a> "
67+
"<abbr title=\"World Health Organization\">WHO</abbr>"
68+
)
69+
result = process_readme(markdown, domain="")
70+
lowered = result.lower()
71+
72+
assert "[aname=section]target[/aname]" in lowered
73+
assert "[jumpto=section]jump[/jumpto]" in lowered
74+
assert "[abbr=world health organization]who[/abbr]" in lowered
75+
76+
77+
def test_html_mailto_and_alignment():
78+
markdown = (
79+
"<a href=\"mailto:test@example.com?subject=Hello\">Email</a> "
80+
"<p style=\"text-align:center\">Centered</p>"
81+
"<div align=\"right\"><b>Right</b></div>"
82+
"<blockquote data-author=\"Alice\">Quoted</blockquote>"
83+
)
84+
result = process_readme(markdown, domain="")
85+
lowered = result.lower()
86+
87+
assert "[email]test@example.com[/email]" in lowered
88+
assert "[center]centered[/center]" in lowered
89+
assert "[right][b]right[/b][/right]" in lowered
90+
assert "[quote=\"alice\"]" in lowered
91+
assert "quoted" in lowered
92+
93+
94+
def test_span_and_div_without_style_convert_children():
95+
markdown = "<span><b>Bold</b></span><div><i>Italic</i></div>"
96+
result = process_readme(markdown, domain="")
97+
lowered = result.lower()
98+
99+
assert "[b]bold[/b]" in lowered
100+
assert "[i]italic[/i]" in lowered
101+
assert "<span>" not in lowered
102+
assert "<div>" not in lowered
103+
104+
105+
def test_unknown_html_passthrough():
106+
markdown = "<custom-tag data-x=\"1\"><b>Bold</b></custom-tag>"
107+
result = process_readme(markdown, domain="")
108+
109+
assert "<custom-tag data-x=\"1\">" in result
110+
assert "<b>Bold</b>" in result
111+
assert "[b]" not in result

tests/test_process_readme.py

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,28 @@
11
import os
2-
import sys
3-
4-
# Add the src directory to sys.path
5-
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')))
62

73
from md2bbcode.main import process_readme
84

5+
96
def test_conversion():
10-
# Read the README.md content from the local file
11-
readme_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'README.md'))
12-
with open(readme_path, 'r', encoding='utf-8') as file:
7+
readme_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "README.md"))
8+
with open(readme_path, "r", encoding="utf-8") as file:
139
markdown_content = file.read()
1410

15-
domain = '' # Set domain if needed
16-
debug_mode = False # Set to True to generate debug files
17-
18-
# Call the process_readme function with the Markdown content
19-
result = process_readme(markdown_content, domain, debug=debug_mode)
11+
result = process_readme(markdown_content, domain="")
2012

21-
# Perform assertions to validate the output
2213
assert result is not None
2314
assert isinstance(result, str)
24-
25-
# Check for the presence of specific BBCode elements from the new README content
15+
2616
expected_bbcodes = [
2717
"[img alt",
2818
"[icode]",
2919
"[HEADING=1]",
3020
"[b]",
3121
"[HEADING=2]",
32-
"[CODE=bash]"
22+
"[CODE=bash]",
23+
"[sup]superscript[/sup]",
3324
]
34-
25+
26+
lowered = result.lower()
3527
for bbcode in expected_bbcodes:
36-
assert bbcode in result, f"Expected BBCode not found: {bbcode}"
28+
assert bbcode.lower() in lowered, f"Expected BBCode not found: {bbcode}"

tests/test_redguides_bbcodes.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import os
2+
import xml.etree.ElementTree as ET
3+
4+
from md2bbcode.main import process_readme
5+
6+
7+
def test_redguides_specific_bbcodes_from_xml():
8+
repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
9+
bbcode_xml_path = os.path.join(repo_root, "bb_codes.xml")
10+
11+
tree = ET.parse(bbcode_xml_path)
12+
root = tree.getroot()
13+
bbcode_defs = [
14+
(el.attrib["bb_code_id"].strip().lower(), el.attrib.get("has_option", "no").strip().lower())
15+
for el in root.findall(".//bb_code")
16+
]
17+
18+
# Markdown that exercises every BBCode defined in bb_codes.xml.
19+
markdown = """
20+
Some ==highlighted== text and a footnote.[^1]
21+
22+
![pixel art](https://example.com/pixel.png)
23+
24+
> [!TIP]
25+
> A GitHub-style alert should become a custom BBCode.
26+
27+
---
28+
29+
Water is H<sub>2</sub>O.
30+
31+
The HTML specification is maintained by the W3C.
32+
33+
*[HTML]: Hyper Text Markup Language
34+
*[W3C]: World Wide Web Consortium
35+
36+
[^1]: This is the footnote.
37+
""".lstrip()
38+
39+
result = process_readme(markdown, domain="")
40+
assert result is not None
41+
assert isinstance(result, str)
42+
43+
lowered = result.lower()
44+
45+
for bb_code_id, has_option in bbcode_defs:
46+
if has_option == "yes":
47+
assert f"[{bb_code_id}=" in lowered, f"Expected BBCode tag not found: [{bb_code_id}=...]"
48+
elif has_option == "optional":
49+
assert (
50+
f"[{bb_code_id}=" in lowered or f"[{bb_code_id}]" in lowered
51+
), f"Expected BBCode tag not found: [{bb_code_id}] or [{bb_code_id}=...]"
52+
else:
53+
assert f"[{bb_code_id}]" in lowered, f"Expected BBCode tag not found: [{bb_code_id}]"
54+

tests/test_svg_rewrite.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from urllib.parse import quote
2+
3+
from md2bbcode.main import process_readme
4+
5+
6+
def test_github_actions_badge_rewrites_to_png():
7+
markdown = (
8+
"[![Publish to PyPI](https://github.com/RedGuides/md2bbcode/actions/workflows/publish.yml/badge.svg)]"
9+
"(https://github.com/RedGuides/md2bbcode/actions/workflows/publish.yml)"
10+
)
11+
result = process_readme(markdown, domain="")
12+
lowered = result.lower()
13+
14+
assert "[url=https://github.com/redguides/md2bbcode/actions/workflows/publish.yml]" in lowered
15+
assert (
16+
"https://raster.shields.io/github/actions/workflow/status/redguides/md2bbcode/publish.yml.png"
17+
in lowered
18+
)
19+
20+
21+
def test_html_svg_wraps_weserv():
22+
svg_url = "https://example.com/asset.svg?x=1&y=2"
23+
markdown = f'<img src="{svg_url}" alt="Alt text">'
24+
result = process_readme(markdown, domain="")
25+
lowered = result.lower()
26+
27+
expected = f"https://images.weserv.nl/?url={quote(svg_url, safe='')}&output=png"
28+
assert expected.lower() in lowered
29+
assert '[img alt="alt text"]' in lowered
30+
31+
32+
def test_redguides_sparkline_adds_png_format():
33+
sparkline_url = (
34+
"https://www.redguides.com/community/resources/ghoul-resource.1623/watchers-sparkline"
35+
"?months=24&w=500&h=180"
36+
)
37+
markdown = f'<img src="{sparkline_url}" alt="Watchers">'
38+
result = process_readme(markdown, domain="")
39+
lowered = result.lower()
40+
41+
assert "watchers-sparkline?months=24&w=500&h=180&format=png" in lowered
42+
43+
44+
def test_non_svg_image_unchanged():
45+
png_url = "https://example.com/x.png"
46+
markdown = f"![alt]({png_url})"
47+
result = process_readme(markdown, domain="")
48+
lowered = result.lower()
49+
50+
assert png_url in lowered

0 commit comments

Comments
 (0)