Skip to content

Commit

Permalink
Split up Windows tests relying on urlunparse behaviour (#12788)
Browse files Browse the repository at this point in the history
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] python/cpython#113563
  • Loading branch information
matthewhughes934 committed Jun 25, 2024
1 parent 00c75c4 commit 5c389ec
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 13 deletions.
Empty file.
17 changes: 17 additions & 0 deletions tests/lib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
Union,
cast,
)
from urllib.parse import urlparse, urlunparse
from zipfile import ZipFile

import pytest
Expand Down Expand Up @@ -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",
)
27 changes: 18 additions & 9 deletions tests/unit/test_collector.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
[
Expand Down Expand Up @@ -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.
Expand All @@ -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.
Expand Down
14 changes: 10 additions & 4 deletions tests/unit/test_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'")
Expand All @@ -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:
Expand Down

0 comments on commit 5c389ec

Please sign in to comment.