1414from poetry .repositories .exceptions import PackageNotFound
1515from poetry .repositories .exceptions import RepositoryError
1616from poetry .repositories .legacy_repository import LegacyRepository
17+ from poetry .repositories .link_sources .html import SimpleIndexPage
1718from poetry .repositories .link_sources .html import SimpleRepositoryPage
1819
1920
@@ -32,8 +33,10 @@ class MockRepository(LegacyRepository):
3233
3334 FIXTURES = Path (__file__ ).parent / "fixtures" / "legacy"
3435
35- def __init__ (self ) -> None :
36- super ().__init__ ("legacy" , url = "http://legacy.foo.bar" , disable_cache = True )
36+ def __init__ (self , indexed : bool = False ) -> None :
37+ super ().__init__ (
38+ "legacy" , url = "http://legacy.foo.bar" , disable_cache = True , indexed = indexed
39+ )
3740
3841 def _get_page (self , endpoint : str ) -> SimpleRepositoryPage | None :
3942 parts = endpoint .split ("/" )
@@ -338,6 +341,64 @@ def test_get_package_retrieves_packages_with_no_hashes():
338341 ] == package .files
339342
340343
344+ def test_unindexed_has_no_root_page ():
345+ repo = MockRepository ()
346+ assert not repo ._index_page
347+
348+
349+ class MockIndexedRepository (MockRepository ):
350+ def __init__ (self ) -> None :
351+ super ().__init__ (True )
352+
353+ def _get_index_page (self ) -> SimpleIndexPage | None :
354+ fixture = self .FIXTURES / "index.html"
355+ if not fixture .exists ():
356+ return
357+
358+ with fixture .open (encoding = "utf-8" ) as f :
359+ return SimpleIndexPage (self ._url + "/" , f .read ())
360+
361+
362+ def test_indexed_has_root_page ():
363+ repo = MockIndexedRepository ()
364+ assert repo ._index_page
365+
366+
367+ def test_indexed_root_page_has_valid_content ():
368+ repo = MockIndexedRepository ()
369+ assert repo ._index_page .serves_package ("pyyaml" )
370+
371+
372+ def test_indexed_fails_on_missing ():
373+ repo = MockIndexedRepository ()
374+
375+ packages = repo .find_packages (Factory .create_dependency ("this-doesnt-exist" , "*" ))
376+
377+ assert packages == []
378+
379+
380+ def test_indexed_succeeds_on_existing ():
381+ repo = MockIndexedRepository ()
382+
383+ packages = repo .find_packages (Factory .create_dependency ("pyyaml" , "*" ))
384+
385+ assert len (packages ) == 1
386+
387+
388+ def test_indexed_pep426_underscore_hyphen ():
389+ repo = MockIndexedRepository ()
390+
391+ # 'missing-version' in the index
392+ assert repo ._index_page .serves_package ("missing_version" )
393+
394+
395+ def test_indexed_pep426_case_insensitive ():
396+ repo = MockIndexedRepository ()
397+
398+ # 'black' in the index
399+ assert repo ._index_page .serves_package ("Black" )
400+
401+
341402class MockHttpRepository (LegacyRepository ):
342403 def __init__ (self , endpoint_responses : dict , http : type [httpretty .httpretty ]):
343404 base_url = "http://legacy.foo.bar"
0 commit comments