1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
from unittest import mock
from IPython.terminal.interactiveshell import TerminalInteractiveShell
import pytest
from napari_console import QtConsole
@pytest.fixture
def make_test_viewer(qtbot, request):
from napari import Viewer
viewers = []
def actual_factory(*model_args, viewer_class=Viewer, **model_kwargs):
model_kwargs.setdefault('show', False)
viewer = viewer_class(*model_args, **model_kwargs)
viewers.append(viewer)
return viewer
yield actual_factory
for viewer in viewers:
viewer.close()
def test_console(qtbot, make_test_viewer):
"""Test creating the console."""
viewer = make_test_viewer()
style_sheet = viewer.window._qt_window.styleSheet()
console = QtConsole(viewer, style_sheet=style_sheet)
qtbot.addWidget(console)
assert console.kernel_client is not None
assert console.viewer is viewer
assert console.style_sheet == style_sheet
def test_ipython_console(qtbot, make_test_viewer):
"""Test mock-creating a console from within ipython."""
def mock_get_ipython():
return TerminalInteractiveShell()
with mock.patch(
'napari_console.qt_console.get_ipython',
side_effect=mock_get_ipython,
):
viewer = make_test_viewer()
console = QtConsole(viewer)
qtbot.addWidget(console)
assert console.kernel_client is None
def test_console_focus_proxy(qtbot, make_test_viewer):
"""Test setting/clearing focus on a QtConsole sets/clears focus on the underlying QTextEdit"""
viewer = make_test_viewer()
# setFocus does nothing if the widget is not shown
console = viewer.window._qt_viewer.console
with qtbot.waitExposed(console):
viewer.show()
viewer.window._qt_viewer.toggle_console_visibility()
console.clearFocus()
assert (
not console._control.hasFocus()
), "underlying QTextEdit widget should not have focus after clearing"
console.setFocus()
# timeout (in ms) avoids flaky tests since setting focus takes time
def control_has_focus():
assert (
console._control.hasFocus()
), "underlying QTextEdit widget never received focus"
qtbot.waitUntil(control_has_focus, timeout=30000)
def test_console_pass_variable(make_test_viewer, monkeypatch):
monkeypatch.setattr("napari_console.qt_console._PREF_LIST", ["napari.", "in_n_out."])
variable1 = True
variable2 = "sample text"
viewer = make_test_viewer()
console = viewer.window._qt_viewer.console
assert console.shell.user_ns['variable1'] == variable1
assert console.shell.user_ns['variable2'] == variable2
assert "mock" in console.shell.user_ns
def test_console_disable_pass_variable(make_test_viewer, monkeypatch):
monkeypatch.setattr("napari_console.qt_console._PREF_LIST", ["napari.", "in_n_out."])
monkeypatch.setitem(globals(), "NAPARI_EMBED", True)
variable3 = True
viewer = make_test_viewer()
console = viewer.window._qt_viewer.console
assert locals()['variable3'] == variable3
assert "variable3" not in console.shell.user_ns
|