pip/tests/unit/resolution_resolvelib/test_requirement.py

86 lines
3.0 KiB
Python

import pytest
from pip._vendor.resolvelib import BaseReporter, Resolver
from pip._internal.resolution.resolvelib.base import Candidate, Constraint
from pip._internal.utils.urls import path_to_url
# NOTE: All tests are prefixed `test_rlr` (for "test resolvelib resolver").
# This helps select just these tests using pytest's `-k` option, and
# keeps test names shorter.
# Basic tests:
# Create a requirement from a project name - "pip"
# Create a requirement from a name + version constraint - "pip >= 20.0"
# Create a requirement from a wheel filename
# Create a requirement from a sdist filename
# Create a requirement from a local directory (which has no obvious name!)
# Editables
@pytest.fixture
def test_cases(data):
def data_file(name):
return data.packages.joinpath(name)
def data_url(name):
return path_to_url(data_file(name))
test_cases = [
# requirement, name, matches
# Version specifiers
("simple", "simple", 3),
("simple>1.0", "simple", 2),
# ("simple[extra]==1.0", "simple[extra]", 1),
# Wheels
(data_file("simplewheel-1.0-py2.py3-none-any.whl"), "simplewheel", 1),
(data_url("simplewheel-1.0-py2.py3-none-any.whl"), "simplewheel", 1),
# Direct URLs
# TODO: The following test fails
# ("foo @ " + data_url("simple-1.0.tar.gz"), "foo", 1),
# SDists
# TODO: sdists should have a name
(data_file("simple-1.0.tar.gz"), "simple", 1),
(data_url("simple-1.0.tar.gz"), "simple", 1),
# TODO: directory, editables
]
yield test_cases
def test_new_resolver_requirement_has_name(test_cases, factory):
"""All requirements should have a name"""
for spec, name, _ in test_cases:
req = factory.make_requirement_from_spec(spec, comes_from=None)
assert req.name == name
def test_new_resolver_correct_number_of_matches(test_cases, factory):
"""Requirements should return the correct number of candidates"""
for spec, _, match_count in test_cases:
req = factory.make_requirement_from_spec(spec, comes_from=None)
matches = factory.find_candidates(
[req], Constraint.empty(), prefers_installed=False,
)
assert sum(1 for _ in matches) == match_count
def test_new_resolver_candidates_match_requirement(test_cases, factory):
"""Candidates returned from find_candidates should satisfy the requirement
"""
for spec, _, _ in test_cases:
req = factory.make_requirement_from_spec(spec, comes_from=None)
candidates = factory.find_candidates(
[req], Constraint.empty(), prefers_installed=False,
)
for c in candidates:
assert isinstance(c, Candidate)
assert req.is_satisfied_by(c)
def test_new_resolver_full_resolve(factory, provider):
"""A very basic full resolve"""
req = factory.make_requirement_from_spec("simplewheel", comes_from=None)
r = Resolver(provider, BaseReporter())
result = r.resolve([req])
assert set(result.mapping.keys()) == {'simplewheel'}