|
6 | 6 | import sys |
7 | 7 | import winreg |
8 | 8 |
|
9 | | -from pathlib import Path |
| 9 | +from pathlib import Path, PurePath |
10 | 10 |
|
11 | 11 | TESTS = Path(__file__).absolute().parent |
12 | 12 |
|
|
18 | 18 | setattr(_native, k, getattr(_native_test, k)) |
19 | 19 |
|
20 | 20 |
|
| 21 | +# Importing in order carefully to ensure the variables we override are handled |
| 22 | +# correctly by submodules. |
21 | 23 | import manage |
22 | 24 | manage.EXE_NAME = "pymanager-pytest" |
23 | 25 |
|
24 | | - |
25 | 26 | import manage.commands |
26 | 27 | manage.commands.WELCOME = "" |
27 | 28 |
|
28 | | - |
29 | | -from manage.logging import LOGGER, DEBUG |
| 29 | +from manage.logging import LOGGER, DEBUG, ERROR |
30 | 30 | LOGGER.level = DEBUG |
31 | 31 |
|
| 32 | +import manage.config |
| 33 | +import manage.installs |
| 34 | + |
| 35 | + |
| 36 | +# Ensure we don't pick up any settings from configs or the registry |
| 37 | + |
| 38 | +def _mock_load_global_config(cfg, schema): |
| 39 | + cfg.update({ |
| 40 | + "base_config": "", |
| 41 | + "user_config": "", |
| 42 | + "additional_config": "", |
| 43 | + }) |
| 44 | + |
| 45 | +def _mock_load_registry_config(key, schema): |
| 46 | + return {} |
| 47 | + |
| 48 | +manage.config.load_global_config = _mock_load_global_config |
| 49 | +manage.config.load_registry_config = _mock_load_registry_config |
| 50 | + |
| 51 | + |
| 52 | +@pytest.fixture |
| 53 | +def quiet_log(): |
| 54 | + lvl = LOGGER.level |
| 55 | + LOGGER.level = ERROR |
| 56 | + try: |
| 57 | + yield |
| 58 | + finally: |
| 59 | + LOGGER.level = lvl |
| 60 | + |
| 61 | + |
32 | 62 | class LogCaptureHandler(list): |
33 | 63 | def skip_until(self, pattern, args=()): |
34 | 64 | return ('until', pattern, args) |
35 | 65 |
|
| 66 | + def not_logged(self, pattern, args=()): |
| 67 | + return ('not', pattern, args) |
| 68 | + |
36 | 69 | def __call__(self, *cmp): |
37 | | - it1 = iter(self) |
| 70 | + i = 0 |
38 | 71 | for y in cmp: |
39 | 72 | if not isinstance(y, tuple): |
40 | | - op, pat, args = None, y, [] |
| 73 | + op, pat, args = None, y, None |
41 | 74 | elif len(y) == 3: |
42 | 75 | op, pat, args = y |
43 | 76 | elif len(y) == 2: |
44 | 77 | op = None |
45 | 78 | pat, args = y |
46 | 79 |
|
| 80 | + if op == 'not': |
| 81 | + for j in range(i, len(self)): |
| 82 | + if re.match(pat, self[j][0], flags=re.S): |
| 83 | + pytest.fail(f"Should not have found {self[j][0]!r} matching {pat}") |
| 84 | + return |
| 85 | + continue |
| 86 | + |
47 | 87 | while True: |
48 | 88 | try: |
49 | | - x = next(it1) |
50 | | - except StopIteration: |
| 89 | + x = self[i] |
| 90 | + i += 1 |
| 91 | + except IndexError: |
51 | 92 | pytest.fail(f"Not enough elements were logged looking for {pat}") |
52 | | - if op == 'until' and not re.match(pat, x[0]): |
| 93 | + if op == 'until' and not re.match(pat, x[0], flags=re.S): |
53 | 94 | continue |
54 | | - assert re.match(pat, x[0]) |
55 | | - assert tuple(x[1]) == tuple(args) |
| 95 | + assert re.match(pat, x[0], flags=re.S) |
| 96 | + if args is not None: |
| 97 | + assert tuple(x[1]) == tuple(args) |
56 | 98 | break |
57 | 99 |
|
58 | 100 |
|
@@ -150,3 +192,67 @@ def setup(self, _subkey=None, **keys): |
150 | 192 | def registry(): |
151 | 193 | with RegistryFixture(winreg.HKEY_CURRENT_USER, REG_TEST_ROOT) as key: |
152 | 194 | yield key |
| 195 | + |
| 196 | + |
| 197 | + |
| 198 | +def make_install(tag, **kwargs): |
| 199 | + run_for = [] |
| 200 | + for t in kwargs.get("run_for", [tag]): |
| 201 | + run_for.append({"tag": t, "target": kwargs.get("target", "python.exe")}) |
| 202 | + run_for.append({"tag": t, "target": kwargs.get("targetw", "pythonw.exe"), "windowed": 1}) |
| 203 | + |
| 204 | + return { |
| 205 | + "company": kwargs.get("company", "PythonCore"), |
| 206 | + "id": "{}-{}".format(kwargs.get("company", "PythonCore"), tag), |
| 207 | + "sort-version": kwargs.get("sort_version", tag), |
| 208 | + "display-name": "{} {}".format(kwargs.get("company", "Python"), tag), |
| 209 | + "tag": tag, |
| 210 | + "install-for": [tag], |
| 211 | + "run-for": run_for, |
| 212 | + "prefix": PurePath(kwargs.get("prefix", rf"C:\{tag}")), |
| 213 | + "executable": kwargs.get("executable", "python.exe"), |
| 214 | + } |
| 215 | + |
| 216 | + |
| 217 | +def fake_get_installs(install_dir): |
| 218 | + yield make_install("1.0") |
| 219 | + yield make_install("1.0-32", sort_version="1.0") |
| 220 | + yield make_install("1.0-64", sort_version="1.0") |
| 221 | + yield make_install("2.0-64", sort_version="2.0") |
| 222 | + yield make_install("2.0-arm64", sort_version="2.0") |
| 223 | + yield make_install("3.0a1-32", sort_version="3.0a1") |
| 224 | + yield make_install("3.0a1-64", sort_version="3.0a1") |
| 225 | + yield make_install("1.1", company="Company", target="company.exe", targetw="companyw.exe") |
| 226 | + yield make_install("1.1-64", sort_version="1.1", company="Company", target="company.exe", targetw="companyw.exe") |
| 227 | + yield make_install("1.1-arm64", sort_version="1.1", company="Company", target="company.exe", targetw="companyw.exe") |
| 228 | + yield make_install("2.1", sort_version="2.1", company="Company", target="company.exe", targetw="companyw.exe") |
| 229 | + yield make_install("2.1-64", sort_version="2.1", company="Company", target="company.exe", targetw="companyw.exe") |
| 230 | + |
| 231 | + |
| 232 | +def fake_get_installs2(install_dir): |
| 233 | + yield make_install("1.0-32", sort_version="1.0") |
| 234 | + yield make_install("3.0a1-32", sort_version="3.0a1", run_for=["3.0.1a1-32", "3.0-32", "3-32"]) |
| 235 | + yield make_install("3.0a1-64", sort_version="3.0a1", run_for=["3.0.1a1-64", "3.0-64", "3-64"]) |
| 236 | + yield make_install("3.0a1-arm64", sort_version="3.0a1", run_for=["3.0.1a1-arm64", "3.0-arm64", "3-arm64"]) |
| 237 | + |
| 238 | + |
| 239 | +def fake_get_unmanaged_installs(): |
| 240 | + return [] |
| 241 | + |
| 242 | + |
| 243 | +def fake_get_venv_install(virtualenv): |
| 244 | + raise LookupError |
| 245 | + |
| 246 | + |
| 247 | +@pytest.fixture |
| 248 | +def patched_installs(monkeypatch): |
| 249 | + monkeypatch.setattr(manage.installs, "_get_installs", fake_get_installs) |
| 250 | + monkeypatch.setattr(manage.installs, "_get_unmanaged_installs", fake_get_unmanaged_installs) |
| 251 | + monkeypatch.setattr(manage.installs, "_get_venv_install", fake_get_venv_install) |
| 252 | + |
| 253 | + |
| 254 | +@pytest.fixture |
| 255 | +def patched_installs2(monkeypatch): |
| 256 | + monkeypatch.setattr(manage.installs, "_get_installs", fake_get_installs2) |
| 257 | + monkeypatch.setattr(manage.installs, "_get_unmanaged_installs", fake_get_unmanaged_installs) |
| 258 | + monkeypatch.setattr(manage.installs, "_get_venv_install", fake_get_venv_install) |
0 commit comments