summaryrefslogtreecommitdiff
path: root/tests/unit/seed
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/seed')
-rw-r--r--tests/unit/seed/embed/test_base_embed.py13
-rw-r--r--tests/unit/seed/embed/test_bootstrap_link_via_app_data.py8
-rw-r--r--tests/unit/seed/wheels/test_acquire.py13
-rw-r--r--tests/unit/seed/wheels/test_periodic_update.py53
4 files changed, 62 insertions, 25 deletions
diff --git a/tests/unit/seed/embed/test_base_embed.py b/tests/unit/seed/embed/test_base_embed.py
index e9d61f3..a249e47 100644
--- a/tests/unit/seed/embed/test_base_embed.py
+++ b/tests/unit/seed/embed/test_base_embed.py
@@ -1,5 +1,8 @@
from __future__ import annotations
+import sys
+from pathlib import Path
+
import pytest
from virtualenv.run import session_via_cli
@@ -12,3 +15,13 @@ from virtualenv.run import session_via_cli
def test_download_cli_flag(args, download, tmp_path):
session = session_via_cli(args + [str(tmp_path)])
assert session.seeder.download is download
+
+
+def test_embed_wheel_versions(tmp_path: Path) -> None:
+ session = session_via_cli([str(tmp_path)])
+ expected = (
+ {"pip": "bundle"}
+ if sys.version_info[:2] >= (3, 12)
+ else {"pip": "bundle", "setuptools": "bundle", "wheel": "bundle"}
+ )
+ assert session.seeder.distribution_to_versions() == expected
diff --git a/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py b/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
index 610aaa2..fac9ac6 100644
--- a/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
+++ b/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
@@ -3,11 +3,13 @@ from __future__ import annotations
import contextlib
import os
import sys
+from pathlib import Path
from stat import S_IWGRP, S_IWOTH, S_IWUSR
from subprocess import Popen, check_call
from threading import Thread
import pytest
+from pytest_mock import MockerFixture
from virtualenv.discovery import cached_py_info
from virtualenv.discovery.py_info import PythonInfo
@@ -202,7 +204,7 @@ def test_populated_read_only_cache_and_copied_app_data(tmp_path, current_fastest
@pytest.mark.parametrize("pkg", ["pip", "setuptools", "wheel"])
@pytest.mark.usefixtures("session_app_data", "current_fastest", "coverage_env")
def test_base_bootstrap_link_via_app_data_no(tmp_path, pkg):
- create_cmd = [str(tmp_path), "--seeder", "app-data", f"--no-{pkg}"]
+ create_cmd = [str(tmp_path), "--seeder", "app-data", f"--no-{pkg}", "--wheel", "bundle", "--setuptools", "bundle"]
result = cli_run(create_cmd)
assert not (result.creator.purelib / pkg).exists()
for key in {"pip", "setuptools", "wheel"} - {pkg}:
@@ -216,7 +218,7 @@ def test_app_data_parallel_ok(tmp_path):
@pytest.mark.usefixtures("temp_app_data")
-def test_app_data_parallel_fail(tmp_path, mocker):
+def test_app_data_parallel_fail(tmp_path: Path, mocker: MockerFixture) -> None:
mocker.patch("virtualenv.seed.embed.via_app_data.pip_install.base.PipInstall.build_image", side_effect=RuntimeError)
exceptions = _run_parallel_threads(tmp_path)
assert len(exceptions) == 2
@@ -230,7 +232,7 @@ def _run_parallel_threads(tmp_path):
def _run(name):
try:
- cli_run(["--seeder", "app-data", str(tmp_path / name), "--no-pip", "--no-setuptools"])
+ cli_run(["--seeder", "app-data", str(tmp_path / name), "--no-pip", "--no-setuptools", "--wheel", "bundle"])
except Exception as exception:
as_str = str(exception)
exceptions.append(as_str)
diff --git a/tests/unit/seed/wheels/test_acquire.py b/tests/unit/seed/wheels/test_acquire.py
index 7f88f6a..dc471a1 100644
--- a/tests/unit/seed/wheels/test_acquire.py
+++ b/tests/unit/seed/wheels/test_acquire.py
@@ -5,8 +5,11 @@ import sys
from datetime import datetime
from pathlib import Path
from subprocess import CalledProcessError
+from typing import Callable
+from unittest.mock import MagicMock
import pytest
+from pytest_mock import MockerFixture
from virtualenv.app_data import AppDataDiskFolder
from virtualenv.seed.wheels.acquire import download_wheel, get_wheel, pip_wheel_env_run
@@ -113,8 +116,14 @@ def test_get_wheel_download_not_called(mocker, for_py_version, session_app_data,
assert write.call_count == 0
-@pytest.mark.usefixtures("freezer")
-def test_get_wheel_download_cached(tmp_path, mocker, for_py_version, downloaded_wheel):
+def test_get_wheel_download_cached(
+ tmp_path: Path,
+ mocker: MockerFixture,
+ for_py_version: str,
+ downloaded_wheel: tuple[Wheel, MagicMock],
+ time_freeze: Callable[[datetime], None],
+) -> None:
+ time_freeze(datetime.now())
from virtualenv.app_data.via_disk_folder import JSONStoreDisk
app_data = AppDataDiskFolder(folder=str(tmp_path))
diff --git a/tests/unit/seed/wheels/test_periodic_update.py b/tests/unit/seed/wheels/test_periodic_update.py
index 82c86e3..d4a5e09 100644
--- a/tests/unit/seed/wheels/test_periodic_update.py
+++ b/tests/unit/seed/wheels/test_periodic_update.py
@@ -68,7 +68,7 @@ def test_manual_upgrade(session_app_data, caplog, mocker, for_py_version):
@pytest.mark.usefixtures("session_app_data")
def test_pick_periodic_update(tmp_path, mocker, for_py_version):
- embed, current = get_embed_wheel("setuptools", "3.5"), get_embed_wheel("setuptools", for_py_version)
+ embed, current = get_embed_wheel("setuptools", "3.6"), get_embed_wheel("setuptools", for_py_version)
mocker.patch("virtualenv.seed.wheels.bundle.load_embed_wheel", return_value=embed)
completed = datetime.now() - timedelta(days=29)
u_log = UpdateLog(
@@ -79,7 +79,20 @@ def test_pick_periodic_update(tmp_path, mocker, for_py_version):
)
read_dict = mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.read", return_value=u_log.to_dict())
- result = cli_run([str(tmp_path), "--activators", "", "--no-periodic-update", "--no-wheel", "--no-pip"])
+ result = cli_run(
+ [
+ str(tmp_path),
+ "--activators",
+ "",
+ "--no-periodic-update",
+ "--no-wheel",
+ "--no-pip",
+ "--setuptools",
+ "bundle",
+ "--wheel",
+ "bundle",
+ ],
+ )
assert read_dict.call_count == 1
installed = [i.name for i in result.creator.purelib.iterdir() if i.suffix == ".dist-info"]
@@ -208,8 +221,8 @@ _UPDATE_SKIP = {
@pytest.mark.parametrize("u_log", list(_UPDATE_SKIP.values()), ids=list(_UPDATE_SKIP.keys()))
-def test_periodic_update_skip(u_log, mocker, for_py_version, session_app_data, freezer):
- freezer.move_to(_UP_NOW)
+def test_periodic_update_skip(u_log, mocker, for_py_version, session_app_data, time_freeze):
+ time_freeze(_UP_NOW)
mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.read", return_value=u_log.to_dict())
mocker.patch("virtualenv.seed.wheels.periodic_update.trigger_update", side_effect=RuntimeError)
@@ -235,8 +248,8 @@ _UPDATE_YES = {
@pytest.mark.parametrize("u_log", list(_UPDATE_YES.values()), ids=list(_UPDATE_YES.keys()))
-def test_periodic_update_trigger(u_log, mocker, for_py_version, session_app_data, freezer):
- freezer.move_to(_UP_NOW)
+def test_periodic_update_trigger(u_log, mocker, for_py_version, session_app_data, time_freeze):
+ time_freeze(_UP_NOW)
mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.read", return_value=u_log.to_dict())
write = mocker.patch("virtualenv.app_data.via_disk_folder.JSONStoreDisk.write")
trigger_update_ = mocker.patch("virtualenv.seed.wheels.periodic_update.trigger_update")
@@ -343,8 +356,8 @@ def test_trigger_update_debug(for_py_version, session_app_data, tmp_path, mocker
assert process.communicate.call_count == 1
-def test_do_update_first(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW)
+def test_do_update_first(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW)
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
extra = tmp_path / "extra"
@@ -421,8 +434,8 @@ def test_do_update_first(tmp_path, mocker, freezer):
}
-def test_do_update_skip_already_done(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW + timedelta(hours=1))
+def test_do_update_skip_already_done(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW + timedelta(hours=1))
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
extra = tmp_path / "extra"
@@ -535,8 +548,8 @@ def mock_download(mocker, pip_version_remote):
)
-def test_download_stop_with_embed(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW)
+def test_download_stop_with_embed(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW)
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
pip_version_remote = [wheel_path(wheel, (0, 0, 2)), wheel_path(wheel, (0, 0, 1)), wheel_path(wheel, (-1, 0, 0))]
@@ -558,8 +571,8 @@ def test_download_stop_with_embed(tmp_path, mocker, freezer):
assert write.call_count == 1
-def test_download_manual_stop_after_one_download(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW)
+def test_download_manual_stop_after_one_download(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW)
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
pip_version_remote = [wheel_path(wheel, (0, 1, 1))]
@@ -580,8 +593,8 @@ def test_download_manual_stop_after_one_download(tmp_path, mocker, freezer):
assert write.call_count == 1
-def test_download_manual_ignores_pre_release(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW)
+def test_download_manual_ignores_pre_release(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW)
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
pip_version_remote = [wheel_path(wheel, (0, 0, 1))]
@@ -613,8 +626,8 @@ def test_download_manual_ignores_pre_release(tmp_path, mocker, freezer):
]
-def test_download_periodic_stop_at_first_usable(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW)
+def test_download_periodic_stop_at_first_usable(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW)
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
pip_version_remote = [wheel_path(wheel, (0, 1, 1)), wheel_path(wheel, (0, 1, 0))]
@@ -641,8 +654,8 @@ def test_download_periodic_stop_at_first_usable(tmp_path, mocker, freezer):
assert write.call_count == 1
-def test_download_periodic_stop_at_first_usable_with_previous_minor(tmp_path, mocker, freezer):
- freezer.move_to(_UP_NOW)
+def test_download_periodic_stop_at_first_usable_with_previous_minor(tmp_path, mocker, time_freeze):
+ time_freeze(_UP_NOW)
wheel = get_embed_wheel("pip", "3.9")
app_data_outer = AppDataDiskFolder(str(tmp_path / "app"))
pip_version_remote = [wheel_path(wheel, (0, 1, 1)), wheel_path(wheel, (0, 1, 0)), wheel_path(wheel, (0, -1, 0))]