1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-12-28 18:01:18 +01:00
Files
bec_widgets/tests/unit_tests/test_help_inspector.py

133 lines
4.7 KiB
Python

# pylint: disable=missing-function-docstring, missing-module-docstring, unused-import
from unittest import mock
import pytest
from qtpy import QtCore, QtWidgets
from bec_widgets.utils.help_inspector.help_inspector import HelpInspector
from bec_widgets.utils.widget_io import WidgetHierarchy
from bec_widgets.widgets.control.buttons.button_abort.button_abort import AbortButton
from .client_mocks import mocked_client
@pytest.fixture
def help_inspector(qtbot, mocked_client):
widget = HelpInspector(client=mocked_client)
qtbot.addWidget(widget)
qtbot.waitExposed(widget)
yield widget
@pytest.fixture
def abort_button(qtbot):
widget = AbortButton()
widget.setToolTip("This is an abort button.")
def get_help_md():
return "This is **markdown** help text for the abort button."
widget.get_help_md = get_help_md # type: ignore
qtbot.addWidget(widget)
qtbot.waitExposed(widget)
yield widget
def test_help_inspector_button(help_inspector):
"""Test the HelpInspector widget."""
assert not help_inspector._active
help_inspector._button.click()
assert help_inspector._active
assert help_inspector._button.isChecked()
cursor = QtWidgets.QApplication.overrideCursor()
assert cursor is not None
assert cursor.shape() == QtCore.Qt.CursorShape.WhatsThisCursor
help_inspector._button.click()
assert not help_inspector._active
assert not help_inspector._button.isChecked()
assert QtWidgets.QApplication.overrideCursor() is None
def test_help_inspector_register_callback(help_inspector):
"""Test registering a callback in the HelpInspector widget."""
assert len(help_inspector._callbacks) == 3 # default callbacks
def my_callback(widget):
pass
cb_id = help_inspector.register_callback(my_callback)
assert len(help_inspector._callbacks) == 4
assert help_inspector._callbacks[cb_id] == my_callback
cb_id2 = help_inspector.register_callback(my_callback)
assert len(help_inspector._callbacks) == 5
assert help_inspector._callbacks[cb_id2] == my_callback
help_inspector.unregister_callback(cb_id)
assert len(help_inspector._callbacks) == 4
help_inspector.unregister_callback(cb_id2)
assert len(help_inspector._callbacks) == 3
def test_help_inspector_escape_key(qtbot, help_inspector):
"""Test that pressing the Escape key deactivates the HelpInspector."""
help_inspector._button.click()
assert help_inspector._active
qtbot.keyClick(help_inspector, QtCore.Qt.Key.Key_Escape)
assert not help_inspector._active
assert not help_inspector._button.isChecked()
assert QtWidgets.QApplication.overrideCursor() is None
def test_help_inspector_event_filter(help_inspector, abort_button):
"""Test the event filter of the HelpInspector."""
# Test nothing happens when not active
obj = mock.MagicMock(spec=QtWidgets.QWidget)
event = mock.MagicMock(spec=QtCore.QEvent)
assert help_inspector._active is False
with mock.patch.object(
QtWidgets.QWidget, "eventFilter", return_value=False
) as super_event_filter:
help_inspector.eventFilter(obj, event) # should do nothing and return False
super_event_filter.assert_called_once_with(obj, event)
super_event_filter.reset_mock()
help_inspector._active = True
with mock.patch.object(help_inspector, "_toggle_mode") as mock_toggle:
# Key press Escape
event.type = mock.MagicMock(return_value=QtCore.QEvent.KeyPress)
event.key = mock.MagicMock(return_value=QtCore.Qt.Key.Key_Escape)
help_inspector.eventFilter(obj, event)
mock_toggle.assert_called_once_with(False)
mock_toggle.reset_mock()
# Click on itself
event.type = mock.MagicMock(return_value=QtCore.QEvent.MouseButtonPress)
event.button = mock.MagicMock(return_value=QtCore.Qt.LeftButton)
event.globalPos = mock.MagicMock(return_value=QtCore.QPoint(1, 1))
with mock.patch.object(
help_inspector._app, "widgetAt", side_effect=[help_inspector, abort_button]
):
# Return for self call
help_inspector.eventFilter(obj, event)
mock_toggle.assert_called_once_with(False)
mock_toggle.reset_mock()
# Run Callback for abort_button
callback_data = []
def _my_callback(widget):
callback_data.append(widget)
help_inspector.register_callback(_my_callback)
help_inspector.eventFilter(obj, event)
mock_toggle.assert_not_called()
assert len(callback_data) == 1
assert callback_data[0] == abort_button
callback_data.clear()