@@ -30,83 +30,93 @@ def tmp_context(tmp_path: Path) -> WorkContext:
3030 pbi .resolver_ignore_platform = False
3131 pbi .resolver_sdist_server_url .return_value = "https://pypi.org/simple/"
3232 ctx .package_build_info .return_value = pbi
33+ ctx .max_release_age = None
3334 return ctx
3435
3536
37+ _MOCK_VERSIONS = [
38+ ("https://pypi.org/testpkg-2.0.tar.gz" , Version ("2.0" )),
39+ ("https://pypi.org/testpkg-1.5.tar.gz" , Version ("1.5" )),
40+ ("https://pypi.org/testpkg-1.0.tar.gz" , Version ("1.0" )),
41+ ]
42+
43+
3644def test_resolve_return_all_versions_true (tmp_context : WorkContext ) -> None :
3745 """resolve() with return_all_versions=True returns all matching versions."""
38- resolver = BootstrapRequirementResolver (tmp_context )
39-
40- # Mock the _resolve method to return multiple versions
41- with patch .object (
42- resolver ,
43- "_resolve" ,
44- return_value = [
45- ("https://pypi.org/testpkg-2.0.tar.gz" , Version ("2.0" )),
46- ("https://pypi.org/testpkg-1.5.tar.gz" , Version ("1.5" )),
47- ("https://pypi.org/testpkg-1.0.tar.gz" , Version ("1.0" )),
48- ],
46+ brr = BootstrapRequirementResolver (tmp_context )
47+
48+ with (
49+ patch .object (brr , "_resolve_from_graph" , return_value = None ),
50+ patch (
51+ "fromager.bootstrap_requirement_resolver.sources.get_source_provider" ,
52+ ),
53+ patch (
54+ "fromager.bootstrap_requirement_resolver.resolver"
55+ ".find_all_matching_from_provider" ,
56+ return_value = list (_MOCK_VERSIONS ),
57+ ),
4958 ):
5059 req = Requirement ("testpkg>=1.0" )
51- results = resolver .resolve (
60+ results = brr .resolve (
5261 req = req ,
5362 req_type = RequirementType .INSTALL ,
5463 parent_req = None ,
5564 return_all_versions = True ,
5665 )
5766
58- # Should return all 3 versions
5967 assert len (results ) == 3
60- assert results [0 ] == ( "https://pypi.org/testpkg-2.0.tar.gz" , Version ( "2.0" ))
61- assert results [1 ] == ( "https://pypi.org/testpkg-1.5.tar.gz" , Version ( "1.5" ))
62- assert results [2 ] == ( "https://pypi.org/testpkg-1.0.tar.gz" , Version ( "1.0" ))
68+ assert results [0 ] == _MOCK_VERSIONS [ 0 ]
69+ assert results [1 ] == _MOCK_VERSIONS [ 1 ]
70+ assert results [2 ] == _MOCK_VERSIONS [ 2 ]
6371
6472
6573def test_resolve_return_all_versions_false_default (tmp_context : WorkContext ) -> None :
6674 """resolve() with return_all_versions=False (default) returns list with only highest version."""
67- resolver = BootstrapRequirementResolver (tmp_context )
68-
69- # Mock the _resolve method to return multiple versions
70- with patch .object (
71- resolver ,
72- "_resolve" ,
73- return_value = [
74- ("https://pypi.org/testpkg-2.0.tar.gz" , Version ("2.0" )),
75- ("https://pypi.org/testpkg-1.5.tar.gz" , Version ("1.5" )),
76- ("https://pypi.org/testpkg-1.0.tar.gz" , Version ("1.0" )),
77- ],
75+ brr = BootstrapRequirementResolver (tmp_context )
76+
77+ with (
78+ patch .object (brr , "_resolve_from_graph" , return_value = None ),
79+ patch (
80+ "fromager.bootstrap_requirement_resolver.sources.get_source_provider" ,
81+ ),
82+ patch (
83+ "fromager.bootstrap_requirement_resolver.resolver"
84+ ".find_all_matching_from_provider" ,
85+ return_value = list (_MOCK_VERSIONS ),
86+ ),
7887 ):
7988 req = Requirement ("testpkg>=1.0" )
80-
81- # Call without return_all_versions (default False)
82- results = resolver .resolve (
89+ results = brr .resolve (
8390 req = req ,
8491 req_type = RequirementType .INSTALL ,
8592 parent_req = None ,
8693 )
8794
88- # Should return list with only the highest version
8995 assert len (results ) == 1
90- assert results [0 ] == ( "https://pypi.org/testpkg-2.0.tar.gz" , Version ( "2.0" ))
96+ assert results [0 ] == _MOCK_VERSIONS [ 0 ]
9197
9298
9399def test_resolve_return_all_versions_uses_cache (tmp_context : WorkContext ) -> None :
94100 """resolve() with return_all_versions=True uses cache correctly."""
95- resolver = BootstrapRequirementResolver (tmp_context )
96-
97- # First call - will populate cache
98- with patch .object (
99- resolver ,
100- "_resolve" ,
101- return_value = [
102- ("https://pypi.org/testpkg-2.0.tar.gz" , Version ("2.0" )),
103- ("https://pypi.org/testpkg-1.0.tar.gz" , Version ("1.0" )),
104- ],
105- ) as mock_resolve :
101+ brr = BootstrapRequirementResolver (tmp_context )
102+
103+ with (
104+ patch .object (brr , "_resolve_from_graph" , return_value = None ),
105+ patch (
106+ "fromager.bootstrap_requirement_resolver.sources.get_source_provider" ,
107+ ),
108+ patch (
109+ "fromager.bootstrap_requirement_resolver.resolver"
110+ ".find_all_matching_from_provider" ,
111+ return_value = [
112+ ("https://pypi.org/testpkg-2.0.tar.gz" , Version ("2.0" )),
113+ ("https://pypi.org/testpkg-1.0.tar.gz" , Version ("1.0" )),
114+ ],
115+ ) as mock_resolve ,
116+ ):
106117 req = Requirement ("testpkg>=1.0" )
107118
108- # First call
109- results1 = resolver .resolve (
119+ results1 = brr .resolve (
110120 req = req ,
111121 req_type = RequirementType .INSTALL ,
112122 parent_req = None ,
@@ -115,25 +125,22 @@ def test_resolve_return_all_versions_uses_cache(tmp_context: WorkContext) -> Non
115125 assert len (results1 ) == 2
116126 assert mock_resolve .call_count == 1
117127
118- # Second call - should use cache
119- results2 = resolver .resolve (
128+ results2 = brr .resolve (
120129 req = req ,
121130 req_type = RequirementType .INSTALL ,
122131 parent_req = None ,
123132 return_all_versions = True ,
124133 )
125134
126- # Should not call _resolve again
135+ # Should not call resolution again — cache hit
127136 assert mock_resolve .call_count == 1
128- # Should return same results
129137 assert results2 == results1
130138
131139
132140def test_resolve_return_all_versions_with_previous_graph (
133141 tmp_context : WorkContext ,
134142) -> None :
135143 """resolve() with return_all_versions=True works with previous graph."""
136- # Create graph with multiple versions of the same package
137144 prev_graph = DependencyGraph ()
138145 prev_graph .add_dependency (
139146 parent_name = None ,
@@ -150,23 +157,19 @@ def test_resolve_return_all_versions_with_previous_graph(
150157 req_version = Version ("1.0" ),
151158 )
152159
153- # Mock dependency_graph in context
154160 tmp_context .dependency_graph = prev_graph
155161
156- resolver = BootstrapRequirementResolver (tmp_context , prev_graph )
162+ brr = BootstrapRequirementResolver (tmp_context , prev_graph )
157163
158- # Request with version spec that matches both
159164 req = Requirement ("testpkg>=1.0" )
160- results = resolver .resolve (
165+ results = brr .resolve (
161166 req = req ,
162167 req_type = RequirementType .TOP_LEVEL ,
163168 parent_req = None ,
164169 return_all_versions = True ,
165170 )
166171
167- # Should return both versions from graph
168172 assert len (results ) == 2
169- # Verify versions (should be sorted highest first)
170173 versions = [v for _ , v in results ]
171174 assert Version ("2.0" ) in versions
172175 assert Version ("1.0" ) in versions
0 commit comments