mirror of
https://github.com/bec-project/bec_widgets.git
synced 2026-03-04 16:02:51 +01:00
feat(widget_finder): widget to fetch any other widget by class from currently running app
This commit is contained in:
117
tests/unit_tests/test_widget_finder.py
Normal file
117
tests/unit_tests/test_widget_finder.py
Normal file
@@ -0,0 +1,117 @@
|
||||
import pytest
|
||||
from qtpy.QtCore import QPoint, QSize, Qt
|
||||
from qtpy.QtWidgets import QLabel, QPushButton, QVBoxLayout, QWidget
|
||||
|
||||
from bec_widgets.widgets.utility.widget_finder.widget_finder import WidgetFinderComboBox
|
||||
from tests.unit_tests.conftest import create_widget
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def finder_fixture(qtbot):
|
||||
central_widget = QWidget()
|
||||
central_widget.layout = QVBoxLayout(central_widget)
|
||||
|
||||
# Create some buttons and a label under parent
|
||||
btn1 = QPushButton("Button1", central_widget)
|
||||
btn1.setObjectName("btn1")
|
||||
btn2 = QPushButton("Button2", central_widget)
|
||||
btn2.setObjectName("btn2")
|
||||
lbl1 = QLabel("Label1", central_widget)
|
||||
lbl1.setObjectName("lbl1")
|
||||
|
||||
# Instantiate finder to look for QPushButton
|
||||
finder = WidgetFinderComboBox(central_widget, QPushButton)
|
||||
|
||||
# Add buttons and label to the layout
|
||||
central_widget.layout.addWidget(btn1)
|
||||
central_widget.layout.addWidget(btn2)
|
||||
central_widget.layout.addWidget(lbl1)
|
||||
central_widget.layout.addWidget(finder)
|
||||
|
||||
qtbot.addWidget(central_widget)
|
||||
qtbot.waitExposed(central_widget)
|
||||
|
||||
return finder, central_widget, btn1, btn2, lbl1
|
||||
|
||||
|
||||
def test_initial_list_contains_buttons_only(qtbot, finder_fixture):
|
||||
finder, parent, btn1, btn2, lbl1 = finder_fixture
|
||||
items = [finder.itemText(i) for i in range(finder.count())]
|
||||
assert "btn1" in items
|
||||
assert "btn2" in items
|
||||
assert "lbl1" not in items
|
||||
|
||||
|
||||
def test_refresh_and_show_popup_update_list(finder_fixture, qtbot):
|
||||
finder, parent, btn1, btn2, lbl1 = finder_fixture
|
||||
|
||||
# Dynamically add a third button
|
||||
btn3 = QPushButton("Button3", parent)
|
||||
btn3.setObjectName("btn3")
|
||||
|
||||
# Manual refresh
|
||||
qtbot.mouseClick(finder.refresh_button, Qt.LeftButton)
|
||||
items = [finder.itemText(i) for i in range(finder.count())]
|
||||
assert "btn3" in items
|
||||
|
||||
# And via showPopup
|
||||
btn4 = QPushButton("Button4", parent)
|
||||
btn4.setObjectName("btn4")
|
||||
finder.showPopup()
|
||||
items = [finder.itemText(i) for i in range(finder.count())]
|
||||
assert "btn4" in items
|
||||
|
||||
|
||||
def test_selected_widget_and_widget_class_name_setter(finder_fixture, qtbot):
|
||||
finder, parent, btn1, btn2, lbl1 = finder_fixture
|
||||
|
||||
# Select btn2
|
||||
idx = finder.findText("btn2")
|
||||
finder.setCurrentIndex(idx)
|
||||
qtbot.wait(200) # allow refresh_list to run
|
||||
selected_widget = finder.selected_widget
|
||||
assert selected_widget == btn2
|
||||
|
||||
# Now switch to QLabel via the property setter
|
||||
finder.widget_class_name = "QLabel"
|
||||
qtbot.wait(200) # allow refresh_list to run
|
||||
items = [finder.itemText(i) for i in range(finder.count())]
|
||||
assert "lbl1" in items
|
||||
assert "btn1" not in items
|
||||
|
||||
|
||||
def test_inspect_widget_highlights_button(qtbot, finder_fixture):
|
||||
finder, parent, btn1, btn2, lbl1 = finder_fixture
|
||||
|
||||
# Select btn1 and inspect
|
||||
idx = finder.findText("btn1")
|
||||
finder.setCurrentIndex(idx)
|
||||
finder.inspect_widget()
|
||||
qtbot.wait(100) # allow highlighter to show
|
||||
|
||||
highlighter = finder.highlighter
|
||||
assert highlighter.isVisible()
|
||||
qtbot.wait(500) # wait ≥ pulse duration
|
||||
# Highlighter should match the target widget size
|
||||
expected_size = btn1.frameGeometry().size()
|
||||
assert highlighter.geometry().size() == expected_size
|
||||
|
||||
|
||||
def test_inspect_widget_highlights_label(qtbot, finder_fixture):
|
||||
finder, parent, btn1, btn2, lbl1 = finder_fixture
|
||||
|
||||
# Switch to QLabel and inspect lbl1
|
||||
finder.widget_class_name = "QLabel"
|
||||
qtbot.wait(50) # allow refresh
|
||||
idx = finder.findText("lbl1")
|
||||
finder.setCurrentIndex(idx)
|
||||
finder.inspect_widget()
|
||||
qtbot.wait(100) # allow highlighter to show
|
||||
|
||||
highlighter = finder.highlighter
|
||||
assert highlighter.isVisible()
|
||||
|
||||
qtbot.wait(500) # wait ≥ pulse duration
|
||||
# Highlighter should match the target widget size
|
||||
expected_size = lbl1.frameGeometry().size()
|
||||
assert highlighter.geometry().size() == expected_size
|
||||
Reference in New Issue
Block a user