Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions src/poetry/console/commands/publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,13 @@ def handle(self) -> int:

# Building package first, if told
if self.option("build"):
if publisher.files and not self.confirm(
f"There are <info>{len(publisher.files)}</info> files ready for"
" publishing. Build anyway?"
if (
publisher.files
and self.io.is_interactive()
and not self.confirm(
f"There are <info>{len(publisher.files)}</info> files ready for"
" publishing. Build anyway?"
)
):
self.line_error("<error>Aborted!</error>")

Expand Down
26 changes: 26 additions & 0 deletions tests/console/commands/test_publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from pathlib import Path
from typing import TYPE_CHECKING
from typing import NoReturn
from unittest.mock import PropertyMock

import pytest
import requests
Expand Down Expand Up @@ -215,3 +216,28 @@ def test_publish_dist_dir_and_build_options(
assert "Publishing simple-project (1.2.3) to PyPI" in output
assert "- Uploading simple_project-1.2.3.tar.gz" in error
assert "- Uploading simple_project-1.2.3-py2.py3-none-any.whl" in error


def test_publish_build_no_interaction_skips_confirmation(
app_tester: ApplicationTester, mocker: MockerFixture
) -> None:
mocker.patch(
"poetry.publishing.publisher.Publisher.files",
new_callable=PropertyMock,
return_value=[Path("dist/simple_project-1.2.3-py2.py3-none-any.whl")],
)
confirm = mocker.patch("poetry.console.commands.publish.PublishCommand.confirm")
command_call = mocker.patch("poetry.console.commands.publish.PublishCommand.call")
Comment on lines +221 to +230
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Also assert that the confirmation prompt text is not present in the command output

To better cover the user-facing behavior, please also assert that the confirmation prompt text (e.g. "Build anyway?") does not appear in stdout/stderr when running with --no-interaction, by capturing the app_tester output as done in other tests.

publisher_publish = mocker.patch("poetry.publishing.Publisher.publish")

exit_code = app_tester.execute("publish --build --no-interaction --dry-run")

assert exit_code == 0
output = app_tester.io.fetch_output()
error = app_tester.io.fetch_error()

confirm.assert_not_called()
assert "Build anyway?" not in output
assert "Build anyway?" not in error
command_call.assert_called_once_with("build", args="--output dist")
assert publisher_publish.call_count == 1