|
1 | | -from unittest.mock import MagicMock, patch |
2 | | - |
3 | 1 | import pytest |
4 | | -import requests |
5 | | -import semver |
6 | 2 |
|
7 | | -from comfy_cli.command.install import ( |
8 | | - GithubRelease, |
9 | | - fetch_github_releases, |
10 | | - parse_releases, |
11 | | - select_version, |
12 | | - validate_version, |
13 | | -) |
| 3 | +from comfy_cli.command.install import validate_version |
14 | 4 |
|
15 | 5 |
|
16 | 6 | def test_validate_version_nightly(): |
@@ -39,166 +29,6 @@ def test_validate_version_empty(): |
39 | 29 | validate_version("") |
40 | 30 |
|
41 | 31 |
|
42 | | -# Tests for fetch_github_releases function |
43 | | -@patch("requests.get") |
44 | | -def test_fetch_releases_success(mock_get): |
45 | | - # Mock the response |
46 | | - mock_response = MagicMock() |
47 | | - mock_response.json.return_value = [{"id": 1, "tag_name": "v1.0.0"}, {"id": 2, "tag_name": "v1.1.0"}] |
48 | | - mock_get.return_value = mock_response |
49 | | - |
50 | | - releases = fetch_github_releases("owner", "repo") |
51 | | - |
52 | | - assert len(releases) == 2 |
53 | | - assert releases[0]["tag_name"] == "v1.0.0" |
54 | | - assert releases[1]["tag_name"] == "v1.1.0" |
55 | | - mock_get.assert_called_once_with("https://api.github.com/repos/owner/repo/releases", headers={}, timeout=5) |
56 | | - |
57 | | - |
58 | | -@patch("requests.get") |
59 | | -def test_fetch_releases_empty(mock_get): |
60 | | - # Mock an empty response |
61 | | - mock_response = MagicMock() |
62 | | - mock_response.json.return_value = [] |
63 | | - mock_get.return_value = mock_response |
64 | | - |
65 | | - releases = fetch_github_releases("owner", "repo") |
66 | | - |
67 | | - assert len(releases) == 0 |
68 | | - |
69 | | - |
70 | | -@patch("requests.get") |
71 | | -def test_fetch_releases_error(mock_get): |
72 | | - # Mock a request exception |
73 | | - mock_get.side_effect = requests.RequestException("API error") |
74 | | - |
75 | | - with pytest.raises(requests.RequestException): |
76 | | - fetch_github_releases("owner", "repo") |
77 | | - |
78 | | - |
79 | | -def test_parse_releases_with_semver(): |
80 | | - input_releases = [ |
81 | | - {"tag_name": "v1.2.3", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/v1.2.3"}, |
82 | | - {"tag_name": "2.0.0", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/2.0.0"}, |
83 | | - ] |
84 | | - |
85 | | - result = parse_releases(input_releases) |
86 | | - |
87 | | - assert len(result) == 2 |
88 | | - assert result[0]["version"] == semver.VersionInfo.parse("1.2.3") |
89 | | - assert result[0]["tag"] == "v1.2.3" |
90 | | - assert result[0]["download_url"] == "https://api.github.com/repos/owner/repo/zipball/v1.2.3" |
91 | | - assert result[1]["version"] == semver.VersionInfo.parse("2.0.0") |
92 | | - assert result[1]["tag"] == "2.0.0" |
93 | | - |
94 | | - |
95 | | -def test_parse_releases_with_special_tags(): |
96 | | - input_releases = [ |
97 | | - {"tag_name": "latest", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/latest"}, |
98 | | - {"tag_name": "nightly", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/nightly"}, |
99 | | - ] |
100 | | - |
101 | | - result = parse_releases(input_releases) |
102 | | - |
103 | | - assert len(result) == 2 |
104 | | - assert result[0]["version"] is None |
105 | | - assert result[0]["tag"] == "latest" |
106 | | - assert result[1]["version"] is None |
107 | | - assert result[1]["tag"] == "nightly" |
108 | | - |
109 | | - |
110 | | -def test_parse_releases_mixed(): |
111 | | - input_releases = [ |
112 | | - {"tag_name": "v1.0.0", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/v1.0.0"}, |
113 | | - {"tag_name": "latest", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/latest"}, |
114 | | - {"tag_name": "2.0.0-beta", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/2.0.0-beta"}, |
115 | | - ] |
116 | | - |
117 | | - result = parse_releases(input_releases) |
118 | | - |
119 | | - assert len(result) == 3 |
120 | | - assert result[0]["version"] == semver.VersionInfo.parse("1.0.0") |
121 | | - assert result[1]["version"] is None |
122 | | - assert result[1]["tag"] == "latest" |
123 | | - assert result[2]["version"] == semver.VersionInfo.parse("2.0.0-beta") |
124 | | - |
125 | | - |
126 | | -def test_parse_releases_empty_list(): |
127 | | - input_releases: list[dict[str, str]] = [] |
128 | | - |
129 | | - result = parse_releases(input_releases) |
130 | | - |
131 | | - assert len(result) == 0 |
132 | | - |
133 | | - |
134 | | -def test_parse_releases_invalid_semver(): |
135 | | - input_releases = [ |
136 | | - {"tag_name": "invalid", "zipball_url": "https://api.github.com/repos/owner/repo/zipball/invalid"}, |
137 | | - ] |
138 | | - |
139 | | - with pytest.raises(ValueError): |
140 | | - parse_releases(input_releases) |
141 | | - |
142 | | - |
143 | | -# Sample data for tests |
144 | | -sample_releases: list[GithubRelease] = [ |
145 | | - {"version": semver.VersionInfo.parse("1.0.0"), "tag": "v1.0.0", "download_url": "url1"}, |
146 | | - {"version": semver.VersionInfo.parse("1.1.0"), "tag": "v1.1.0", "download_url": "url2"}, |
147 | | - {"version": semver.VersionInfo.parse("2.0.0"), "tag": "v2.0.0", "download_url": "url3"}, |
148 | | - {"version": None, "tag": "latest", "download_url": "url_latest"}, |
149 | | - {"version": None, "tag": "nightly", "download_url": "url_nightly"}, |
150 | | -] |
151 | | - |
152 | | - |
153 | | -def test_select_version_latest(): |
154 | | - result = select_version(sample_releases, "latest") |
155 | | - assert result is not None |
156 | | - assert result["tag"] == "latest" |
157 | | - assert result["download_url"] == "url_latest" |
158 | | - |
159 | | - |
160 | | -def test_select_version_specific(): |
161 | | - result = select_version(sample_releases, "1.1.0") |
162 | | - assert result is not None |
163 | | - assert result["version"] == semver.VersionInfo.parse("1.1.0") |
164 | | - assert result["tag"] == "v1.1.0" |
165 | | - |
166 | | - |
167 | | -def test_select_version_with_v_prefix(): |
168 | | - result = select_version(sample_releases, "v2.0.0") |
169 | | - assert result is not None |
170 | | - assert result["version"] == semver.VersionInfo.parse("2.0.0") |
171 | | - assert result["tag"] == "v2.0.0" |
172 | | - |
173 | | - |
174 | | -def test_select_version_nonexistent(): |
175 | | - result = select_version(sample_releases, "3.0.0") |
176 | | - assert result is None |
177 | | - |
178 | | - |
179 | | -def test_select_version_invalid(): |
180 | | - result = select_version(sample_releases, "invalid_version") |
181 | | - assert result is None |
182 | | - |
183 | | - |
184 | | -def test_select_version_case_insensitive_latest(): |
185 | | - result = select_version(sample_releases, "LATEST") |
186 | | - assert result is not None |
187 | | - assert result["tag"] == "latest" |
188 | | - |
189 | | - |
190 | | -def test_select_version_nightly(): |
191 | | - # Note: This test will fail with the current implementation |
192 | | - # as it doesn't handle "nightly" specifically |
193 | | - result = select_version(sample_releases, "nightly") |
194 | | - assert result is None # or assert result is not None if you want to handle nightly |
195 | | - |
196 | | - |
197 | | -def test_select_version_empty_list(): |
198 | | - result = select_version([], "1.0.0") |
199 | | - assert result is None |
200 | | - |
201 | | - |
202 | 32 | # Run the tests |
203 | 33 | if __name__ == "__main__": |
204 | 34 | pytest.main([__file__]) |
0 commit comments