|
34 | 34 | email_in_submitter_allowlist,
|
35 | 35 | EmailBodyContext,
|
36 | 36 | furnish_ci_email_body,
|
| 37 | + parse_pr_ref, |
37 | 38 | same_series_different_target,
|
38 | 39 | temporary_patch_file,
|
39 | 40 | UPSTREAM_REMOTE_NAME,
|
@@ -1400,3 +1401,109 @@ def test_email_submitter_not_in_allowlist_and_allowlist_disabled(self):
|
1400 | 1401 | )
|
1401 | 1402 | self.assertEqual(expected_cmd, cmd)
|
1402 | 1403 | self.assertEqual(expected_email, email)
|
| 1404 | + |
| 1405 | + |
| 1406 | +class TestParsePrRef(unittest.TestCase): |
| 1407 | + def test_parse_pr_ref_comprehensive(self): |
| 1408 | + test_cases = [ |
| 1409 | + ( |
| 1410 | + "series/123456=>main", |
| 1411 | + {"series": "series/123456", "series_id": 123456, "target": "main"}, |
| 1412 | + ), |
| 1413 | + ( |
| 1414 | + "patch/789=>bpf-next", |
| 1415 | + {"series": "patch/789", "series_id": 789, "target": "bpf-next"}, |
| 1416 | + ), |
| 1417 | + ("series/42", {"series": "series/42", "series_id": 42}), |
| 1418 | + ("series/abc=>target", {"series": "series/abc", "target": "target"}), |
| 1419 | + ( |
| 1420 | + "series/999=>feature/branch-name", |
| 1421 | + { |
| 1422 | + "series": "series/999", |
| 1423 | + "series_id": 999, |
| 1424 | + "target": "feature/branch-name", |
| 1425 | + }, |
| 1426 | + ), |
| 1427 | + ("", {"series": ""}), |
| 1428 | + ("=>", {"series": "", "target": ""}), |
| 1429 | + ("series", {"series": "series"}), |
| 1430 | + ("=>target", {"series": "", "target": "target"}), |
| 1431 | + ( |
| 1432 | + "series/123=>target=>extra", |
| 1433 | + {"series": "series/123", "series_id": 123, "target": "target=>extra"}, |
| 1434 | + ), |
| 1435 | + ( |
| 1436 | + "path/to/series/456=>target", |
| 1437 | + {"series": "path/to/series/456", "target": "target"}, |
| 1438 | + ), |
| 1439 | + ("series/abc123=>target", {"series": "series/abc123", "target": "target"}), |
| 1440 | + ("series/123abc=>target", {"series": "series/123abc", "target": "target"}), |
| 1441 | + ( |
| 1442 | + " series/123=>target ", |
| 1443 | + {"series": " series/123", "series_id": 123, "target": "target "}, |
| 1444 | + ), |
| 1445 | + ( |
| 1446 | + "series/1=>target", |
| 1447 | + {"series": "series/1", "series_id": 1, "target": "target"}, |
| 1448 | + ), |
| 1449 | + ( |
| 1450 | + "series/007=>target", |
| 1451 | + {"series": "series/007", "series_id": 7, "target": "target"}, |
| 1452 | + ), |
| 1453 | + ( |
| 1454 | + "series/000=>target", |
| 1455 | + {"series": "series/000", "series_id": 0, "target": "target"}, |
| 1456 | + ), |
| 1457 | + ("series/12a34=>target", {"series": "series/12a34", "target": "target"}), |
| 1458 | + ("series/a1234=>target", {"series": "series/a1234", "target": "target"}), |
| 1459 | + ("series/abc=>target", {"series": "series/abc", "target": "target"}), |
| 1460 | + ("series/=>target", {"series": "series/", "target": "target"}), |
| 1461 | + ( |
| 1462 | + "path/123/series/456=>target", |
| 1463 | + {"series": "path/123/series/456", "target": "target"}, |
| 1464 | + ), |
| 1465 | + ("series/123!@#=>target", {"series": "series/123!@#", "target": "target"}), |
| 1466 | + ( |
| 1467 | + "série/123=>tärget", |
| 1468 | + {"series": "série/123", "series_id": 123, "target": "tärget"}, |
| 1469 | + ), |
| 1470 | + ( |
| 1471 | + "series/999999999999999999999=>target", |
| 1472 | + { |
| 1473 | + "series": "series/999999999999999999999", |
| 1474 | + "series_id": 999999999999999999999, |
| 1475 | + "target": "target", |
| 1476 | + }, |
| 1477 | + ), |
| 1478 | + ("series/-123=>target", {"series": "series/-123", "target": "target"}), |
| 1479 | + ( |
| 1480 | + "series/0=>target", |
| 1481 | + {"series": "series/0", "series_id": 0, "target": "target"}, |
| 1482 | + ), |
| 1483 | + ("series/123.45=>target", {"series": "series/123.45", "target": "target"}), |
| 1484 | + ("series/1e5=>target", {"series": "series/1e5", "target": "target"}), |
| 1485 | + ("\n\r\t", {"series": "\n\r\t"}), |
| 1486 | + ("/" * 100, {"series": "/" * 100}), |
| 1487 | + ] |
| 1488 | + |
| 1489 | + def validate_parsed_pr_ref(ref): |
| 1490 | + self.assertIsInstance(ref, dict) |
| 1491 | + self.assertIn("series", ref) |
| 1492 | + self.assertIsInstance(ref["series"], str) |
| 1493 | + if "target" in ref: |
| 1494 | + self.assertIsInstance(ref["target"], str) |
| 1495 | + if "series_id" in ref: |
| 1496 | + self.assertIsInstance(ref["series_id"], int) |
| 1497 | + valid_keys = {"series", "target", "series_id"} |
| 1498 | + self.assertTrue(set(result.keys()).issubset(valid_keys)) |
| 1499 | + |
| 1500 | + for test_input, expected in test_cases: |
| 1501 | + with self.subTest(input=test_input): |
| 1502 | + try: |
| 1503 | + result = parse_pr_ref(test_input) |
| 1504 | + validate_parsed_pr_ref(result) |
| 1505 | + self.assertEqual(result, expected) |
| 1506 | + except Exception as e: |
| 1507 | + self.fail( |
| 1508 | + f"parse_pr_ref raised {type(e).__name__} for input '{test_input}': {e}" |
| 1509 | + ) |
0 commit comments