summaryrefslogtreecommitdiff
path: root/tests/functional/test_config_settings.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/functional/test_config_settings.py')
-rw-r--r--tests/functional/test_config_settings.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/functional/test_config_settings.py b/tests/functional/test_config_settings.py
new file mode 100644
index 000000000..b1e15c010
--- /dev/null
+++ b/tests/functional/test_config_settings.py
@@ -0,0 +1,139 @@
+import json
+from pathlib import Path
+from typing import Tuple
+from zipfile import ZipFile
+
+from tests.lib import PipTestEnvironment
+
+PYPROJECT_TOML = """\
+[build-system]
+requires = []
+build-backend = "dummy_backend:main"
+backend-path = ["backend"]
+"""
+
+BACKEND_SRC = '''
+import csv
+import json
+import os.path
+from zipfile import ZipFile
+import hashlib
+import base64
+import io
+
+WHEEL = """\
+Wheel-Version: 1.0
+Generator: dummy_backend 1.0
+Root-Is-Purelib: true
+Tag: py3-none-any
+"""
+
+METADATA = """\
+Metadata-Version: 2.1
+Name: {project}
+Version: {version}
+Summary: A dummy package
+Author: None
+Author-email: none@example.org
+License: MIT
+"""
+
+def make_wheel(z, project, version, files):
+ record = []
+ def add_file(name, data):
+ data = data.encode("utf-8")
+ z.writestr(name, data)
+ digest = hashlib.sha256(data).digest()
+ hash = base64.urlsafe_b64encode(digest).rstrip(b"=").decode("ASCII")
+ record.append((name, f"sha256={hash}", len(data)))
+ distinfo = f"{project}-{version}.dist-info"
+ add_file(f"{distinfo}/WHEEL", WHEEL)
+ add_file(f"{distinfo}/METADATA", METADATA.format(project=project, version=version))
+ for name, data in files:
+ add_file(name, data)
+ record_name = f"{distinfo}/RECORD"
+ record.append((record_name, "", ""))
+ b = io.BytesIO()
+ rec = io.TextIOWrapper(b, newline="", encoding="utf-8")
+ w = csv.writer(rec)
+ w.writerows(record)
+ z.writestr(record_name, b.getvalue())
+ rec.close()
+
+
+class Backend:
+ def build_wheel(
+ self,
+ wheel_directory,
+ config_settings=None,
+ metadata_directory=None
+ ):
+ if config_settings is None:
+ config_settings = {}
+ w = os.path.join(wheel_directory, "foo-1.0-py3-none-any.whl")
+ with open(w, "wb") as f:
+ with ZipFile(f, "w") as z:
+ make_wheel(
+ z, "foo", "1.0",
+ [("config.json", json.dumps(config_settings))]
+ )
+ return "foo-1.0-py3-none-any.whl"
+
+ build_editable = build_wheel
+
+main = Backend()
+'''
+
+
+def make_project(path: Path) -> Tuple[str, str, Path]:
+ name = "foo"
+ version = "1.0"
+ project_dir = path / name
+ backend = project_dir / "backend"
+ backend.mkdir(parents=True)
+ (project_dir / "pyproject.toml").write_text(PYPROJECT_TOML)
+ (backend / "dummy_backend.py").write_text(BACKEND_SRC)
+ return name, version, project_dir
+
+
+def test_backend_sees_config(script: PipTestEnvironment) -> None:
+ name, version, project_dir = make_project(script.scratch_path)
+ script.pip(
+ "wheel",
+ "--config-settings",
+ "FOO=Hello",
+ project_dir,
+ )
+ wheel_file_name = f"{name}-{version}-py3-none-any.whl"
+ wheel_file_path = script.cwd / wheel_file_name
+ with open(wheel_file_path, "rb") as f:
+ with ZipFile(f) as z:
+ output = z.read("config.json")
+ assert json.loads(output) == {"FOO": "Hello"}
+
+
+def test_install_sees_config(script: PipTestEnvironment) -> None:
+ _, _, project_dir = make_project(script.scratch_path)
+ script.pip(
+ "install",
+ "--config-settings",
+ "FOO=Hello",
+ project_dir,
+ )
+ config = script.site_packages_path / "config.json"
+ with open(config, "rb") as f:
+ assert json.load(f) == {"FOO": "Hello"}
+
+
+def test_install_editable_sees_config(script: PipTestEnvironment) -> None:
+ _, _, project_dir = make_project(script.scratch_path)
+ script.pip(
+ "install",
+ "--config-settings",
+ "FOO=Hello",
+ "--editable",
+ project_dir,
+ )
+ config = script.site_packages_path / "config.json"
+ with open(config, "rb") as f:
+ assert json.load(f) == {"FOO": "Hello"}