From d799691e127415627a139341d0e33ee0c94b404b Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Sun, 15 Mar 2026 12:47:58 +0100 Subject: [PATCH] wip --- .github/workflows/ci.yml | 88 +-- .../test_user_interaction_e2e.py | 684 +++++++++--------- 2 files changed, 386 insertions(+), 386 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5570667a..8f42fc2f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,19 +1,19 @@ name: Full CI -on: +on: push: pull_request: workflow_dispatch: inputs: BEC_WIDGETS_BRANCH: - description: 'Branch of BEC Widgets to install' + description: "Branch of BEC Widgets to install" required: false type: string BEC_CORE_BRANCH: - description: 'Branch of BEC Core to install' + description: "Branch of BEC Core to install" required: false type: string OPHYD_DEVICES_BRANCH: - description: 'Branch of Ophyd Devices to install' + description: "Branch of Ophyd Devices to install" required: false type: string @@ -33,52 +33,52 @@ jobs: if: needs.check_pr_status.outputs.branch-pr == '' uses: ./.github/workflows/formatter.yml - unit-test: - needs: [check_pr_status, formatter] - if: needs.check_pr_status.outputs.branch-pr == '' - uses: ./.github/workflows/pytest.yml - with: - BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref }} - BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} - OPHYD_DEVICES_BRANCH: ${{ inputs.OPHYD_DEVICES_BRANCH || 'main' }} - secrets: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + # unit-test: + # needs: [check_pr_status, formatter] + # if: needs.check_pr_status.outputs.branch-pr == '' + # uses: ./.github/workflows/pytest.yml + # with: + # BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref }} + # BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} + # OPHYD_DEVICES_BRANCH: ${{ inputs.OPHYD_DEVICES_BRANCH || 'main' }} + # secrets: + # CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - unit-test-matrix: - needs: [check_pr_status, formatter] - if: needs.check_pr_status.outputs.branch-pr == '' - uses: ./.github/workflows/pytest-matrix.yml - with: - BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref || github.sha}} - BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} - OPHYD_DEVICES_BRANCH: ${{ inputs.OPHYD_DEVICES_BRANCH || 'main' }} + # unit-test-matrix: + # needs: [check_pr_status, formatter] + # if: needs.check_pr_status.outputs.branch-pr == '' + # uses: ./.github/workflows/pytest-matrix.yml + # with: + # BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref || github.sha}} + # BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} + # OPHYD_DEVICES_BRANCH: ${{ inputs.OPHYD_DEVICES_BRANCH || 'main' }} - generate-cli-test: - needs: [check_pr_status, formatter] - if: needs.check_pr_status.outputs.branch-pr == '' - uses: ./.github/workflows/generate-cli-check.yml + # generate-cli-test: + # needs: [check_pr_status, formatter] + # if: needs.check_pr_status.outputs.branch-pr == '' + # uses: ./.github/workflows/generate-cli-check.yml end2end-test: needs: [check_pr_status, formatter] if: needs.check_pr_status.outputs.branch-pr == '' uses: ./.github/workflows/end2end-conda.yml - child-repos: - needs: [check_pr_status, formatter] - if: needs.check_pr_status.outputs.branch-pr == '' - uses: ./.github/workflows/child_repos.yml - with: - BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} - OPHYD_DEVICES_BRANCH: ${{ inputs.OPHYD_DEVICES_BRANCH || 'main'}} - BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref || github.sha }} - - plugin_repos: - needs: [check_pr_status, formatter] - if: needs.check_pr_status.outputs.branch-pr == '' - uses: bec-project/bec/.github/workflows/plugin_repos.yml@main - with: - BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} - BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref || github.sha }} + # child-repos: + # needs: [check_pr_status, formatter] + # if: needs.check_pr_status.outputs.branch-pr == '' + # uses: ./.github/workflows/child_repos.yml + # with: + # BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} + # OPHYD_DEVICES_BRANCH: ${{ inputs.OPHYD_DEVICES_BRANCH || 'main'}} + # BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref || github.sha }} - secrets: - GH_READ_TOKEN: ${{ secrets.GH_READ_TOKEN }} \ No newline at end of file + # plugin_repos: + # needs: [check_pr_status, formatter] + # if: needs.check_pr_status.outputs.branch-pr == '' + # uses: bec-project/bec/.github/workflows/plugin_repos.yml@main + # with: + # BEC_CORE_BRANCH: ${{ inputs.BEC_CORE_BRANCH || 'main' }} + # BEC_WIDGETS_BRANCH: ${{ inputs.BEC_WIDGETS_BRANCH || github.head_ref || github.sha }} + + # secrets: + # GH_READ_TOKEN: ${{ secrets.GH_READ_TOKEN }} diff --git a/tests/end-2-end/user_interaction/test_user_interaction_e2e.py b/tests/end-2-end/user_interaction/test_user_interaction_e2e.py index e4b0b480..028b859a 100644 --- a/tests/end-2-end/user_interaction/test_user_interaction_e2e.py +++ b/tests/end-2-end/user_interaction/test_user_interaction_e2e.py @@ -137,142 +137,157 @@ def maybe_remove_dock_area(qtbot, gui: BECGuiClient, random_int_gen: random.Rand ) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_bec_progress_bar(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the BECProgressBar widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.BECProgressBar) - widget: client.BECProgressBar - - # Check rpc calls - assert widget.label_template == "$value / $maximum - $percentage %" - widget.set_maximum(100) - widget.set_minimum(50) - widget.set_value(75) - - assert widget._get_label() == "75 / 100 - 50 %" - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_bec_queue(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the BECQueue widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.BECQueue) - widget: client.BECQueue - - # No rpc calls to test so far - # maybe we can add an rpc call to check the queue length - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_bec_status_box(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the BECStatusBox widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.BECStatusBox) - - # Check rpc calls - assert widget.get_server_state() in ["RUNNING", "IDLE", "BUSY", "ERROR"] - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_dap_combo_box(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the DAPComboBox widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.DapComboBox) - widget: client.DAPComboBox - - # Check rpc calls - widget.select_fit_model("PseudoVoigtModel") - widget.select_x_axis("samx") - widget.select_y_axis("bpm4i") - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_device_browser(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the DeviceBrowser widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.DeviceBrowser) - widget: client.DeviceBrowser - - # No rpc calls yet to check - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_image(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the Image widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.Image) - widget: client.Image - - scans = bec.scans - dev = bec.device_manager.devices - # Test rpc calls - img = widget.image(device=dev.eiger.name, signal="preview") - assert img.get_data() is None - # Run a scan and plot the image - s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False) - s.wait() - - def _wait_for_scan_in_history(): - # Get scan item from history - scan_item = bec.history.get_by_scan_id(s.scan.scan_id) - return scan_item is not None - - qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) - - # Check that last image is equivalent to data in Redis - last_img = bec.connector.get_last(MessageEndpoints.device_preview("eiger", "preview"))[ - "data" - ].data - assert np.allclose(img.get_data(), last_img) - - # Now add a device with a preview signal - img = widget.image(device="eiger", signal="preview") - s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False) - s.wait() - - qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -# TODO re-enable when issue is resolved #560 # @pytest.mark.timeout(PYTEST_TIMEOUT) -# def test_widgets_e2e_log_panel(qtbot, connected_client_gui_obj, random_generator_from_seed): -# """Test the LogPanel widget.""" +# def test_widgets_e2e_bec_progress_bar(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the BECProgressBar widget.""" # gui = connected_client_gui_obj # bec = gui._client # # Create dock_area and widget -# widget = create_widget(qtbot, gui, gui.available_widgets.LogPanel) -# widget: client.LogPanel +# widget = create_widget(qtbot, gui, gui.available_widgets.BECProgressBar) +# widget: client.BECProgressBar + +# # Check rpc calls +# assert widget.label_template == "$value / $maximum - $percentage %" +# widget.set_maximum(100) +# widget.set_minimum(50) +# widget.set_value(75) + +# assert widget._get_label() == "75 / 100 - 50 %" + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_bec_queue(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the BECQueue widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.BECQueue) +# widget: client.BECQueue + +# # No rpc calls to test so far +# # maybe we can add an rpc call to check the queue length + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_bec_status_box(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the BECStatusBox widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.BECStatusBox) + +# # Check rpc calls +# assert widget.get_server_state() in ["RUNNING", "IDLE", "BUSY", "ERROR"] + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_dap_combo_box(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the DAPComboBox widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.DapComboBox) +# widget: client.DAPComboBox + +# # Check rpc calls +# widget.select_fit_model("PseudoVoigtModel") +# widget.select_x_axis("samx") +# widget.select_y_axis("bpm4i") + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_device_browser(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the DeviceBrowser widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.DeviceBrowser) +# widget: client.DeviceBrowser + +# # No rpc calls yet to check + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_image(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the Image widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.Image) +# widget: client.Image + +# scans = bec.scans +# dev = bec.device_manager.devices +# # Test rpc calls +# img = widget.image(device=dev.eiger.name, signal="preview") +# assert img.get_data() is None +# # Run a scan and plot the image +# s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False) +# s.wait() + +# def _wait_for_scan_in_history(): +# # Get scan item from history +# scan_item = bec.history.get_by_scan_id(s.scan.scan_id) +# return scan_item is not None + +# qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) + +# # Check that last image is equivalent to data in Redis +# last_img = bec.connector.get_last(MessageEndpoints.device_preview("eiger", "preview"))[ +# "data" +# ].data +# assert np.allclose(img.get_data(), last_img) + +# # Now add a device with a preview signal +# img = widget.image(device="eiger", signal="preview") +# s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False) +# s.wait() + +# qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# # TODO re-enable when issue is resolved #560 +# # @pytest.mark.timeout(PYTEST_TIMEOUT) +# # def test_widgets_e2e_log_panel(qtbot, connected_client_gui_obj, random_generator_from_seed): +# # """Test the LogPanel widget.""" +# # gui = connected_client_gui_obj +# # bec = gui._client +# # # Create dock_area and widget +# # widget = create_widget(qtbot, gui, gui.available_widgets.LogPanel) +# # widget: client.LogPanel + +# # # No rpc calls to check so far + +# # # Test removing the widget, or leaving it open for the next test +# # maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) + + +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_minesweeper(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the MineSweeper widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.Minesweeper) +# widget: client.MineSweeper # # No rpc calls to check so far @@ -280,175 +295,160 @@ def test_widgets_e2e_image(qtbot, connected_client_gui_obj, random_generator_fro # maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_minesweeper(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the MineSweeper widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.Minesweeper) - widget: client.MineSweeper +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_motor_map(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the MotorMap widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.MotorMap) +# widget: client.MotorMap - # No rpc calls to check so far +# # Test RPC calls +# dev = bec.device_manager.devices +# scans = bec.scans +# # Set motor map to names +# widget.map(dev.samx, dev.samy) +# # Move motor samx to pos +# pos = dev.samx.limits[1] - 1 # -1 from higher limit +# scans.mv(dev.samx, pos, relative=False).wait() +# # Check that data is up to date +# assert np.isclose(widget.get_data()["x"][-1], pos, dev.samx.precision) +# # Move motor samy to pos +# pos = dev.samy.limits[0] + 1 # +1 from lower limit +# scans.mv(dev.samy, pos, relative=False).wait() +# # Check that data is up to date +# assert np.isclose(widget.get_data()["y"][-1], pos, dev.samy.precision) - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_motor_map(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the MotorMap widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.MotorMap) - widget: client.MotorMap +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_multi_waveform(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test MultiWaveform widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.MultiWaveform) +# widget: client.MultiWaveform - # Test RPC calls - dev = bec.device_manager.devices - scans = bec.scans - # Set motor map to names - widget.map(dev.samx, dev.samy) - # Move motor samx to pos - pos = dev.samx.limits[1] - 1 # -1 from higher limit - scans.mv(dev.samx, pos, relative=False).wait() - # Check that data is up to date - assert np.isclose(widget.get_data()["x"][-1], pos, dev.samx.precision) - # Move motor samy to pos - pos = dev.samy.limits[0] + 1 # +1 from lower limit - scans.mv(dev.samy, pos, relative=False).wait() - # Check that data is up to date - assert np.isclose(widget.get_data()["y"][-1], pos, dev.samy.precision) +# # Test RPC calls +# dev = bec.device_manager.devices +# scans = bec.scans +# # test plotting +# cm = "cividis" +# widget.plot(dev.waveform, color_palette=cm) +# assert widget.monitor == dev.waveform.name +# assert widget.color_palette == cm - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Scan with BEC +# s = scans.line_scan(dev.samx, -3, 3, steps=5, exp_time=0.01, relative=False) +# s.wait() + +# def _wait_for_scan_in_history(): +# # Get scan item from history +# scan_item = bec.history.get_by_scan_id(s.scan.scan_id) +# return scan_item is not None + +# qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) +# # Wait for data in history (should be plotted?) + +# # TODO how can we check that the data was plotted, implement get_data() + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_multi_waveform(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test MultiWaveform widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.MultiWaveform) - widget: client.MultiWaveform +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_positioner_indicator( +# qtbot, connected_client_gui_obj, random_generator_from_seed +# ): +# """Test the PositionIndicator widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.PositionIndicator) +# widget: client.PositionIndicator - # Test RPC calls - dev = bec.device_manager.devices - scans = bec.scans - # test plotting - cm = "cividis" - widget.plot(dev.waveform, color_palette=cm) - assert widget.monitor == dev.waveform.name - assert widget.color_palette == cm +# # TODO check what these rpc calls are supposed to do! Issue created #461 +# widget.set_value(5) - # Scan with BEC - s = scans.line_scan(dev.samx, -3, 3, steps=5, exp_time=0.01, relative=False) - s.wait() - - def _wait_for_scan_in_history(): - # Get scan item from history - scan_item = bec.history.get_by_scan_id(s.scan.scan_id) - return scan_item is not None - - qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) - # Wait for data in history (should be plotted?) - - # TODO how can we check that the data was plotted, implement get_data() - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_positioner_indicator( - qtbot, connected_client_gui_obj, random_generator_from_seed -): - """Test the PositionIndicator widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.PositionIndicator) - widget: client.PositionIndicator +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_positioner_box(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the PositionerBox widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.PositionerBox) +# widget: client.PositionerBox - # TODO check what these rpc calls are supposed to do! Issue created #461 - widget.set_value(5) +# # Test rpc calls +# dev = bec.device_manager.devices +# scans = bec.scans +# # No rpc calls to check so far +# widget.set_positioner(dev.samx) +# widget.set_positioner(dev.samy.name) - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# scans.mv(dev.samy, -3, relative=False).wait() + +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_positioner_box(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the PositionerBox widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.PositionerBox) - widget: client.PositionerBox +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_positioner_box_2d(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the PositionerBox2D widget.""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.PositionerBox2D) +# widget: client.PositionerBox2D - # Test rpc calls - dev = bec.device_manager.devices - scans = bec.scans - # No rpc calls to check so far - widget.set_positioner(dev.samx) - widget.set_positioner(dev.samy.name) +# # Test rpc calls +# dev = bec.device_manager.devices +# scans = bec.scans +# # No rpc calls to check so far +# widget.set_positioner_hor(dev.samx) +# widget.set_positioner_ver(dev.samy) - scans.mv(dev.samy, -3, relative=False).wait() +# # Try moving the motors +# scans.mv(dev.samx, 3, relative=False).wait() +# scans.mv(dev.samy, -3, relative=False).wait() - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_positioner_box_2d(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the PositionerBox2D widget.""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.PositionerBox2D) - widget: client.PositionerBox2D +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_positioner_control_line( +# qtbot, connected_client_gui_obj, random_generator_from_seed +# ): +# """Test the positioner control line widget""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.PositionerControlLine) +# widget: client.PositionerControlLine - # Test rpc calls - dev = bec.device_manager.devices - scans = bec.scans - # No rpc calls to check so far - widget.set_positioner_hor(dev.samx) - widget.set_positioner_ver(dev.samy) +# # Test rpc calls +# dev = bec.device_manager.devices +# scans = bec.scans +# # Set positioner +# widget.set_positioner(dev.samx) +# scans.mv(dev.samx, 3, relative=False).wait() +# widget.set_positioner(dev.samy.name) +# scans.mv(dev.samy, -3, relative=False).wait() - # Try moving the motors - scans.mv(dev.samx, 3, relative=False).wait() - scans.mv(dev.samy, -3, relative=False).wait() - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_positioner_control_line( - qtbot, connected_client_gui_obj, random_generator_from_seed -): - """Test the positioner control line widget""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.PositionerControlLine) - widget: client.PositionerControlLine - - # Test rpc calls - dev = bec.device_manager.devices - scans = bec.scans - # Set positioner - widget.set_positioner(dev.samx) - scans.mv(dev.samx, 3, relative=False).wait() - widget.set_positioner(dev.samy.name) - scans.mv(dev.samy, -3, relative=False).wait() - - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) - - -# TODO passes locally, fails on CI for some reason... -> issue #1003 +@pytest.mark.repeat(20) @pytest.mark.timeout(PYTEST_TIMEOUT) def test_widgets_e2e_ring_progress_bar(qtbot, connected_client_gui_obj, random_generator_from_seed): """Test the RingProgressBar widget""" @@ -477,86 +477,86 @@ def test_widgets_e2e_ring_progress_bar(qtbot, connected_client_gui_obj, random_g maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_scan_control(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the ScanControl widget""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.ScanControl) - widget: client.ScanControl +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_scan_control(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the ScanControl widget""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.ScanControl) +# widget: client.ScanControl - # No rpc calls to check so far +# # No rpc calls to check so far - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_scatter_waveform(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the ScatterWaveform widget""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.ScatterWaveform) - widget: client.ScatterWaveform +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_scatter_waveform(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the ScatterWaveform widget""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.ScatterWaveform) +# widget: client.ScatterWaveform - # Test rpc calls - dev = bec.device_manager.devices - scans = bec.scans - widget.plot(dev.samx, dev.samy, dev.bpm4i) - scans.grid_scan(dev.samx, -5, 5, 5, dev.samy, -5, 5, 5, exp_time=0.01, relative=False).wait() +# # Test rpc calls +# dev = bec.device_manager.devices +# scans = bec.scans +# widget.plot(dev.samx, dev.samy, dev.bpm4i) +# scans.grid_scan(dev.samx, -5, 5, 5, dev.samy, -5, 5, 5, exp_time=0.01, relative=False).wait() - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_text_box(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the TextBox widget""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.TextBox) - widget: client.TextBox +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_text_box(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the TextBox widget""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.TextBox) +# widget: client.TextBox - # RPC calls - widget.set_plain_text("Hello World") - widget.set_html_text(" Hello World HTML ") +# # RPC calls +# widget.set_plain_text("Hello World") +# widget.set_html_text(" Hello World HTML ") - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) -@pytest.mark.timeout(PYTEST_TIMEOUT) -def test_widgets_e2e_waveform(qtbot, connected_client_gui_obj, random_generator_from_seed): - """Test the Waveform widget""" - gui = connected_client_gui_obj - bec = gui._client - # Create dock_area and widget - widget = create_widget(qtbot, gui, gui.available_widgets.Waveform) - widget: client.Waveform +# @pytest.mark.timeout(PYTEST_TIMEOUT) +# def test_widgets_e2e_waveform(qtbot, connected_client_gui_obj, random_generator_from_seed): +# """Test the Waveform widget""" +# gui = connected_client_gui_obj +# bec = gui._client +# # Create dock_area and widget +# widget = create_widget(qtbot, gui, gui.available_widgets.Waveform) +# widget: client.Waveform - # Test rpc calls - dev = bec.device_manager.devices - scans = bec.scans - widget.plot(dev.bpm4i) - s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False) - s.wait() +# # Test rpc calls +# dev = bec.device_manager.devices +# scans = bec.scans +# widget.plot(dev.bpm4i) +# s = scans.line_scan(dev.samx, -3, 3, steps=50, exp_time=0.01, relative=False) +# s.wait() - def _wait_for_scan_in_history(): - # Get scan item from history - scan_item = bec.history.get_by_scan_id(s.scan.scan_id) - return scan_item is not None +# def _wait_for_scan_in_history(): +# # Get scan item from history +# scan_item = bec.history.get_by_scan_id(s.scan.scan_id) +# return scan_item is not None - qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) +# qtbot.waitUntil(_wait_for_scan_in_history, timeout=7000) - scan_item = bec.history.get_by_scan_id(s.scan.scan_id) - samx_data = scan_item.devices.samx.samx.read()["value"] - bpm4i_data = scan_item.devices.bpm4i.bpm4i.read()["value"] - curve = widget.curves[0] - assert np.allclose(curve.get_data()[0], samx_data) - assert np.allclose(curve.get_data()[1], bpm4i_data) +# scan_item = bec.history.get_by_scan_id(s.scan.scan_id) +# samx_data = scan_item.devices.samx.samx.read()["value"] +# bpm4i_data = scan_item.devices.bpm4i.bpm4i.read()["value"] +# curve = widget.curves[0] +# assert np.allclose(curve.get_data()[0], samx_data) +# assert np.allclose(curve.get_data()[1], bpm4i_data) - # Test removing the widget, or leaving it open for the next test - maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed) +# # Test removing the widget, or leaving it open for the next test +# maybe_remove_dock_area(qtbot, gui=gui, random_int_gen=random_generator_from_seed)