Skip to content

Commit eea1674

Browse files
committed
Added unit test for 'align_and_merge' workflow
1 parent 64cb692 commit eea1674

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
from pathlib import Path
2+
from unittest.mock import MagicMock, patch
3+
4+
import pytest
5+
6+
from murfey.server.ispyb import TransportManager
7+
from murfey.util.config import MachineConfig
8+
from murfey.workflows.clem.align_and_merge import submit_cluster_request
9+
10+
# Folder and file settings
11+
session_id = 0
12+
instrument_name = "clem"
13+
raw_folder = "images"
14+
processed_folder = "processed"
15+
visit_name = "cm12345-6"
16+
area_name = "test_area"
17+
series_name = "test_series"
18+
colors = [
19+
"gray",
20+
"green",
21+
"red",
22+
]
23+
feedback_queue = "murfey_feedback"
24+
25+
# Align and merge settings
26+
crop_to_n_frames = 20
27+
align_self = "enabled"
28+
flatten = "max"
29+
align_across = "enabled"
30+
31+
32+
@pytest.fixture
33+
def processed_dir(tmp_path: Path):
34+
processed_dir = tmp_path / visit_name / processed_folder
35+
processed_dir.mkdir(parents=True, exist_ok=True)
36+
return processed_dir
37+
38+
39+
@pytest.fixture
40+
def image_stacks(processed_dir: Path):
41+
42+
image_dir = processed_dir / area_name / series_name
43+
image_dir.mkdir(parents=True, exist_ok=True)
44+
45+
images = [image_dir / f"{color}.tiff" for color in colors]
46+
for image in images:
47+
if not image.exists():
48+
image.touch()
49+
50+
return images
51+
52+
53+
@pytest.fixture
54+
def metadata(processed_dir: Path):
55+
56+
metadata_dir = processed_dir / area_name / series_name / "metadata"
57+
metadata_dir.mkdir(parents=True, exist_ok=True)
58+
59+
metadata = metadata_dir / f"{series_name}.xml"
60+
if not metadata.exists():
61+
metadata.touch()
62+
63+
return metadata
64+
65+
66+
@patch("murfey.workflows.clem.align_and_merge.get_machine_config")
67+
def test_submit_cluster_request(
68+
image_stacks: list[Path],
69+
metadata: Path,
70+
processed_dir: Path,
71+
mock_get_machine_config,
72+
):
73+
74+
# Construct the long series name
75+
series_name_long = "--".join(
76+
image_stacks[0].parent.relative_to(processed_dir).parts
77+
)
78+
79+
# Create a mock tranpsort object
80+
mock_transport = MagicMock(spec=TransportManager)
81+
mock_transport.feedback_queue = feedback_queue
82+
83+
# Construct a mock MachineConfig object for use within the function
84+
mock_machine_config = MagicMock(spec=MachineConfig)
85+
mock_machine_config.return_value.processed_directory_name = processed_folder
86+
mock_get_machine_config.return_value = {
87+
instrument_name: mock_machine_config,
88+
}
89+
90+
# Run the function
91+
submit_cluster_request(
92+
session_id=session_id,
93+
instrument_name=instrument_name,
94+
series_name=series_name_long,
95+
images=image_stacks,
96+
metadata=metadata,
97+
crop_to_n_frames=crop_to_n_frames,
98+
align_self=align_self,
99+
flatten=flatten,
100+
align_across=align_across,
101+
messenger=mock_transport,
102+
)
103+
104+
# Construct expected recipe to be sent
105+
sent_recipe = {
106+
"recipes": ["clem-align-and-merge"],
107+
"parameters": {
108+
# Job parameters
109+
"series_name": series_name_long,
110+
"images": [str(file) for file in image_stacks],
111+
"metadata": str(metadata),
112+
"crop_to_n_frames": crop_to_n_frames,
113+
"align_self": align_self,
114+
"flatten": flatten,
115+
"align_across": align_across,
116+
# Other recipe parameters
117+
"session_dir": str(processed_dir.parent),
118+
"session_id": session_id,
119+
"job_name": series_name,
120+
"feedback_queue": feedback_queue,
121+
},
122+
}
123+
124+
# Check that it sends the expected recipe
125+
mock_transport.send.assert_called_once_with(
126+
"processing_recipe",
127+
sent_recipe,
128+
new_connection=True,
129+
)

0 commit comments

Comments
 (0)