from pathlib import Path import sys import unittest sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import check_conventions FENCE = "`" * 3 class DocLinkTests(unittest.TestCase): def test_angle_destinations_resolve_paths_without_the_delimiters(self): cases = ( ("../README.md", "README.md"), ("guide with spaces).md", "docs/guide with spaces).md"), ("part%23one.md#details", "docs/part#one.md"), ("guide.md?plain=1#details", "docs/guide.md"), ("/README.md", "README.md"), ) for target, resolved in cases: for suffix in ("", ' "Guide"', " 'Guide'", " (Guide)"): with self.subTest(target=target, suffix=suffix): text = f"[guide](<{target}>{suffix})" expected = target.split("#", 1)[0].split("?", 1)[0] self.assertEqual(check_conventions.links("docs/x.md", text), [(expected, resolved)]) def test_angle_absolute_urls_fragments_and_empty_destinations_are_ignored(self): for target in ("https://example.test/guide", "HTTPS://example.test/a b)", "mailto:person@example.test", "//example.test/guide", "#details", ""): with self.subTest(target=target): self.assertEqual(check_conventions.links("docs/x.md", f"[guide](<{target}>)"), []) def test_angle_links_inside_code_are_ignored(self): text = f"`[guide]()`\n{FENCE}\n[guide]()\n{FENCE}\n" self.assertEqual(check_conventions.links("docs/x.md", text), []) def test_bare_destinations_keep_embedded_angle_characters(self): for target in ("part>one.md", "part