diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index bd31b59ff2f..b511e5bc362 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -1375,3 +1375,24 @@ def __call__( CertFactory = Callable[[], str] + +# versions containing fix/backport from https://github.com/python/cpython/pull/113563 +# which changed the behavior of `urllib.parse.urlun{parse,split}` +has_new_urlun_behavior = ( + # https://github.com/python/cpython/commit/387ff96e95b9f8a8cc7e646523ba3175b1350669 + (sys.version_info[:2] == (3, 12) and sys.version_info >= (3, 12, 4)) + or + # https://github.com/python/cpython/commit/872000606271c52d989e53fe4cc9904343d81855 + (sys.version_info[:2] == (3, 13) and sys.version_info >= (3, 13, 0, "beta", 3)) +) + +# the above change seems to only impact tests on Windows, so just add skips for that +skipif_new_urlun_behavior_win = pytest.mark.skipif( + sys.platform == "win32" and has_new_urlun_behavior, + reason="testing windows behavior on newer CPython", +) + +skipif_old_urlun_behavior_win = pytest.mark.skipif( + sys.platform == "win32" and not has_new_urlun_behavior, + reason="testing windows behavior on older CPython", +) diff --git a/tests/unit/test_collector.py b/tests/unit/test_collector.py index e34104707ba..db141a7dd60 100644 --- a/tests/unit/test_collector.py +++ b/tests/unit/test_collector.py @@ -35,7 +35,12 @@ _ensure_quoted_url, ) from pip._internal.network.session import PipSession -from tests.lib import TestData, make_test_link_collector +from tests.lib import ( + TestData, + make_test_link_collector, + skipif_new_urlun_behavior_win, + skipif_old_urlun_behavior_win, +) ACCEPT = ", ".join( [ @@ -383,10 +388,12 @@ def test_clean_url_path_with_local_path(path: str, expected: str) -> None: pytest.param( "file:///T:/path/with spaces/", "file:///T:/path/with%20spaces", - marks=pytest.mark.skipif( - "sys.platform != 'win32' or " - "sys.version_info == (3, 13, 0, 'beta', 2)" - ), + marks=skipif_new_urlun_behavior_win, + ), + pytest.param( + "file:///T:/path/with spaces/", + "file://///T:/path/with%20spaces", + marks=skipif_old_urlun_behavior_win, ), # URL with Windows drive letter, running on non-windows # platform. The `:` after the drive should be quoted. @@ -399,10 +406,12 @@ def test_clean_url_path_with_local_path(path: str, expected: str) -> None: pytest.param( "git+file:///T:/with space/repo.git@1.0#egg=my-package-1.0", "git+file:///T:/with%20space/repo.git@1.0#egg=my-package-1.0", - marks=pytest.mark.skipif( - "sys.platform != 'win32' or " - "sys.version_info == (3, 13, 0, 'beta', 2)" - ), + marks=skipif_new_urlun_behavior_win, + ), + pytest.param( + "git+file:///T:/with space/repo.git@1.0#egg=my-package-1.0", + "git+file://///T:/with%20space/repo.git@1.0#egg=my-package-1.0", + marks=skipif_old_urlun_behavior_win, ), # Test a VCS URL with a Windows drive letter and revision, # running on non-windows platform. diff --git a/tests/unit/test_urls.py b/tests/unit/test_urls.py index ba6bc6092a5..c160ba87512 100644 --- a/tests/unit/test_urls.py +++ b/tests/unit/test_urls.py @@ -5,6 +5,7 @@ import pytest from pip._internal.utils.urls import path_to_url, url_to_path +from tests.lib import skipif_new_urlun_behavior_win, skipif_old_urlun_behavior_win @pytest.mark.skipif("sys.platform == 'win32'") @@ -23,12 +24,14 @@ def test_path_to_url_unix() -> None: pytest.param( r"\\unc\as\path", "file://unc/as/path", - marks=pytest.mark.skipif( - "sys.platform != 'win32' or " - "sys.version_info == (3, 13, 0, 'beta', 2)" - ), + marks=skipif_new_urlun_behavior_win, id="unc-path", ), + pytest.param( + r"\\unc\as\path", + "file:////unc/as/path", + marks=skipif_old_urlun_behavior_win, + ), ], ) def test_path_to_url_win(path: str, url: str) -> None: