from id_configurator.config import Configuration from id_configurator.context import Context from id_configurator.modules.python import PythonModule ONE_REPO_CONFIG = { "uuid": "12345678-1234-5678-1234-567812345678", "organisation": "InterDiode", "configurations": { "python": { "repositories": [ {"name": "interdiode", "index-url": "https://example.invalid/simple"} ] } }, } TWO_REPOS_CONFIG = { "uuid": "12345678-1234-5678-1234-567812345678", "organisation": "InterDiode", "configurations": { "python": { "repositories": [ {"name": "interdiode", "index-url": "https://example.invalid/simple"}, { "name": "interdiode-extra", "index-url": "https://example2.invalid/simple", }, ] } }, } def test_is_relevant_false_without_repositories(tmp_path) -> None: config = Configuration.model_validate( {"uuid": "12345678-1234-5678-1234-567812345678", "organisation": "InterDiode"} ) context = Context(config=config, dst=tmp_path / "dst", src=None) assert PythonModule().is_relevant(context) is False def test_is_relevant_true_with_repositories(tmp_path) -> None: config = Configuration.model_validate(ONE_REPO_CONFIG) context = Context(config=config, dst=tmp_path / "dst", src=None) assert PythonModule().is_relevant(context) is True def test_apply_single_repository(tmp_path) -> None: config = Configuration.model_validate(ONE_REPO_CONFIG) dst = tmp_path / "dst" context = Context(config=config, dst=dst, src=None) PythonModule().apply(context) pip_conf = (dst / "etc/pip.conf").read_text(encoding="utf-8") assert pip_conf == ( "[global]\nindex-url = https://example.invalid/simple\ncert = /etc/ssl/certs/ca-certificates.crt\n" ) uv_toml = (dst / "etc/uv/uv.toml").read_text(encoding="utf-8") assert uv_toml == ( 'native-tls = true\n\n[[index]]\nname = "interdiode"\nurl = "https://example.invalid/simple"\ndefault = true\n' ) poetry_config = (dst / "root/.config/pypoetry/config.toml").read_text( encoding="utf-8" ) assert poetry_config == ( "[repositories.interdiode]\n" 'url = "https://example.invalid/simple"\n' "\n" "[certificates.interdiode]\n" 'cert = "/etc/ssl/certs/ca-certificates.crt"\n' ) assert not (dst / "usr/lib").exists() def test_apply_multiple_repositories(tmp_path) -> None: config = Configuration.model_validate(TWO_REPOS_CONFIG) dst = tmp_path / "dst" context = Context(config=config, dst=dst, src=None) PythonModule().apply(context) pip_conf = (dst / "etc/pip.conf").read_text(encoding="utf-8") assert pip_conf == ( "[global]\n" "index-url = https://example.invalid/simple\n" "extra-index-url =\n" " https://example2.invalid/simple\n" "cert = /etc/ssl/certs/ca-certificates.crt\n" ) uv_toml = (dst / "etc/uv/uv.toml").read_text(encoding="utf-8") assert uv_toml == ( "native-tls = true\n\n" "[[index]]\n" 'name = "interdiode"\n' 'url = "https://example.invalid/simple"\n' "default = true\n\n" "[[index]]\n" 'name = "interdiode-extra"\n' 'url = "https://example2.invalid/simple"\n' ) def test_apply_writes_poetry_config_for_each_configured_user(tmp_path) -> None: config = Configuration.model_validate(ONE_REPO_CONFIG) dst = tmp_path / "dst" context = Context(config=config, dst=dst, src=None, users=["alice"]) PythonModule().apply(context) root_content = (dst / "root/.config/pypoetry/config.toml").read_text( encoding="utf-8" ) alice_content = (dst / "home/alice/.config/pypoetry/config.toml").read_text( encoding="utf-8" ) assert alice_content == root_content def test_apply_writes_distutils_cfg_for_detected_python_prefixes(tmp_path) -> None: config = Configuration.model_validate(ONE_REPO_CONFIG) src = tmp_path / "src" (src / "usr/lib/python3.11").mkdir(parents=True) (src / "usr/local/lib/python3.12").mkdir(parents=True) (src / "usr/lib/not-python").mkdir(parents=True) dst = tmp_path / "dst" context = Context(config=config, dst=dst, src=src) PythonModule().apply(context) content_311 = (dst / "usr/lib/python3.11/distutils/distutils.cfg").read_text( encoding="utf-8" ) assert content_311 == "[easy_install]\nindex_url = https://example.invalid/simple\n" content_312 = (dst / "usr/local/lib/python3.12/distutils/distutils.cfg").read_text( encoding="utf-8" ) assert content_312 == "[easy_install]\nindex_url = https://example.invalid/simple\n" assert not (dst / "usr/lib/not-python").exists() def test_apply_without_src_skips_distutils_cfg(tmp_path) -> None: config = Configuration.model_validate(ONE_REPO_CONFIG) dst = tmp_path / "dst" context = Context(config=config, dst=dst, src=None) PythonModule().apply(context) assert not (dst / "usr").exists()