pip/tests/unit/resolution_resolvelib/test_resolver.py

83 lines
2.7 KiB
Python

import mock
import pytest
from pip._vendor.packaging.utils import canonicalize_name
from pip._vendor.resolvelib.resolvers import Result
from pip._vendor.resolvelib.structs import DirectedGraph
from pip._internal.req.constructors import install_req_from_line
from pip._internal.req.req_set import RequirementSet
from pip._internal.resolution.resolvelib.resolver import Resolver
@pytest.fixture()
def resolver(preparer, finder):
resolver = Resolver(
preparer=preparer,
finder=finder,
wheel_cache=None,
make_install_req=mock.Mock(),
use_user_site="not-used",
ignore_dependencies="not-used",
ignore_installed="not-used",
ignore_requires_python="not-used",
force_reinstall="not-used",
upgrade_strategy="not-used",
)
return resolver
@pytest.mark.parametrize(
"edges, ordered_reqs",
[
(
[(None, "require-simple"), ("require-simple", "simple")],
["simple==3.0", "require-simple==1.0"],
),
(
[(None, "meta"), ("meta", "simple"), ("meta", "simple2")],
["simple2==3.0", "simple==3.0", "meta==1.0"],
),
(
[
(None, "toporequires"),
(None, "toporequire2"),
(None, "toporequire3"),
(None, "toporequire4"),
("toporequires2", "toporequires"),
("toporequires3", "toporequires"),
("toporequires4", "toporequires"),
("toporequires4", "toporequires2"),
("toporequires4", "toporequires3"),
],
[
"toporequires==0.0.1",
"toporequires3==0.0.1",
"toporequires2==0.0.1",
"toporequires4==0.0.1",
],
),
],
)
def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
# Build graph from edge declarations.
graph = DirectedGraph()
for parent, child in edges:
parent = canonicalize_name(parent) if parent else None
child = canonicalize_name(child) if child else None
for v in (parent, child):
if v not in graph:
graph.add(v)
graph.connect(parent, child)
# Mapping values and criteria are not used in test, so we stub them out.
mapping = {vertex: None for vertex in graph if vertex is not None}
resolver._result = Result(mapping, graph, criteria=None)
reqset = RequirementSet()
for r in ordered_reqs:
reqset.add_named_requirement(install_req_from_line(r))
ireqs = resolver.get_installation_order(reqset)
req_strs = [str(r.req) for r in ireqs]
assert req_strs == ordered_reqs