From 0d33a34756aa107e583b9b392611f2a5303fb317 Mon Sep 17 00:00:00 2001 From: user Date: Sun, 23 Jun 2024 10:07:03 +0100 Subject: [PATCH] Split up Windows tests relying on urlunparse behaviour 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. This currently affects only 3.12 and 3.13 but there are other backports for that change in review upstream, so we'll likely need to update this in the future. [1] https://github.com/python/cpython/pull/113563 --- tests/unit/test_collector.py | 81 +++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/tests/unit/test_collector.py b/tests/unit/test_collector.py index e34104707ba..f9167ae4ef1 100644 --- a/tests/unit/test_collector.py +++ b/tests/unit/test_collector.py @@ -3,6 +3,7 @@ import logging import os import re +import sys import uuid from pathlib import Path from textwrap import dedent @@ -377,17 +378,6 @@ def test_clean_url_path_with_local_path(path: str, expected: str) -> None: "git+https://example.com/repo.git@at%40 space#egg=my-package-1.0", "git+https://example.com/repo.git@at%40%20space#egg=my-package-1.0", ), - # URL with Windows drive letter. The `:` after the drive - # letter should not be quoted. The trailing `/` should be - # removed. - 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)" - ), - ), # URL with Windows drive letter, running on non-windows # platform. The `:` after the drive should be quoted. pytest.param( @@ -395,15 +385,6 @@ def test_clean_url_path_with_local_path(path: str, expected: str) -> None: "file:///T%3A/path/with%20spaces/", marks=pytest.mark.skipif("sys.platform == 'win32'"), ), - # Test a VCS URL with a Windows drive letter and revision. - 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)" - ), - ), # Test a VCS URL with a Windows drive letter and revision, # running on non-windows platform. pytest.param( @@ -417,6 +398,66 @@ def test_ensure_quoted_url(url: str, clean_url: str) -> None: assert _ensure_quoted_url(url) == clean_url +# versions containing fix/backport from https://github.com/python/cpython/pull/113563 +has_new_urlun_behaviour = ( + # 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)) +) + + +@pytest.mark.skipif( + sys.platform != "win32" or has_new_urlun_behaviour, + reason="testing windows behaviour on older CPython", +) +@pytest.mark.parametrize( + ("url", "clean_url"), + ( + ( + # URL with Windows drive letter. The `:` after the drive + # letter should not be quoted. The trailing `/` should be + # removed. + "file:///T:/path/with spaces/", + "file:///T:/path/with%20spaces", + ), + ( + # Test a VCS URL with a Windows drive letter and revision. + "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", + ), + ), +) +def test_ensure_quoted_url_windows_old(url: str, clean_url: str) -> None: + assert _ensure_quoted_url(url) == clean_url + + +@pytest.mark.skipif( + sys.platform != "win32" or not has_new_urlun_behaviour, + reason="testing windows behaviour on newer cpython", +) +@pytest.mark.parametrize( + ("url", "clean_url"), + ( + ( + # URL with Windows drive letter. The `:` after the drive + # letter should not be quoted. The trailing `/` should be + # removed. + "file:///T:/path/with spaces/", + "file://///T:/path/with%20spaces", + ), + ( + # Test a VCS URL with a Windows drive letter and revision. + "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", + ), + ), +) +def test_ensure_quoted_url_windows_new(url: str, clean_url: str) -> None: + assert _ensure_quoted_url(url) == clean_url + + def _test_parse_links_data_attribute( anchor_html: str, attr: str, expected: Optional[str] ) -> Link: