Skip to content

Commit 453ee01

Browse files
committed
test(pypi): check index url precedence in various combinations
This just adds extra tests to verify behaviour end-to-end to better reason in case of any bug reports during the RC phase. Followup to #3691
1 parent 6d57b1a commit 453ee01

File tree

2 files changed

+135
-2
lines changed

2 files changed

+135
-2
lines changed

tests/pypi/extension/pip_parse.bzl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def pip_parse(
1010
enable_implicit_namespace_pkgs = False,
1111
environment = {},
1212
envsubst = {},
13+
experimental_extra_index_urls = [],
1314
experimental_index_url = "",
1415
experimental_requirement_cycles = {},
1516
experimental_target_platforms = [],
@@ -40,6 +41,7 @@ def pip_parse(
4041
enable_implicit_namespace_pkgs = enable_implicit_namespace_pkgs,
4142
environment = environment,
4243
envsubst = envsubst,
44+
experimental_extra_index_urls = experimental_extra_index_urls,
4345
experimental_index_url = experimental_index_url,
4446
experimental_requirement_cycles = experimental_requirement_cycles,
4547
# TODO @aignas 2025-12-02: decide on a single attr - should we reuse this?
@@ -63,8 +65,6 @@ def pip_parse(
6365
requirements_windows = requirements_windows,
6466
timeout = timeout,
6567
whl_modifications = whl_modifications,
66-
# The following are covered by other unit tests
67-
experimental_extra_index_urls = [],
6868
parallel_download = False,
6969
experimental_index_url_overrides = {},
7070
simpleapi_skip = simpleapi_skip,

tests/pypi/hub_builder/hub_builder_tests.bzl

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,139 @@ torch==2.4.1+cpu ; platform_machine == 'x86_64' \
698698

699699
_tests.append(_test_torch_experimental_index_url)
700700

701+
def _test_index_url_precedence(env):
702+
for test in [
703+
struct(
704+
requirements_txt = "simple==0.0.1 --hash=sha256:deadb00f",
705+
experimental_index_url = "https://experimental.example.com/simple",
706+
experimental_extra_index_urls = [],
707+
expect_index_url = "https://experimental.example.com/simple",
708+
expect_extra_index_urls = [],
709+
expect_url = "experimental.example.com/simple/",
710+
),
711+
struct(
712+
requirements_txt = """\
713+
--index-url=https://file.example.com/simple
714+
simple==0.0.1 --hash=sha256:deadb00f
715+
""",
716+
experimental_index_url = "https://experimental.example.com/simple",
717+
experimental_extra_index_urls = [],
718+
expect_index_url = "https://file.example.com/simple",
719+
expect_extra_index_urls = [],
720+
expect_url = "file.example.com/simple/",
721+
),
722+
struct(
723+
requirements_txt = "simple==0.0.1 --hash=sha256:deadb00f",
724+
experimental_index_url = "",
725+
experimental_extra_index_urls = [],
726+
expect_index_url = "https://pypi.org/simple",
727+
expect_extra_index_urls = [],
728+
expect_url = "pypi.org/simple/",
729+
),
730+
struct(
731+
requirements_txt = """\
732+
--extra-index-url=https://extra1.example.com/simple
733+
--extra-index-url=https://extra2.example.com/simple
734+
simple==0.0.1 --hash=sha256:deadb00f
735+
""",
736+
experimental_index_url = "",
737+
experimental_extra_index_urls = [
738+
"https://ignored.example.com/simple",
739+
],
740+
expect_index_url = "https://pypi.org/simple",
741+
expect_extra_index_urls = [
742+
"https://extra1.example.com/simple",
743+
"https://extra2.example.com/simple",
744+
],
745+
expect_url = "pypi.org/simple/",
746+
),
747+
]:
748+
got_kwargs = {}
749+
750+
def mock_simpleapi_download(*_, **kwargs):
751+
got_kwargs.update(kwargs)
752+
return {
753+
"simple": struct(
754+
whls = {
755+
"deadb00f": struct(
756+
yanked = None,
757+
filename = "simple-0.0.1-py3-none-any.whl",
758+
sha256 = "deadb00f",
759+
url = test.expect_url,
760+
),
761+
},
762+
sdists = {},
763+
sha256s_by_version = {},
764+
index_url = test.expect_index_url,
765+
),
766+
}
767+
768+
builder = hub_builder(
769+
env,
770+
simpleapi_download_fn = mock_simpleapi_download,
771+
)
772+
builder.pip_parse(
773+
_mock_mctx(
774+
read = lambda x: {
775+
"requirements.txt": test.requirements_txt,
776+
}[x],
777+
),
778+
_parse(
779+
hub_name = "pypi",
780+
python_version = "3.15",
781+
experimental_index_url = test.experimental_index_url,
782+
experimental_extra_index_urls = test.experimental_extra_index_urls,
783+
requirements_lock = "requirements.txt",
784+
target_platforms = [
785+
"linux_x86_64",
786+
"osx_aarch64",
787+
],
788+
),
789+
)
790+
pypi = builder.build()
791+
792+
pypi.exposed_packages().contains_exactly(["simple"])
793+
pypi.whl_map().contains_exactly({
794+
"simple": {
795+
"pypi_315_simple_py3_none_any_deadb00f": [
796+
whl_config_setting(
797+
target_platforms = ("cp315_linux_x86_64", "cp315_osx_aarch64"),
798+
version = "3.15",
799+
),
800+
],
801+
},
802+
})
803+
pypi.whl_libraries().contains_exactly({
804+
"pypi_315_simple_py3_none_any_deadb00f": {
805+
"config_load": "@pypi//:config.bzl",
806+
"dep_template": "@pypi//{name}:{target}",
807+
"filename": "simple-0.0.1-py3-none-any.whl",
808+
"index_url": test.expect_index_url,
809+
"requirement": "simple==0.0.1",
810+
"sha256": "deadb00f",
811+
"urls": [test.expect_url],
812+
},
813+
})
814+
pypi.extra_aliases().contains_exactly({})
815+
816+
env.expect.that_dict(got_kwargs).contains_exactly({
817+
"attr": struct(
818+
auth_patterns = {},
819+
envsubst = {},
820+
extra_index_urls = test.expect_extra_index_urls,
821+
index_url = test.expect_index_url,
822+
index_url_overrides = {},
823+
netrc = None,
824+
sources = {
825+
"simple": ["0.0.1"],
826+
},
827+
),
828+
"cache": {},
829+
"parallel_download": False,
830+
})
831+
832+
_tests.append(_test_index_url_precedence)
833+
701834
def _test_download_only_multiple(env):
702835
builder = hub_builder(env)
703836
builder.pip_parse(

0 commit comments

Comments
 (0)