diff --git a/src/poetry/installation/installer.py b/src/poetry/installation/installer.py index e8a963acd71..975b7526135 100644 --- a/src/poetry/installation/installer.py +++ b/src/poetry/installation/installer.py @@ -337,8 +337,8 @@ def _do_install(self, local_repo: Repository) -> int: # Execute operations return self._execute(ops) - def _write_lock_file(self, repo: Repository, force: bool = True) -> None: - if force or (self._update and self._write_lock): + def _write_lock_file(self, repo: Repository, force: bool = False) -> None: + if self._write_lock and (force or self._update): updated_lock = self._locker.set_lock_data(self._package, repo.packages) if updated_lock: diff --git a/tests/console/commands/plugin/test_remove.py b/tests/console/commands/plugin/test_remove.py index 01cdc9017f6..646ad50de5a 100644 --- a/tests/console/commands/plugin/test_remove.py +++ b/tests/console/commands/plugin/test_remove.py @@ -122,8 +122,6 @@ def test_remove_installed_package_dry_run( Updating dependencies Resolving dependencies... -Writing lock file - Package operations: 0 installs, 0 updates, 1 removal • Removing poetry-plugin (1.2.3) diff --git a/tests/console/commands/test_add.py b/tests/console/commands/test_add.py index a3b3e331a91..dd9dd52177c 100644 --- a/tests/console/commands/test_add.py +++ b/tests/console/commands/test_add.py @@ -25,6 +25,21 @@ from tests.helpers import PoetryTestApplication from tests.helpers import TestRepository from tests.types import CommandTesterFactory + from tests.types import FixtureDirGetter + from tests.types import ProjectFactory + + +@pytest.fixture +def poetry_with_up_to_date_lockfile( + project_factory: ProjectFactory, fixture_dir: FixtureDirGetter +) -> Poetry: + source = fixture_dir("up_to_date_lock") + + return project_factory( + name="foobar", + pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"), + poetry_lock_content=(source / "poetry.lock").read_text(encoding="utf-8"), + ) @pytest.fixture() @@ -1999,34 +2014,54 @@ def test_add_with_lock_old_installer( def test_add_keyboard_interrupt_restore_content( - app: PoetryTestApplication, + poetry_with_up_to_date_lockfile: Poetry, repo: TestRepository, - installer: NoopInstaller, - tester: CommandTester, + command_tester_factory: CommandTesterFactory, mocker: MockerFixture, ): + tester = command_tester_factory("add", poetry=poetry_with_up_to_date_lockfile) + mocker.patch( "poetry.installation.installer.Installer.run", side_effect=KeyboardInterrupt() ) - original_content = app.poetry.file.read() + original_pyproject_content = poetry_with_up_to_date_lockfile.file.read() + original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data repo.add_package(get_package("cachy", "0.2.0")) + repo.add_package(get_package("docker", "4.3.1")) - tester.execute("cachy --dry-run") + tester.execute("cachy") - assert original_content == app.poetry.file.read() + assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content + assert ( + poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content + ) -def test_dry_run_restore_original_content( - app: PoetryTestApplication, +@pytest.mark.parametrize( + "command", + [ + "cachy --dry-run", + "cachy --lock --dry-run", + ], +) +def test_add_with_dry_run_keep_files_intact( + command: str, + poetry_with_up_to_date_lockfile: Poetry, repo: TestRepository, - installer: NoopInstaller, - tester: CommandTester, + command_tester_factory: CommandTesterFactory, ): - original_content = app.poetry.file.read() + tester = command_tester_factory("add", poetry=poetry_with_up_to_date_lockfile) + + original_pyproject_content = poetry_with_up_to_date_lockfile.file.read() + original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data repo.add_package(get_package("cachy", "0.2.0")) + repo.add_package(get_package("docker", "4.3.1")) - tester.execute("cachy --dry-run") + tester.execute(command) - assert original_content == app.poetry.file.read() + assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content + assert ( + poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content + ) diff --git a/tests/console/commands/test_remove.py b/tests/console/commands/test_remove.py index a16854c4b89..4911fac7aba 100644 --- a/tests/console/commands/test_remove.py +++ b/tests/console/commands/test_remove.py @@ -8,16 +8,33 @@ from poetry.core.packages.package import Package from poetry.factory import Factory +from tests.helpers import get_package if TYPE_CHECKING: from cleo.testers.command_tester import CommandTester from pytest_mock import MockerFixture + from poetry.poetry import Poetry from poetry.repositories import Repository from tests.helpers import PoetryTestApplication from tests.helpers import TestRepository from tests.types import CommandTesterFactory + from tests.types import FixtureDirGetter + from tests.types import ProjectFactory + + +@pytest.fixture +def poetry_with_up_to_date_lockfile( + project_factory: ProjectFactory, fixture_dir: FixtureDirGetter +) -> Poetry: + source = fixture_dir("up_to_date_lock") + + return project_factory( + name="foobar", + pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"), + poetry_lock_content=(source / "poetry.lock").read_text(encoding="utf-8"), + ) @pytest.fixture() @@ -256,3 +273,23 @@ def test_remove_command_should_not_write_changes_upon_installer_errors( tester.execute("foo") assert app.poetry.file.read().as_string() == original_content + + +def test_remove_with_dry_run_keep_files_intact( + poetry_with_up_to_date_lockfile: Poetry, + repo: TestRepository, + command_tester_factory: CommandTesterFactory, +): + tester = command_tester_factory("remove", poetry=poetry_with_up_to_date_lockfile) + + original_pyproject_content = poetry_with_up_to_date_lockfile.file.read() + original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data + + repo.add_package(get_package("docker", "4.3.1")) + + tester.execute("docker --dry-run") + + assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content + assert ( + poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content + ) diff --git a/tests/console/commands/test_update.py b/tests/console/commands/test_update.py new file mode 100644 index 00000000000..dd3306cf2ba --- /dev/null +++ b/tests/console/commands/test_update.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +from tests.helpers import get_package + + +if TYPE_CHECKING: + from poetry.poetry import Poetry + from tests.helpers import TestRepository + from tests.types import CommandTesterFactory + from tests.types import FixtureDirGetter + from tests.types import ProjectFactory + + +@pytest.fixture +def poetry_with_up_to_date_lockfile( + project_factory: ProjectFactory, fixture_dir: FixtureDirGetter +) -> Poetry: + source = fixture_dir("outdated_lock") + + return project_factory( + name="foobar", + pyproject_content=(source / "pyproject.toml").read_text(encoding="utf-8"), + poetry_lock_content=(source / "poetry.lock").read_text(encoding="utf-8"), + ) + + +@pytest.mark.parametrize( + "command", + [ + "--dry-run", + "docker --dry-run", + ], +) +def test_update_with_dry_run_keep_files_intact( + command: str, + poetry_with_up_to_date_lockfile: Poetry, + repo: TestRepository, + command_tester_factory: CommandTesterFactory, +): + tester = command_tester_factory("update", poetry=poetry_with_up_to_date_lockfile) + + original_pyproject_content = poetry_with_up_to_date_lockfile.file.read() + original_lockfile_content = poetry_with_up_to_date_lockfile._locker.lock_data + + repo.add_package(get_package("docker", "4.3.0")) + repo.add_package(get_package("docker", "4.3.1")) + + tester.execute(command) + + assert poetry_with_up_to_date_lockfile.file.read() == original_pyproject_content + assert ( + poetry_with_up_to_date_lockfile._locker.lock_data == original_lockfile_content + )