Skip to content

Commit 55a4e1d

Browse files
committed
PipProvider.get_preference unit tests
1 parent 76895a0 commit 55a4e1d

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import math
2+
from typing import TYPE_CHECKING, Dict, Iterable, Optional, Sequence
3+
4+
import pytest
5+
6+
from pip._vendor.resolvelib.resolvers import RequirementInformation
7+
8+
from pip._internal.req.constructors import install_req_from_req_string
9+
from pip._internal.resolution.resolvelib.base import Candidate
10+
from pip._internal.resolution.resolvelib.candidates import REQUIRES_PYTHON_IDENTIFIER
11+
from pip._internal.resolution.resolvelib.factory import Factory
12+
from pip._internal.resolution.resolvelib.provider import PipProvider
13+
from pip._internal.resolution.resolvelib.requirements import SpecifierRequirement
14+
15+
if TYPE_CHECKING:
16+
from pip._vendor.resolvelib.providers import Preference
17+
18+
from pip._internal.resolution.resolvelib.base import Candidate, Requirement
19+
20+
PreferenceInformation = RequirementInformation[Requirement, Candidate]
21+
22+
23+
def build_req_info(
24+
name: str, parent: Optional[Candidate] = None
25+
) -> "PreferenceInformation":
26+
install_requirement = install_req_from_req_string(name)
27+
28+
requirement_information: PreferenceInformation = RequirementInformation(
29+
requirement=SpecifierRequirement(install_requirement),
30+
parent=parent,
31+
)
32+
33+
return requirement_information
34+
35+
36+
@pytest.mark.parametrize(
37+
"identifier, information, backtrack_causes, user_requested, expected",
38+
[
39+
# Test case for REQUIRES_PYTHON_IDENTIFIER
40+
(
41+
REQUIRES_PYTHON_IDENTIFIER,
42+
{REQUIRES_PYTHON_IDENTIFIER: [build_req_info("python")]},
43+
[],
44+
{},
45+
(False, False, True, True, math.inf, True, REQUIRES_PYTHON_IDENTIFIER),
46+
),
47+
# Pinned package with "=="
48+
(
49+
"pinned-package",
50+
{"pinned-package": [build_req_info("pinned-package==1.0")]},
51+
[],
52+
{},
53+
(True, False, False, True, math.inf, False, "pinned-package"),
54+
),
55+
# Package that caused backtracking
56+
(
57+
"backtrack-package",
58+
{"backtrack-package": [build_req_info("backtrack-package")]},
59+
[build_req_info("backtrack-package")],
60+
{},
61+
(True, False, True, False, math.inf, True, "backtrack-package"),
62+
),
63+
# Root package requested by user
64+
(
65+
"root-package",
66+
{"root-package": [build_req_info("root-package")]},
67+
[],
68+
{"root-package": 1},
69+
(True, False, True, True, 1, True, "root-package"),
70+
),
71+
# Unfree package (with specifier operator)
72+
(
73+
"unfree-package",
74+
{"unfree-package": [build_req_info("unfree-package<1")]},
75+
[],
76+
{},
77+
(True, False, True, True, math.inf, False, "unfree-package"),
78+
),
79+
# Free package (no operator)
80+
(
81+
"free-package",
82+
{"free-package": [build_req_info("free-package")]},
83+
[],
84+
{},
85+
(True, False, True, True, math.inf, True, "free-package"),
86+
),
87+
],
88+
)
89+
def test_get_preference(
90+
identifier: str,
91+
information: Dict[str, Iterable["PreferenceInformation"]],
92+
backtrack_causes: Sequence["PreferenceInformation"],
93+
user_requested: Dict[str, int],
94+
expected: "Preference",
95+
factory: Factory,
96+
) -> None:
97+
provider = PipProvider(
98+
factory=factory,
99+
constraints={},
100+
ignore_dependencies=False,
101+
upgrade_strategy="to-satisfy-only",
102+
user_requested=user_requested,
103+
)
104+
105+
preference = provider.get_preference(
106+
identifier, {}, {}, information, backtrack_causes
107+
)
108+
109+
assert preference == expected, f"Expected {expected}, got {preference}"

0 commit comments

Comments
 (0)