diff options
Diffstat (limited to 'tests/unit/seed')
-rw-r--r-- | tests/unit/seed/embed/test_base_embed.py | 13 | ||||
-rw-r--r-- | tests/unit/seed/embed/test_bootstrap_link_via_app_data.py | 8 | ||||
-rw-r--r-- | tests/unit/seed/wheels/test_acquire.py | 13 | ||||
-rw-r--r-- | tests/unit/seed/wheels/test_periodic_update.py | 53 |
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))] |