From 5c389ec91fa178ec3897f5b9522441f4d3922662 Mon Sep 17 00:00:00 2001 From: Matthew Hughes <34972397+matthewhughes934@users.noreply.github.com> Date: Tue, 25 Jun 2024 13:04:26 +0100 Subject: [PATCH] Split up Windows tests relying on urlunparse behaviour (#12788) There was a behavioural change to `urllib.parse.urlunparse`[1] that affects some of our tests on Windows. With the understanding that the new behaviour is indeed desired, split up some tests relying on this behaviour depending on the version of Python. The sample URL used to check this behaviour was taken from a test in the upstream change (with the new behaviour this URL will round-trip parsing) [1] https://github.com/python/cpython/pull/113563 --- ...34-f9bf-4f17-a201-6546bdb9d5d2.trivial.rst | 0 tests/lib/__init__.py | 17 ++++++++++++ tests/unit/test_collector.py | 27 ++++++++++++------- tests/unit/test_urls.py | 14 +++++++--- 4 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 news/5407ea34-f9bf-4f17-a201-6546bdb9d5d2.trivial.rst diff --git a/news/5407ea34-f9bf-4f17-a201-6546bdb9d5d2.trivial.rst b/news/5407ea34-f9bf-4f17-a201-6546bdb9d5d2.trivial.rst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index bd31b59ff2f..e318f7155d2 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -28,6 +28,7 @@ Union, cast, ) +from urllib.parse import urlparse, urlunparse from zipfile import ZipFile import pytest @@ -1375,3 +1376,19 @@ 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}` +url = "////path/to/file" +has_new_urlun_behavior = url == urlunparse(urlparse(url)) + +# the above change seems to only impact tests on Windows, so just add skips for that +skip_needs_new_urlun_behavior_win = pytest.mark.skipif( + sys.platform != "win32" or not has_new_urlun_behavior, + reason="testing windows behavior for newer CPython", +) + +skip_needs_old_urlun_behavior_win = pytest.mark.skipif( + sys.platform != "win32" or has_new_urlun_behavior, + reason="testing windows behavior for older CPython", +) diff --git a/tests/unit/test_collector.py b/tests/unit/test_collector.py index e34104707ba..89da25b73d8 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, + skip_needs_new_urlun_behavior_win, + skip_needs_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=skip_needs_old_urlun_behavior_win, + ), + pytest.param( + "file:///T:/path/with spaces/", + "file://///T:/path/with%20spaces", + marks=skip_needs_new_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=skip_needs_old_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=skip_needs_new_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..c4b8db681ff 100644 --- a/tests/unit/test_urls.py +++ b/tests/unit/test_urls.py @@ -5,6 +5,10 @@ import pytest from pip._internal.utils.urls import path_to_url, url_to_path +from tests.lib import ( + skip_needs_new_urlun_behavior_win, + skip_needs_old_urlun_behavior_win, +) @pytest.mark.skipif("sys.platform == 'win32'") @@ -23,12 +27,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=skip_needs_old_urlun_behavior_win, id="unc-path", ), + pytest.param( + r"\\unc\as\path", + "file:////unc/as/path", + marks=skip_needs_new_urlun_behavior_win, + ), ], ) def test_path_to_url_win(path: str, url: str) -> None: