From def33d6daabb4dfa5f064cc920ce761030559b57 Mon Sep 17 00:00:00 2001 From: Eu Pin Tien Date: Wed, 19 Aug 2026 11:39:10 +0100 Subject: [PATCH 1/4] Updated logs --- src/murfey/server/api/workflow_clem.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/murfey/server/api/workflow_clem.py b/src/murfey/server/api/workflow_clem.py index e7c4d0797..a677117d9 100644 --- a/src/murfey/server/api/workflow_clem.py +++ b/src/murfey/server/api/workflow_clem.py @@ -1,5 +1,6 @@ from __future__ import annotations +import json from ast import literal_eval from importlib.metadata import ( EntryPoint, # type hinting only @@ -92,10 +93,9 @@ def process_raw_lifs( "feedback_queue": murfey.server._transport_object.feedback_queue, }, } - logger.debug( - f"Submitting LIF processing request to {murfey.server._transport_object.feedback_queue!r} " - "with the following recipe: \n" - f"{recipe}" + logger.info( + f"Submitting LIF processing request to 'processing_recipe': \n" + f"{json.dumps(recipe, indent=2, default=str)}" ) murfey.server._transport_object.send( queue="processing_recipe", @@ -177,10 +177,9 @@ def process_raw_tiffs( "feedback_queue": murfey.server._transport_object.feedback_queue, }, } - logger.debug( - f"Submitting TIFF processing request to {murfey.server._transport_object.feedback_queue!r} " - "with the following recipe: \n" - f"{recipe}" + logger.info( + f"Submitting TIFF processing request to 'processing_recipe': \n" + f"{json.dumps(recipe, indent=2, default=str)}" ) murfey.server._transport_object.send( queue="processing_recipe", From 5de7ac3daf01818682ea79e8161622f6f33a1080 Mon Sep 17 00:00:00 2001 From: Eu Pin Tien Date: Wed, 19 Aug 2026 11:40:24 +0100 Subject: [PATCH 2/4] Removed redundant 'align_and_merge' API endpoint --- src/murfey/server/api/workflow_clem.py | 75 +------------------------- src/murfey/util/route_manifest.yaml | 7 --- 2 files changed, 1 insertion(+), 81 deletions(-) diff --git a/src/murfey/server/api/workflow_clem.py b/src/murfey/server/api/workflow_clem.py index a677117d9..5b749b7af 100644 --- a/src/murfey/server/api/workflow_clem.py +++ b/src/murfey/server/api/workflow_clem.py @@ -1,17 +1,11 @@ from __future__ import annotations import json -from ast import literal_eval -from importlib.metadata import ( - EntryPoint, # type hinting only - entry_points, -) from logging import getLogger from pathlib import Path -from typing import Literal, Optional from fastapi import APIRouter -from pydantic import BaseModel, field_validator +from pydantic import BaseModel from sqlmodel import Session, select import murfey.server @@ -187,70 +181,3 @@ def process_raw_tiffs( new_connection=True, ) return True - - -class AlignAndMergeParams(BaseModel): - # Processing parameters - series_name: str - images: list[Path] - metadata: Path - # Optional processing parameters - crop_to_n_frames: Optional[int] = None - align_self: Literal["enabled", ""] = "" - flatten: Literal["mean", "min", "max", ""] = "" - align_across: Literal["enabled", ""] = "" - - @field_validator("images", mode="before") - @classmethod - def parse_stringified_list(cls, value): - if isinstance(value, str): - try: - eval_result = literal_eval(value) - if isinstance(eval_result, list): - parent_tiffs = [Path(p) for p in eval_result] - return parent_tiffs - except (SyntaxError, ValueError): - raise ValueError("Unable to parse input") - # Return value as-is; if it fails, it fails - return value - - -@router.post("/sessions/{session_id}/align_and_merge_stacks") -def align_and_merge_stacks( - session_id: int, - align_and_merge_params: AlignAndMergeParams, - db: Session = murfey_db, -): - try: - # Try and load relevant Murfey workflow - workflow: EntryPoint = list( - entry_points(group="murfey.workflows", name="clem.align_and_merge") - )[0] - except IndexError: - raise RuntimeError("The relevant Murfey workflow was not found") - - # Get instrument name from the database to load the correct config file - session_row: MurfeyDB.Session = db.exec( - select(MurfeyDB.Session).where(MurfeyDB.Session.id == session_id) - ).one() - instrument_name = session_row.instrument_name - - # Pass arguments to correct workflow - workflow.load()( - # Match the arguments found in murfey.workflows.clem.align_and_merge - # Session parameters - session_id=session_id, - instrument_name=instrument_name, - # Processing parameters - series_name=align_and_merge_params.series_name, - images=align_and_merge_params.images, - metadata=align_and_merge_params.metadata, - # Optional processing parameters - crop_to_n_frames=align_and_merge_params.crop_to_n_frames, - align_self=align_and_merge_params.align_self, - flatten=align_and_merge_params.flatten, - align_across=align_and_merge_params.align_across, - # Optional session parameters - messenger=murfey.server._transport_object, - ) - return True diff --git a/src/murfey/util/route_manifest.yaml b/src/murfey/util/route_manifest.yaml index b37209141..e882fef32 100644 --- a/src/murfey/util/route_manifest.yaml +++ b/src/murfey/util/route_manifest.yaml @@ -1416,13 +1416,6 @@ murfey.server.api.workflow_clem.router: type: int methods: - POST - - path: /workflow/clem/sessions/{session_id}/align_and_merge_stacks - function: align_and_merge_stacks - path_params: - - name: session_id - type: int - methods: - - POST murfey.server.api.workflow_fib.router: - path: /workflow/fib/sessions/{session_id}/register_atlas function: register_fib_atlas From 1d9ec7ef548e4b82a98b3c5f9e12a4f6cc3c060d Mon Sep 17 00:00:00 2001 From: Eu Pin Tien Date: Wed, 19 Aug 2026 11:45:12 +0100 Subject: [PATCH 3/4] Removed redundant CLEM workflows --- pyproject.toml | 3 - src/murfey/workflows/clem/align_and_merge.py | 72 ----------- src/murfey/workflows/clem/process_raw_lifs.py | 74 ----------- .../workflows/clem/process_raw_tiffs.py | 83 ------------- tests/workflows/clem/test_align_and_merge.py | 115 ------------------ tests/workflows/clem/test_process_raw_lifs.py | 75 ------------ .../workflows/clem/test_process_raw_tiffs.py | 102 ---------------- 7 files changed, 524 deletions(-) delete mode 100644 src/murfey/workflows/clem/align_and_merge.py delete mode 100644 src/murfey/workflows/clem/process_raw_lifs.py delete mode 100644 src/murfey/workflows/clem/process_raw_tiffs.py delete mode 100644 tests/workflows/clem/test_align_and_merge.py delete mode 100644 tests/workflows/clem/test_process_raw_lifs.py delete mode 100644 tests/workflows/clem/test_process_raw_tiffs.py diff --git a/pyproject.toml b/pyproject.toml index 06839a057..cf08a9b99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -110,9 +110,6 @@ TomographyContext = "murfey.client.contexts.tomo:TomographyContext" TomographyMetadataContext = "murfey.client.contexts.tomo_metadata:TomographyMetadataContext" [project.entry-points."murfey.workflows"] "atlas_update" = "murfey.workflows.register_atlas_update:run" -"clem.align_and_merge" = "murfey.workflows.clem.align_and_merge:run" -"clem.process_raw_lifs" = "murfey.workflows.clem.process_raw_lifs:run" -"clem.process_raw_tiffs" = "murfey.workflows.clem.process_raw_tiffs:run" "clem.register_align_and_merge_result" = "murfey.workflows.clem.register_align_and_merge_results:run" "clem.register_preprocessing_result" = "murfey.workflows.clem.register_preprocessing_results:run" "data_collection" = "murfey.workflows.register_data_collection:run" diff --git a/src/murfey/workflows/clem/align_and_merge.py b/src/murfey/workflows/clem/align_and_merge.py deleted file mode 100644 index 14d8d905f..000000000 --- a/src/murfey/workflows/clem/align_and_merge.py +++ /dev/null @@ -1,72 +0,0 @@ -""" -Script to allow Murfey to request for an image alignment, colorisation, and merge job -from cryoemservices. -""" - -from __future__ import annotations - -from pathlib import Path -from typing import Optional - -from murfey.util.config import get_machine_config - -try: - from murfey.server.ispyb import TransportManager # Session -except AttributeError: - pass # Ignore if ISPyB credentials environment variable not set - - -def run( - # Session parameters - session_id: int, - instrument_name: str, - # Processing parameters - series_name: str, - images: list[Path], - metadata: Path, - # Optional session parameters - messenger: Optional[TransportManager] = None, -): - if not messenger: - raise Exception("Unable to find transport manager") - - # Load feedback queue - machine_config = get_machine_config()[instrument_name] - feedback_queue: str = messenger.feedback_queue - - # Work out session directory from file path - processed_folder = machine_config.processed_directory_name - if not images: - raise ValueError(f"No image files have been provided for {series_name!r}") - reference_file = images[0] - path_parts = list(reference_file.parts) - path_parts[0] = "" if path_parts[0] == "/" else path_parts[0] - try: - root_index = path_parts.index(processed_folder) - except ValueError: - raise ValueError( - f"The processed directory {processed_folder!r} could not be found in the " - f"file path for {str(reference_file)!r}" - ) - session_dir = Path("/".join(path_parts[:root_index])) - - # Submit message to cryoemservices - messenger.send( - "processing_recipe", - { - "recipes": ["clem-align-and-merge"], - "parameters": { - # Job parameters - "series_name": series_name, - "images": [str(file) for file in images], - "metadata": str(metadata), - # Other recipe parameters - "session_dir": str(session_dir), - "session_id": session_id, - "job_name": series_name, - "feedback_queue": feedback_queue, - }, - }, - new_connection=True, - ) - return {"success": True} diff --git a/src/murfey/workflows/clem/process_raw_lifs.py b/src/murfey/workflows/clem/process_raw_lifs.py deleted file mode 100644 index 320624cbb..000000000 --- a/src/murfey/workflows/clem/process_raw_lifs.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -Script to allow Murfey to submit the LIF-to-STACK job to the cluster. -The recipe referred to here is stored on GitLab. -""" - -from logging import getLogger -from pathlib import Path -from typing import Optional - -try: - from murfey.server.ispyb import TransportManager # Session -except AttributeError: - pass # Ignore if ISPyB credentials environment variable not set - -logger = getLogger("murfey.workflows.clem.process_raw_lifs") - - -def run( - file: Path, - root_folder: str, - session_id: int, # Provided by the client via the API endpoint - instrument_name: str, # Acquired by looking up the Session table - messenger: Optional[TransportManager] = None, -): - if messenger: - # Use file path parts to construct parameters - path_parts = list((file.parent / file.stem).parts) - # Replace leading "/" in Unix paths - path_parts[0] = "" if path_parts[0] == "/" else path_parts[0] - try: - # Find the position of the root folder in the list - root_index = [p.lower() for p in path_parts].index(root_folder.lower()) - except ValueError: - raise Exception( - f"Unable to find the root folder {root_folder!r} in the file path {file!r}" - ) - - # Construct the session and job name - session_dir = "/".join(path_parts[:root_index]) - job_name = "--".join( - [p.replace(" ", "_") if " " in p else p for p in path_parts][ - root_index + 1 : - ] - ) - - # Load machine config to get the feedback queue - feedback_queue: str = messenger.feedback_queue - - # Construct recipe and submit it for processing - recipe = { - "recipes": ["clem-process-raw-lifs"], - "parameters": { - # Job parameters - "lif_file": f"{str(file)}", - "root_folder": root_folder, - # Other recipe parameters - "session_dir": f"{str(session_dir)}", - "session_id": session_id, - "job_name": job_name, - "feedback_queue": feedback_queue, - }, - } - logger.debug( - f"Submitting LIF processing request to {messenger.feedback_queue!r} " - "with the following recipe: \n" - f"{recipe}" - ) - messenger.send( - queue="processing_recipe", - message=recipe, - new_connection=True, - ) - else: - raise Exception("Unable to find transport manager") diff --git a/src/murfey/workflows/clem/process_raw_tiffs.py b/src/murfey/workflows/clem/process_raw_tiffs.py deleted file mode 100644 index 07ea8eb81..000000000 --- a/src/murfey/workflows/clem/process_raw_tiffs.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Script to allow Murfey to submit the TIFF-to-stack job to the cluster. -The recipe referred to here is stored on GitLab. -""" - -from logging import getLogger -from pathlib import Path -from typing import Optional - -logger = getLogger("murfey.workflows.clem.process_raw_tiffs") - -try: - from murfey.server.ispyb import TransportManager # Session -except AttributeError: - pass # Ignore if ISPyB credentials environment variable not set - - -def run( - tiff_list: list[Path], - root_folder: str, - session_id: int, - instrument_name: str, - metadata: Optional[Path] = None, - messenger: Optional[TransportManager] = None, -): - if messenger: - # Construct path to session directory - path_parts = list( - (tiff_list[0].parent / (tiff_list[0].stem.split("--")[0])).parts - ) - # Replace leading "/" in Unix paths - path_parts[0] = "" if path_parts[0] == "/" else path_parts[0] - try: - # Find the position of the root folder in the list - root_index = [p.lower() for p in path_parts].index(root_folder.lower()) - except ValueError: - raise Exception( - f"Unable to find the root folder {root_folder!r} in the file path {tiff_list[0]!r}" - ) - # Construct the session and job name - session_dir = "/".join(path_parts[:root_index]) - job_name = "--".join( - [p.replace(" ", "_") if " " in p else p for p in path_parts][ - root_index + 1 : - ] - ) - - # If no metadata file provided, generate path to one - if metadata is None: - series_name = tiff_list[0].stem.split("--")[0] - metadata = tiff_list[0].parent / "Metadata" / (series_name + ".xlif") - - # Load machine config to get the feedback queue - feedback_queue: str = messenger.feedback_queue - - # Construct recipe and submit it for processing - recipe = { - "recipes": ["clem-process-raw-tiffs"], - "parameters": { - # Job parameters - "tiff_list": "null", - "tiff_file": f"{str(tiff_list[0])}", - "root_folder": root_folder, - "metadata": f"{str(metadata)}", - # Other recipe parameters - "session_dir": f"{str(session_dir)}", - "session_id": session_id, - "job_name": job_name, - "feedback_queue": feedback_queue, - }, - } - logger.debug( - f"Submitting TIFF processing request to {messenger.feedback_queue!r} " - "with the following recipe: \n" - f"{recipe}" - ) - messenger.send( - queue="processing_recipe", - message=recipe, - new_connection=True, - ) - else: - raise Exception("Unable to find transport manager") diff --git a/tests/workflows/clem/test_align_and_merge.py b/tests/workflows/clem/test_align_and_merge.py deleted file mode 100644 index 030cef5f1..000000000 --- a/tests/workflows/clem/test_align_and_merge.py +++ /dev/null @@ -1,115 +0,0 @@ -from pathlib import Path -from unittest.mock import MagicMock - -import pytest -from pytest_mock import MockerFixture - -from murfey.server.ispyb import TransportManager -from murfey.util.config import MachineConfig -from murfey.workflows.clem.align_and_merge import run - -# Folder and file settings -session_id = 0 -instrument_name = "clem" -raw_folder = "images" -processed_folder = "processed" -visit_name = "cm12345-6" -area_name = "test_area" -series_name = "test_series" -colors = [ - "gray", - "green", - "red", -] -feedback_queue = "murfey_feedback" - - -@pytest.fixture -def processed_dir(tmp_path: Path): - processed_dir = tmp_path / visit_name / processed_folder - processed_dir.mkdir(parents=True, exist_ok=True) - return processed_dir - - -@pytest.fixture -def image_stacks(processed_dir: Path): - image_dir = processed_dir / area_name / series_name - image_dir.mkdir(parents=True, exist_ok=True) - - images = [image_dir / f"{color}.tiff" for color in colors] - for image in images: - if not image.exists(): - image.touch() - - return images - - -@pytest.fixture -def metadata(processed_dir: Path): - metadata_dir = processed_dir / area_name / series_name / "metadata" - metadata_dir.mkdir(parents=True, exist_ok=True) - - metadata = metadata_dir / f"{series_name}.xml" - if not metadata.exists(): - metadata.touch() - - return metadata - - -def test_run( - mocker: MockerFixture, - image_stacks: list[Path], - metadata: Path, - processed_dir: Path, -): - # Construct the long series name - series_name_long = "--".join( - image_stacks[0].parent.relative_to(processed_dir).parts - ) - - # Create a mock tranpsort object - mock_transport = MagicMock(spec=TransportManager) - mock_transport.feedback_queue = feedback_queue - - # Construct a mock MachineConfig object for use within the function - mock_machine_config = MagicMock(spec=MachineConfig) - mock_machine_config.processed_directory_name = processed_folder - mock_get_machine_config = mocker.patch( - "murfey.workflows.clem.align_and_merge.get_machine_config" - ) - mock_get_machine_config.return_value = { - instrument_name: mock_machine_config, - } - - # Run the function - run( - session_id=session_id, - instrument_name=instrument_name, - series_name=series_name_long, - images=image_stacks, - metadata=metadata, - messenger=mock_transport, - ) - - # Construct expected recipe to be sent - sent_recipe = { - "recipes": ["clem-align-and-merge"], - "parameters": { - # Job parameters - "series_name": series_name_long, - "images": [str(file) for file in image_stacks], - "metadata": str(metadata), - # Other recipe parameters - "session_dir": str(processed_dir.parent), - "session_id": session_id, - "job_name": series_name_long, - "feedback_queue": feedback_queue, - }, - } - - # Check that it sends the expected recipe - mock_transport.send.assert_called_once_with( - "processing_recipe", - sent_recipe, - new_connection=True, - ) diff --git a/tests/workflows/clem/test_process_raw_lifs.py b/tests/workflows/clem/test_process_raw_lifs.py deleted file mode 100644 index 6ae414214..000000000 --- a/tests/workflows/clem/test_process_raw_lifs.py +++ /dev/null @@ -1,75 +0,0 @@ -from pathlib import Path -from unittest.mock import MagicMock - -import pytest - -from murfey.server.ispyb import TransportManager -from murfey.workflows.clem.process_raw_lifs import run - -# Set up variables -visit_name = "cm12345-6" -root_folder = "images" -session_id = 0 -instrument_name = "clem" -feedback_queue = "murfey_feedback" - - -@pytest.fixture -def raw_dir(tmp_path: Path): - raw_dir = tmp_path / visit_name / root_folder - raw_dir.mkdir(parents=True, exist_ok=True) - return raw_dir - - -@pytest.fixture -def lif_file(raw_dir: Path): - file = raw_dir / "test_file.lif" - if not file.exists(): - file.touch() - return file - - -def test_run( - lif_file: Path, - raw_dir: Path, -): - # Create a mock tranpsort object - mock_transport = MagicMock(spec=TransportManager) - mock_transport.feedback_queue = feedback_queue - - # Run the function with the listed parameters - run( - file=lif_file, - root_folder=root_folder, - session_id=session_id, - instrument_name=instrument_name, - messenger=mock_transport, - ) - - # Construct the recipe that we expect to send - job_name = "--".join( - [ - p.replace(" ", "_") if " " in p else p - for p in (lif_file.relative_to(raw_dir).parent / lif_file.stem).parts - ] - ) - sent_recipe = { - "recipes": ["clem-process-raw-lifs"], - "parameters": { - # Job parameters - "lif_file": f"{str(lif_file)}", - "root_folder": root_folder, - # Other recipe parameters - "session_dir": f"{str(raw_dir.parent)}", - "session_id": session_id, - "job_name": job_name, - "feedback_queue": feedback_queue, - }, - } - - # Check that it sends the expected recipe - mock_transport.send.assert_called_once_with( - queue="processing_recipe", - message=sent_recipe, - new_connection=True, - ) diff --git a/tests/workflows/clem/test_process_raw_tiffs.py b/tests/workflows/clem/test_process_raw_tiffs.py deleted file mode 100644 index 907a60ae6..000000000 --- a/tests/workflows/clem/test_process_raw_tiffs.py +++ /dev/null @@ -1,102 +0,0 @@ -from pathlib import Path -from unittest.mock import MagicMock - -import pytest - -from murfey.server.ispyb import TransportManager -from murfey.workflows.clem.process_raw_tiffs import run - -# Set up variables -session_id = 0 -instrument_name = "clem" -root_folder = "images" -visit_name = "cm12345-6" -area_name = "test_area" -feedback_queue = "murfey_feedback" - -# Properties for TIFF images -num_z = 5 -num_c = 3 - - -@pytest.fixture -def raw_dir(tmp_path: Path): - raw_dir = tmp_path / visit_name / root_folder - raw_dir.mkdir(parents=True, exist_ok=True) - return raw_dir - - -@pytest.fixture -def tiff_list(raw_dir: Path): - (raw_dir / area_name).mkdir(parents=True, exist_ok=True) - tiff_list = [ - raw_dir / area_name / f"test_series--Z{str(z).zfill(2)}--C{str(c).zfill(2)}.tif" - for z in range(num_z) - for c in range(num_c) - ] - for file in tiff_list: - if not file.exists(): - file.touch() - return tiff_list - - -@pytest.fixture -def metadata(raw_dir: Path): - (raw_dir / area_name / "Metadata").mkdir(parents=True, exist_ok=True) - metadata = raw_dir / area_name / "Metadata" / "test_series.xlif" - if not metadata.exists(): - metadata.touch() - return metadata - - -def test_run( - tiff_list: list[Path], - metadata: Path, - raw_dir: Path, -): - # Create a mock tranpsort object - mock_transport = MagicMock(spec=TransportManager) - mock_transport.feedback_queue = feedback_queue - - # Run the function with the listed parameters - run( - tiff_list=tiff_list, - root_folder=root_folder, - session_id=session_id, - instrument_name=instrument_name, - metadata=metadata, - messenger=mock_transport, - ) - - # Construct the recipe that we expect to send - job_name = "--".join( - [ - p.replace(" ", "_") if " " in p else p - for p in ( - tiff_list[0].parent.relative_to(raw_dir) - / tiff_list[0].stem.split("--")[0] - ).parts - ] - ) - sent_recipe = { - "recipes": ["clem-process-raw-tiffs"], - "parameters": { - # Job parameters - "tiff_list": "null", - "tiff_file": f"{str(tiff_list[0])}", - "root_folder": root_folder, - "metadata": f"{str(metadata)}", - # Other recipe parameters - "session_dir": f"{str(raw_dir.parent)}", - "session_id": session_id, - "job_name": job_name, - "feedback_queue": feedback_queue, - }, - } - - # Check that it sends the expected recipe - mock_transport.send.assert_called_once_with( - queue="processing_recipe", - message=sent_recipe, - new_connection=True, - ) From 6fb1048cc6d21c12889b66f790d1f8e93063c961 Mon Sep 17 00:00:00 2001 From: Eu Pin Tien Date: Wed, 19 Aug 2026 11:55:03 +0100 Subject: [PATCH 4/4] Updated tests for 'murfey.server.feedback' --- tests/server/test_feedback.py | 44 +++++++++++++++-------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/tests/server/test_feedback.py b/tests/server/test_feedback.py index a2cb52c45..eda313226 100644 --- a/tests/server/test_feedback.py +++ b/tests/server/test_feedback.py @@ -4,38 +4,32 @@ import pytest from pytest_mock import MockerFixture -feedback_callback_params_matrix = ( - # Murfey workflows currently present in pyproject.toml - ("atlas_update",), - ("clem.align_and_merge",), - ("clem.process_raw_lifs",), - ("clem.process_raw_tiffs",), - ("clem.register_align_and_merge_result",), - ("clem.register_preprocessing_result",), - ("data_collection",), - ("data_collection_group",), - ("pato",), - ("picked_particles",), - ("spa.ctf_estimated",), - ("spa.motion_corrected",), - ("picked_tomogram",), - ("processing_job",), - ("spa.flush_spa_preprocess",), -) - -@pytest.mark.parametrize("test_params", feedback_callback_params_matrix) +@pytest.mark.parametrize( + "entry_point_name", + ( + # Murfey workflows currently present in pyproject.toml + "atlas_update", + "clem.register_align_and_merge_result", + "clem.register_preprocessing_result", + "data_collection", + "data_collection_group", + "pato", + "picked_particles", + "spa.ctf_estimated", + "spa.motion_corrected", + "picked_tomogram", + "processing_job", + "spa.flush_spa_preprocess", + ), +) def test_feedback_callback( mocker: MockerFixture, - test_params: tuple[str], + entry_point_name: str, ): """ Checks that feedback-callback loop works correctly for the entry points-based workflows """ - - # Unpack test params - (entry_point_name,) = test_params - # Patch the functions used to generate the module-level variables mock_get_security_config = mocker.patch("murfey.util.config.get_security_config") mock_get_security_config.return_value = MagicMock()