fix: suppress traceback in shell if no ipython installed

Old implementation was showing import error, new implementation instead
hides it behind separated call and if-else check
This commit is contained in:
2025-01-06 01:07:13 +02:00
parent 0423c3e67c
commit ed70897c39
2 changed files with 36 additions and 6 deletions

View File

@ -1,14 +1,30 @@
import pytest
from pytest_mock import MockerFixture
from ahriman.application.interactive_shell import InteractiveShell
def test_has_ipython(mocker: MockerFixture) -> None:
"""
must correctly check if IPython is installed
"""
find_spec_mock = mocker.patch("ahriman.application.interactive_shell.find_spec")
assert InteractiveShell.has_ipython()
find_spec_mock.assert_called_once_with("IPython.terminal.embed")
def test_has_ipython_module_not_found(mocker: MockerFixture) -> None:
"""
must return False if IPython is not installed
"""
mocker.patch("ahriman.application.interactive_shell.find_spec", side_effect=ModuleNotFoundError)
assert not InteractiveShell.has_ipython()
def test_interact(mocker: MockerFixture) -> None:
"""
must call IPython shell
"""
mocker.patch("ahriman.application.interactive_shell.InteractiveShell.has_ipython", return_value=True)
banner_mock = mocker.patch("IPython.terminal.embed.InteractiveShellEmbed.show_banner")
interact_mock = mocker.patch("IPython.terminal.embed.InteractiveShellEmbed.interact")
@ -18,11 +34,11 @@ def test_interact(mocker: MockerFixture) -> None:
interact_mock.assert_called_once_with()
def test_interact_import_error(mocker: MockerFixture) -> None:
def test_interact_no_ipython(mocker: MockerFixture) -> None:
"""
must call builtin shell if no IPython available
"""
pytest.helpers.import_error("IPython.terminal.embed", ["InteractiveShellEmbed"], mocker)
mocker.patch("ahriman.application.interactive_shell.InteractiveShell.has_ipython", return_value=None)
interact_mock = mocker.patch("code.InteractiveConsole.interact")
shell = InteractiveShell()