blob: a19a9fcfbe4718c90dfcffe7f15685b4f8abfd00 [file]
"""Integration test for Unified PyPI Hub dynamic dependency resolution."""
import contextlib
import unittest
from tests.integration import runner
class UnifiedPypiTest(runner.TestCase):
def test_default_fallback_hub(self):
self.run_bazel("test", "//:test_default")
def test_transitioned_hub(self):
self.run_bazel("test", "//:test_a")
def test_cli_override(self):
self.run_bazel(
"run",
"--@rules_python//python/config_settings:venv=pypi_a",
"//:test_cli",
)
def test_disjoint_package_cquery_succeeds_but_build_fails(self):
self.run_bazel("cquery", "//:bin_six_a")
result = self.run_bazel("build", "//:bin_six_a", check=False)
self.assertNotEqual(
result.exit_code,
0,
"Expected build to fail during execution phase",
)
self.assert_result_matches(
result,
'ERROR: PyPI package "six" is not available when building under PyPI hub "pypi_a"\\. Try adding it to the requirements of this hub',
)
def test_sibling_extra_alias_cquery_succeeds_but_build_fails(self):
self.run_bazel("cquery", "//:bin_extra_b")
result = self.run_bazel("build", "//:bin_extra_b", check=False)
self.assertNotEqual(
result.exit_code,
0,
"Expected build to fail during execution phase",
)
self.assert_result_matches(
result,
'ERROR: PyPI package "colorama:my_colorama" is not available when building under PyPI hub "pypi_b"\\. Try adding it to the requirements of this hub',
)
@contextlib.contextmanager
def _temp_modify_file(self, path, new_content):
original_content = path.read_text()
path.write_text(new_content)
try:
yield
finally:
path.write_text(original_content)
def test_invalid_default_hub_fails_evaluation(self):
module_bazel = self.repo_root / "MODULE.bazel"
invalid_content = module_bazel.read_text().replace(
'pip.default(default_hub = "pypi_b")',
'pip.default(default_hub = "invalid_hub")',
)
with self._temp_modify_file(module_bazel, invalid_content):
# Run bazel cquery and expect it to fail during loading/extension phase
result = self.run_bazel("cquery", "//:test_default", check=False)
self.assertNotEqual(
result.exit_code,
0,
"Expected extension evaluation to fail due to invalid default_hub",
)
self.assert_result_matches(
result,
"default_hub 'invalid_hub' is not a defined PyPI hub",
)
def test_unimplemented_declared_dep_fails_build(self):
# Even though cquery succeeds:
self.run_bazel("cquery", "//:bin_declared_only")
# Build must fail because the package is not implemented by any concrete hub
result = self.run_bazel("build", "//:bin_declared_only", check=False)
self.assertNotEqual(result.exit_code, 0)
self.assert_result_matches(
result,
'ERROR: PyPI package "declared_only_pkg" is not available when building under PyPI hub "pypi_b"\\. Try adding it to the requirements of this hub',
)
def test_unimplemented_declared_dep_alias_fails_build(self):
# Build must fail for alias too
result = self.run_bazel("build", "//:bin_declared_only_alias", check=False)
self.assertNotEqual(result.exit_code, 0)
self.assert_result_matches(
result,
'ERROR: PyPI package "declared_only_pkg:declared-only-alias" is not available when building under PyPI hub "pypi_b"\\. Try adding it to the requirements of this hub',
)
if __name__ == "__main__":
unittest.main()