Skip to content

Commit dcc6919

Browse files
committed
Added some unit tests for the upstream file searching functions
1 parent b119eb4 commit dcc6919

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
from pathlib import Path
2+
from unittest.mock import MagicMock
3+
4+
import pytest
5+
from pytest_mock import MockerFixture
6+
7+
from murfey.server.api.session_shared import find_upstream_visits, gather_upstream_files
8+
from murfey.util.config import MachineConfig
9+
from tests.conftest import ExampleVisit
10+
11+
12+
def test_find_upstream_visits(
13+
mocker: MockerFixture,
14+
tmp_path: Path,
15+
# murfey_db_session,
16+
):
17+
# Get the visit, instrument name, and session ID
18+
visit_name_root = f"{ExampleVisit.proposal_code}{ExampleVisit.proposal_number}"
19+
visit_name = f"{visit_name_root}-{ExampleVisit.visit_number}"
20+
instrument_name = ExampleVisit.instrument_name
21+
session_id = ExampleVisit.murfey_session_id
22+
23+
# Mock the database call
24+
mock_murfey_session_row = MagicMock()
25+
mock_murfey_session_row.visit = visit_name
26+
mock_murfey_session_row.instrument_name = instrument_name
27+
mock_murfey_db = MagicMock()
28+
mock_murfey_db.exec.return_value.one.return_value = mock_murfey_session_row
29+
30+
# Create mock upstream visit directories and necessary data structures
31+
upstream_visits = {}
32+
upstream_data_dirs = {}
33+
for n in range(5):
34+
upstream_instrument = f"{instrument_name}{str(n).zfill(2)}"
35+
upstream_visit = (
36+
tmp_path / f"{upstream_instrument}/data/2020/{visit_name_root}-{n}"
37+
)
38+
upstream_visit.mkdir(parents=True, exist_ok=True)
39+
upstream_visits[upstream_instrument] = {upstream_visit.stem: upstream_visit}
40+
upstream_data_dirs[upstream_instrument] = upstream_visit.parent
41+
42+
# Mock the MachineConfig for this instrument
43+
mock_machine_config = MagicMock(spec=MachineConfig)
44+
mock_machine_config.upstream_data_directories = upstream_data_dirs
45+
mock_get_machine_config = mocker.patch(
46+
"murfey.server.api.session_shared.get_machine_config",
47+
)
48+
mock_get_machine_config.return_value = {instrument_name: mock_machine_config}
49+
50+
# Run the function:
51+
result = find_upstream_visits(session_id=session_id, db=mock_murfey_db)
52+
53+
# Mock the database call
54+
assert result == upstream_visits
55+
56+
57+
gather_upstream_files_test_matrix: tuple[
58+
tuple[tuple[str, list[str], list[str]], ...], ...
59+
] = (
60+
# CLEM
61+
(
62+
# Search strings, files to match, and files to avoid
63+
(
64+
"processed/**/composite*.tiff",
65+
[
66+
file
67+
for sublist in [
68+
[
69+
f"processed/grid1/TileScan1/Position_{n}/composite_BF_FL.tiff"
70+
for n in range(5)
71+
],
72+
]
73+
for file in sublist
74+
],
75+
[
76+
file
77+
for sublist in [
78+
[
79+
f"processed/grid1/TileScan1/Position_{n}/{color}.tiff"
80+
for n in range(5)
81+
for color in ("gray", "green", "red")
82+
],
83+
]
84+
for file in sublist
85+
],
86+
),
87+
(
88+
"screenshots/**/*",
89+
[
90+
file
91+
for sublist in [
92+
[f"screenshots/overview_{n}.png" for n in range(10)],
93+
[f"screenshots/annotated_{n}.png" for n in range(10)],
94+
]
95+
for file in sublist
96+
],
97+
[],
98+
),
99+
),
100+
# FIB
101+
(
102+
# Search strings, files to match, and files to avoid
103+
(
104+
"maps/**/*",
105+
[
106+
file
107+
for sublist in [
108+
[f"maps/data_{n}.txt" for n in range(5)],
109+
[f"maps/map/image_{n}.tiff" for n in range(5)],
110+
]
111+
for file in sublist
112+
],
113+
[],
114+
),
115+
),
116+
)
117+
118+
119+
@pytest.mark.parametrize("test_params", gather_upstream_files_test_matrix)
120+
def test_gather_upstream_files(
121+
mocker: MockerFixture,
122+
tmp_path: Path,
123+
test_params: tuple[tuple[str, list[str], list[str]], ...],
124+
):
125+
# Get the visit, instrument name, and session ID
126+
visit_name_root = f"{ExampleVisit.proposal_code}{ExampleVisit.proposal_number}"
127+
visit_name = f"{visit_name_root}-{ExampleVisit.visit_number}"
128+
instrument_name = ExampleVisit.instrument_name
129+
session_id = ExampleVisit.murfey_session_id
130+
131+
# Unpack the test params
132+
search_strings = [item[0] for item in test_params]
133+
upstream_relative_paths = [file for item in test_params for file in item[1]]
134+
other_relative_paths = [file for item in test_params for file in item[2]]
135+
136+
# Set the upstream instrument and upstream visit to access
137+
upstream_instrument = f"{instrument_name}01"
138+
upstream_visit = f"{visit_name_root}-5"
139+
upstream_visit_path = tmp_path / f"{upstream_instrument}/data/2020/{upstream_visit}"
140+
141+
# Construct the files and directories
142+
upstream_files = [
143+
upstream_visit_path / relative_path for relative_path in upstream_relative_paths
144+
]
145+
other_files = [
146+
upstream_visit_path / relative_path for relative_path in other_relative_paths
147+
]
148+
149+
for file in upstream_files:
150+
if not file.parent.exists():
151+
file.parent.mkdir(parents=True)
152+
file.touch(exist_ok=True)
153+
assert file.is_file()
154+
for file in other_files:
155+
if not file.parent.exists():
156+
file.parent.mkdir(parents=True)
157+
file.touch(exist_ok=True)
158+
assert file.is_file()
159+
160+
# Mock the database call
161+
mock_murfey_session_row = MagicMock()
162+
mock_murfey_session_row.visit = visit_name
163+
mock_murfey_session_row.instrument_name = instrument_name
164+
mock_murfey_db = MagicMock()
165+
mock_murfey_db.exec.return_value.one.return_value = mock_murfey_session_row
166+
167+
# Mock the MachineConfig for this instrument
168+
mock_machine_config = MagicMock(spec=MachineConfig)
169+
mock_machine_config.upstream_data_search_strings = {
170+
upstream_instrument: search_strings
171+
}
172+
mock_get_machine_config = mocker.patch(
173+
"murfey.server.api.session_shared.get_machine_config",
174+
)
175+
mock_get_machine_config.return_value = {instrument_name: mock_machine_config}
176+
177+
assert sorted(
178+
gather_upstream_files(
179+
session_id=session_id,
180+
upstream_instrument=upstream_instrument,
181+
upstream_visit_path=upstream_visit_path,
182+
db=mock_murfey_db,
183+
)
184+
) == sorted(upstream_files)

0 commit comments

Comments
 (0)