1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
import os
from markdown_it import MarkdownIt
import pytest
import mdformat
from mdformat._util import is_md_equal
from mdformat.renderer import MDRenderer
UNFORMATTED_MARKDOWN = "\n\n# A header\n\n"
FORMATTED_MARKDOWN = "# A header\n"
def test_fmt_file(tmp_path):
file_path = tmp_path / "test_markdown.md"
# Use string argument
file_path.write_text(UNFORMATTED_MARKDOWN)
mdformat.file(str(file_path))
assert file_path.read_text() == FORMATTED_MARKDOWN
# Use pathlib.Path argument
file_path.write_text(UNFORMATTED_MARKDOWN)
mdformat.file(file_path)
assert file_path.read_text() == FORMATTED_MARKDOWN
def test_fmt_file__invalid_filename():
with pytest.raises(ValueError) as exc_info:
mdformat.file("this is not a valid filepath?`=|><@{[]\\/,.%ยค#'")
assert "not a file" in str(exc_info.value)
def test_fmt_file__symlink(tmp_path):
file_path = tmp_path / "test_markdown.md"
file_path.write_text(UNFORMATTED_MARKDOWN)
symlink_path = tmp_path / "symlink.md"
symlink_path.symlink_to(file_path)
with pytest.raises(ValueError) as exc_info:
mdformat.file(symlink_path)
assert "It is a symlink" in str(exc_info.value)
def test_fmt_string():
assert mdformat.text(UNFORMATTED_MARKDOWN) == FORMATTED_MARKDOWN
@pytest.mark.parametrize(
"input_",
[
pytest.param("\x0b"), # vertical tab only
pytest.param("\t##"), # no trailing newline in codeblock
pytest.param("a\n\n\xa0\n\nb"), # lone NBSP between two paragraphs
pytest.param("\xa0\n\n# heading"), # lone NBSP followed by a heading
pytest.param(
"```\na\n```\n\u2003\n# A\n"
), # em space surrounded by code and header
],
)
def test_output_is_equal(input_):
output = mdformat.text(input_)
assert is_md_equal(input_, output)
@pytest.mark.parametrize(
"input_",
[
pytest.param("\x1c\n\na"),
pytest.param(">\x0b"),
pytest.param("<!K"),
],
)
def test_cases_found_by_fuzzer(input_):
output = mdformat.text(input_)
assert is_md_equal(input_, output)
def test_api_options():
non_numbered = """\
0. a
0. b
0. c
"""
numbered = """\
0. a
1. b
2. c
"""
assert mdformat.text(non_numbered, options={"number": True}) == numbered
def test_eol__lf(tmp_path):
file_path = tmp_path / "test.md"
file_path.write_bytes(b"Oi\r\n")
mdformat.file(str(file_path))
assert file_path.read_bytes() == b"Oi\n"
def test_eol__crlf(tmp_path):
file_path = tmp_path / "test.md"
file_path.write_bytes(b"Oi\n")
mdformat.file(str(file_path), options={"end_of_line": "crlf"})
assert file_path.read_bytes() == b"Oi\r\n"
def test_eol__keep_lf(tmp_path):
file_path = tmp_path / "test.md"
file_path.write_bytes(b"Oi\n")
mdformat.file(str(file_path), options={"end_of_line": "keep"})
assert file_path.read_bytes() == b"Oi\n"
def test_eol__keep_crlf(tmp_path):
file_path = tmp_path / "test.md"
file_path.write_bytes(b"Oi\r\n")
mdformat.file(str(file_path), options={"end_of_line": "keep"})
assert file_path.read_bytes() == b"Oi\r\n"
def test_no_timestamp_modify(tmp_path):
file_path = tmp_path / "test.md"
file_path.write_bytes(b"lol\n")
initial_access_time = 0
initial_mod_time = 0
os.utime(file_path, (initial_access_time, initial_mod_time))
# Assert that modification time does not change when no changes are applied
mdformat.file(file_path)
assert os.path.getmtime(file_path) == initial_mod_time
def test_mdrenderer_no_finalize(tmp_path):
mdit = MarkdownIt()
mdit.options["store_labels"] = True
env: dict = {}
tokens = mdit.parse(
"[gl ref]: https://gitlab.com\n\nHere's a link to [GitLab][gl ref]", env
)
unfinalized = MDRenderer().render(tokens, {}, env, finalize=False)
finalized = MDRenderer().render(tokens, {}, env)
assert finalized == unfinalized + "\n\n[gl ref]: https://gitlab.com\n"
def test_import_typing():
"""Try to import mdformat.renderer.typing.
The module consists of annotation types only, so mdformat never
imports it at runtime. This test ensures that it still runs.
"""
import mdformat.renderer.typing # noqa: F401
|