11import importlib .util
22from pathlib import Path
33
4+ import pytest
5+
46SCRIPT_PATH = Path (__file__ ).resolve ().parents [1 ] / "scripts" / "prepare_readme.py"
57SPEC = importlib .util .spec_from_file_location ("prepare_readme" , SCRIPT_PATH )
68if SPEC is None or SPEC .loader is None :
79 raise ImportError (f"Unable to load prepare_readme from { SCRIPT_PATH } " )
810prepare_readme = importlib .util .module_from_spec (SPEC )
911SPEC .loader .exec_module (prepare_readme )
1012
13+ BASE_URL = "https://example.com/blob/main/"
14+
1115
1216def test_rewrite_relative_links_keeps_absolute () -> None :
13- base_url = "https://example.com/blob/main/"
1417 contents = "[Migration](MIGRATION.md)\n [Docs](https://docs.mistral.ai)"
1518 expected = (
16- "[Migration](https://example.com/blob/main/ MIGRATION.md)\n "
19+ f "[Migration]({ BASE_URL } MIGRATION.md)\n "
1720 "[Docs](https://docs.mistral.ai)"
1821 )
19- assert prepare_readme .rewrite_relative_links (contents , base_url ) == expected
22+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == expected
23+
24+
25+ def test_rewrite_relative_links_keeps_http () -> None :
26+ contents = "[Site](http://example.com)"
27+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == contents
2028
2129
2230def test_rewrite_relative_links_keeps_anchors () -> None :
23- base_url = "https://example.com/blob/main/"
2431 contents = "[Retries](#retries)\n [File](docs/README.md#upload)"
2532 expected = (
2633 "[Retries](#retries)\n "
27- "[File](https://example.com/blob/main/docs/README.md#upload)"
34+ f"[File]({ BASE_URL } docs/README.md#upload)"
35+ )
36+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == expected
37+
38+
39+ def test_rewrite_relative_links_keeps_mailto () -> None :
40+ contents = "[Email](mailto:user@example.com)"
41+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == contents
42+
43+
44+ def test_rewrite_relative_links_keeps_ftp () -> None :
45+ contents = "[FTP](ftp://files.example.com/data)"
46+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == contents
47+
48+
49+ def test_rewrite_strips_leading_dot_slash () -> None :
50+ contents = "[Errors](./src/errors.py)"
51+ expected = f"[Errors]({ BASE_URL } src/errors.py)"
52+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == expected
53+
54+
55+ def test_rewrite_strips_leading_slash () -> None :
56+ contents = "[Examples](/examples/azure)"
57+ expected = f"[Examples]({ BASE_URL } examples/azure)"
58+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == expected
59+
60+
61+ def test_rewrite_multiple_links_same_line () -> None :
62+ contents = "[A](a.md) and [B](b.md)"
63+ expected = f"[A]({ BASE_URL } a.md) and [B]({ BASE_URL } b.md)"
64+ assert prepare_readme .rewrite_relative_links (contents , BASE_URL ) == expected
65+
66+
67+ def test_build_base_url_strips_git_suffix () -> None :
68+ url = prepare_readme .build_base_url (
69+ "https://github.com/org/repo.git" , "main" , ""
2870 )
29- assert prepare_readme . rewrite_relative_links ( contents , base_url ) == expected
71+ assert url == "https://github.com/org/repo/blob/main/"
3072
3173
32- def test_main_prints_rewritten_readme_with_defaults (tmp_path , capsys ) -> None :
74+ def test_build_base_url_no_git_suffix () -> None :
75+ url = prepare_readme .build_base_url (
76+ "https://github.com/org/repo" , "main" , ""
77+ )
78+ assert url == "https://github.com/org/repo/blob/main/"
79+
80+
81+ def test_build_base_url_with_subdir () -> None :
82+ url = prepare_readme .build_base_url (
83+ "https://github.com/org/repo.git" , "main" , "packages/azure"
84+ )
85+ assert url == "https://github.com/org/repo/blob/main/packages/azure/"
86+
87+
88+ def test_build_base_url_strips_subdir_slashes () -> None :
89+ url = prepare_readme .build_base_url (
90+ "https://github.com/org/repo.git" , "main" , "/packages/azure/"
91+ )
92+ assert url == "https://github.com/org/repo/blob/main/packages/azure/"
93+
94+
95+ def test_run_with_rewritten_readme_restores_on_success (tmp_path : Path ) -> None :
96+ readme = tmp_path / "README.md"
97+ original = "[Link](file.md)\n "
98+ readme .write_text (original , encoding = "utf-8" )
99+
100+ exit_code = prepare_readme .run_with_rewritten_readme (
101+ readme , BASE_URL , ["echo" , "hello" ]
102+ )
103+
104+ assert exit_code == 0
105+ assert readme .read_text (encoding = "utf-8" ) == original
106+
107+
108+ def test_run_with_rewritten_readme_restores_on_failure (tmp_path : Path ) -> None :
109+ readme = tmp_path / "README.md"
110+ original = "[Link](file.md)\n "
111+ readme .write_text (original , encoding = "utf-8" )
112+
113+ exit_code = prepare_readme .run_with_rewritten_readme (
114+ readme , BASE_URL , ["false" ]
115+ )
116+
117+ assert exit_code != 0
118+ assert readme .read_text (encoding = "utf-8" ) == original
119+
120+
121+ def test_main_prints_rewritten_readme_with_defaults (
122+ tmp_path : Path , capsys : pytest .CaptureFixture [str ]
123+ ) -> None :
33124 original = "[Migration](MIGRATION.md)\n "
34125 base_url = prepare_readme .build_base_url (
35126 prepare_readme .DEFAULT_REPO_URL ,
@@ -45,3 +136,15 @@ def test_main_prints_rewritten_readme_with_defaults(tmp_path, capsys) -> None:
45136 captured = capsys .readouterr ()
46137 assert exit_code == 0
47138 assert captured .out == expected
139+
140+
141+ def test_main_missing_readme_returns_error (
142+ tmp_path : Path , capsys : pytest .CaptureFixture [str ]
143+ ) -> None :
144+ readme_path = tmp_path / "MISSING.md"
145+
146+ exit_code = prepare_readme .main (["--readme" , str (readme_path )])
147+
148+ assert exit_code == 1
149+ captured = capsys .readouterr ()
150+ assert "Error" in captured .err
0 commit comments