summaryrefslogtreecommitdiff
path: root/tests/unit/resolution_resolvelib/test_provider.py
blob: 1901474ad74a59a42254b67252c8a779063b5077 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import operator

from pip._vendor.packaging.requirements import Requirement
from pip._vendor.resolvelib.resolvers import Criterion, RequirementInformation
from pip._vendor.resolvelib.structs import IteratorMapping

from pip._internal.models.candidate import InstallationCandidate
from pip._internal.models.link import Link
from pip._internal.req.req_install import InstallRequirement
from pip._internal.resolution.resolvelib.factory import Factory
from pip._internal.resolution.resolvelib.provider import PipProvider
from pip._internal.resolution.resolvelib.requirements import SpecifierRequirement


def test_provider_known_depths(factory: Factory):
    provider = PipProvider(
        factory=factory,
        constraints={},
        ignore_dependencies=False,
        upgrade_strategy="to-satisfy-only",
        user_requested={"my-package": 0},
    )

    # Setup all "my-package" objects required to call get_preference
    my_package_install_requirement = InstallRequirement(
        Requirement("my-package"), "-r .\\reqs.txt (line 1)"
    )
    my_package_matches = provider.find_matches(
        "my-package",
        IteratorMapping(
            {},
            operator.methodcaller("iter_requirement"),
            {"my-package": [SpecifierRequirement(my_package_install_requirement)]},
        ),
        IteratorMapping(
            {}, operator.attrgetter("incompatibilities"), {"my-package": []}
        ),
    )
    my_package_matches_iterview = iter(my_package_matches)
    my_package_requirement_information = RequirementInformation(
        requirement=SpecifierRequirement(my_package_install_requirement), parent=None
    )
    my_package_criterion = Criterion(
        my_package_matches_iterview, [my_package_requirement_information], []
    )

    provider.get_preference(
        identifier="my-package",
        resolutions={},
        candidates={},
        information=IteratorMapping(
            {"my-package": my_package_criterion}, operator.attrgetter("information")
        ),
    )
    assert provider._known_depths == {"my-package": 1.0}

    my_package_candidate = InstallationCandidate(
        "my-package",
        "1.0",
        Link("https://my-package.com"),
    )

    # Setup all "my-transitive-package", a package dependent on "my-package",
    # objects required to call get_preference
    my_transative_package_install_requirement = InstallRequirement(
        Requirement("my-package"), "-r .\\reqs.txt (line 1)"
    )
    my_transative_package_matches = provider.find_matches(
        "my-transitive-package",
        IteratorMapping(
            {},
            operator.methodcaller("iter_requirement"),
            {
                "my-transitive-package": [
                    SpecifierRequirement(my_transative_package_install_requirement)
                ]
            },
        ),
        IteratorMapping(
            {}, operator.attrgetter("incompatibilities"), {"my-transitive-package": []}
        ),
    )
    my_transative_package_matches_iterview = iter(my_transative_package_matches)
    my_transative_package_requirement_information = RequirementInformation(
        requirement=SpecifierRequirement(my_transative_package_install_requirement),
        parent=my_package_candidate,
    )
    my_transative_package_criterion = Criterion(
        my_transative_package_matches_iterview,
        [my_transative_package_requirement_information],
        [],
    )

    provider.get_preference(
        identifier="my-transitive-package",
        resolutions={},
        candidates={},
        information=IteratorMapping(
            {
                "my-package": my_package_criterion,
                "my-transitive-package": my_transative_package_criterion,
            },
            operator.attrgetter("information"),
        ),
    )
    assert provider._known_depths == {"my-transitive-package": 2.0, "my-package": 1.0}