| 1256 | |
| 1257 | |
| 1258 | class FetchDiffRefsTest(unittest.TestCase): |
| 1259 | API_BASE = "https://gitlab.example/api/v4/projects/1/merge_requests/2" |
| 1260 | TOKEN = "test-token" |
| 1261 | AUTH_HEADER = "PRIVATE-TOKEN" |
| 1262 | |
| 1263 | def test_success(self): |
| 1264 | body = json.dumps([{ |
| 1265 | "base_commit_sha": "aaa", "start_commit_sha": "bbb", "head_commit_sha": "ccc", |
| 1266 | }]).encode() |
| 1267 | with mock.patch.object(pr.urllib.request, "urlopen", |
| 1268 | lambda req, timeout=None: FakeResponse(body)), \ |
| 1269 | mock.patch.object(pr, "_sleep", lambda _s: None): |
| 1270 | refs = pr.fetch_diff_refs(self.API_BASE, self.TOKEN, self.AUTH_HEADER, DEFAULT_CONFIG) |
| 1271 | self.assertEqual(refs, {"base_sha": "aaa", "start_sha": "bbb", "head_sha": "ccc"}) |
| 1272 | |
| 1273 | def test_returns_none_on_failure(self): |
| 1274 | with mock.patch.object(pr.urllib.request, "urlopen", |
| 1275 | lambda req, timeout=None: (_ for _ in ()).throw(http_error(404, b"not found"))), \ |
| 1276 | mock.patch.object(pr, "_sleep", lambda _s: None): |
| 1277 | refs = pr.fetch_diff_refs(self.API_BASE, self.TOKEN, self.AUTH_HEADER, DEFAULT_CONFIG) |
| 1278 | self.assertIsNone(refs) |
| 1279 | |
| 1280 | def test_returns_none_on_empty_versions(self): |
| 1281 | with mock.patch.object(pr.urllib.request, "urlopen", |
| 1282 | lambda req, timeout=None: FakeResponse(b"[]")), \ |
| 1283 | mock.patch.object(pr, "_sleep", lambda _s: None): |
| 1284 | refs = pr.fetch_diff_refs(self.API_BASE, self.TOKEN, self.AUTH_HEADER, DEFAULT_CONFIG) |
| 1285 | self.assertIsNone(refs) |
| 1286 | |
| 1287 | def test_uses_retry_on_transient(self): |
| 1288 | body = json.dumps([{ |
| 1289 | "base_commit_sha": "aaa", "start_commit_sha": "bbb", "head_commit_sha": "ccc", |
| 1290 | }]).encode() |
| 1291 | calls = {"n": 0} |
| 1292 | |
| 1293 | def fake_urlopen(req, timeout=None): |
| 1294 | calls["n"] += 1 |
| 1295 | if calls["n"] == 1: |
| 1296 | raise http_error(500, b"server error") |
| 1297 | return FakeResponse(body) |
| 1298 | |
| 1299 | with mock.patch.object(pr.urllib.request, "urlopen", fake_urlopen), \ |
| 1300 | mock.patch.object(pr, "_sleep", lambda _s: None), \ |
| 1301 | mock.patch.object(pr.random, "random", lambda: 0.5): |
| 1302 | refs = pr.fetch_diff_refs(self.API_BASE, self.TOKEN, self.AUTH_HEADER, DEFAULT_CONFIG) |
| 1303 | self.assertEqual(calls["n"], 2) |
| 1304 | self.assertIsNotNone(refs) |
| 1305 | |
| 1306 | def _versions(self, *triples): |
| 1307 | # triples: (base, start, head, [created_at]) |
| 1308 | return [{ |
| 1309 | "base_commit_sha": t[0], "start_commit_sha": t[1], |
| 1310 | "head_commit_sha": t[2], |
| 1311 | **({"created_at": t[3]} if len(t) > 3 else {}), |
| 1312 | } for t in triples] |
| 1313 | |
| 1314 | def test_picks_version_matching_expected_head(self): |
| 1315 | versions = self._versions( |
nothing calls this directly
no outgoing calls
no test coverage detected