import contextlib import platform as platform_module import subprocess import sys from pathlib import Path import pytest from cibuildwheel import linux, macos, util, windows class ArgsInterceptor: def __call__(self, *args, **kwargs): self.args = args self.kwargs = kwargs MOCK_PACKAGE_DIR = Path("some_package_dir") @pytest.fixture(autouse=True) def mock_protection(monkeypatch): """ Ensure that a unit test will never actually run a cibuildwheel 'build' function, which shouldn't be run on a developer's machine """ def fail_on_call(*args, **kwargs): raise RuntimeError("This should never be called") def ignore_call(*args, **kwargs): pass monkeypatch.setattr(subprocess, "Popen", fail_on_call) monkeypatch.setattr(util, "download", fail_on_call) monkeypatch.setattr(windows, "build", fail_on_call) monkeypatch.setattr(linux, "build", fail_on_call) monkeypatch.setattr(macos, "build", fail_on_call) monkeypatch.setattr(Path, "mkdir", ignore_call) @pytest.fixture(autouse=True) def fake_package_dir(monkeypatch): """ Monkey-patch enough for the main() function to run """ real_path_exists = Path.exists def mock_path_exists(path): if path == MOCK_PACKAGE_DIR / "setup.py": return True else: return real_path_exists(path) args = ["cibuildwheel", str(MOCK_PACKAGE_DIR)] monkeypatch.setattr(Path, "exists", mock_path_exists) monkeypatch.setattr(sys, "argv", args) return args @pytest.fixture(autouse=True) def disable_print_wheels(monkeypatch): @contextlib.contextmanager def empty_cm(*args, **kwargs): yield monkeypatch.setattr(util, "print_new_wheels", empty_cm) @pytest.fixture def allow_empty(request, monkeypatch, fake_package_dir): monkeypatch.setattr(sys, "argv", fake_package_dir + ["--allow-empty"]) @pytest.fixture(params=["linux", "macos", "windows"]) def platform(request, monkeypatch): platform_value = request.param monkeypatch.setenv("CIBW_PLATFORM", platform_value) if platform_value == "windows": monkeypatch.setattr(platform_module, "machine", lambda: "AMD64") else: monkeypatch.setattr(platform_module, "machine", lambda: "x86_64") if platform_value == "macos": monkeypatch.setattr(macos, "get_macos_version", lambda: (11, 1)) return platform_value @pytest.fixture def intercepted_build_args(platform, monkeypatch): intercepted = ArgsInterceptor() if platform == "linux": monkeypatch.setattr(linux, "build", intercepted) elif platform == "macos": monkeypatch.setattr(macos, "build", intercepted) elif platform == "windows": monkeypatch.setattr(windows, "build", intercepted) else: raise ValueError(f"unknown platform value: {platform}") return intercepted