@@ -277,6 +277,82 @@ def test_preserves_why_snapshot(self, tmp_context: WorkContext) -> None:
277277
278278 assert result [0 ].why_snapshot == snapshot
279279
280+ def test_filters_cached_versions_in_multiple_versions_mode (
281+ self , tmp_context : WorkContext
282+ ) -> None :
283+ """Cached versions are filtered out before creating START items."""
284+ bt = bootstrapper .Bootstrapper (tmp_context , multiple_versions = True )
285+ item = _make_resolve_item ()
286+
287+ def mock_cache (req : Requirement , version : Version ) -> tuple :
288+ if str (version ) == "2.0" :
289+ return (tmp_context .work_dir / "pkg-2.0-py3-none-any.whl" , None )
290+ return (None , None )
291+
292+ with (
293+ patch .object (
294+ bt ,
295+ "resolve_versions" ,
296+ return_value = [
297+ ("url-3.0" , Version ("3.0" )),
298+ ("url-2.0" , Version ("2.0" )),
299+ ("url-1.0" , Version ("1.0" )),
300+ ],
301+ ),
302+ patch .object (bt , "_find_cached_wheel" , side_effect = mock_cache ),
303+ ):
304+ result = bt ._phase_resolve (item )
305+
306+ assert len (result ) == 2
307+ versions = {str (it .resolved_version ) for it in result }
308+ assert versions == {"1.0" , "3.0" }
309+
310+ def test_all_cached_keeps_highest_version (self , tmp_context : WorkContext ) -> None :
311+ """If all versions are cached, keeps the highest for dependency discovery."""
312+ bt = bootstrapper .Bootstrapper (tmp_context , multiple_versions = True )
313+ item = _make_resolve_item ()
314+
315+ with (
316+ patch .object (
317+ bt ,
318+ "resolve_versions" ,
319+ return_value = [
320+ ("url-3.0" , Version ("3.0" )),
321+ ("url-2.0" , Version ("2.0" )),
322+ ("url-1.0" , Version ("1.0" )),
323+ ],
324+ ),
325+ patch .object (
326+ bt ,
327+ "_find_cached_wheel" ,
328+ return_value = (tmp_context .work_dir / "cached.whl" , None ),
329+ ),
330+ ):
331+ result = bt ._phase_resolve (item )
332+
333+ assert len (result ) == 1
334+ assert result [0 ].resolved_version == Version ("3.0" )
335+
336+ def test_no_filtering_in_single_version_mode (
337+ self , tmp_context : WorkContext
338+ ) -> None :
339+ """Cache filtering does not apply in single version mode."""
340+ bt = bootstrapper .Bootstrapper (tmp_context , multiple_versions = False )
341+ item = _make_resolve_item ()
342+
343+ with (
344+ patch .object (
345+ bt ,
346+ "resolve_versions" ,
347+ return_value = [("url-1.0" , Version ("1.0" ))],
348+ ),
349+ patch .object (bt , "_find_cached_wheel" ) as mock_cache ,
350+ ):
351+ result = bt ._phase_resolve (item )
352+
353+ assert len (result ) == 1
354+ mock_cache .assert_not_called ()
355+
280356
281357class TestPhaseStart :
282358 def test_new_item_advances_to_prepare_source (
0 commit comments