Skip to content

Commit bb0492f

Browse files
committed
Added test to check that the '_scan_directory' class function works for the CLEM workflow with an active blacklist
1 parent f19a5b2 commit bb0492f

File tree

1 file changed

+150
-15
lines changed

1 file changed

+150
-15
lines changed

tests/client/test_watchdir.py

Lines changed: 150 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,10 @@
99
from tests.conftest import ExampleVisit
1010

1111

12-
@pytest.fixture
13-
def visit_dir(tmp_path: Path):
14-
visit_name = f"{ExampleVisit.proposal_code}{ExampleVisit.proposal_number}-{ExampleVisit.visit_number}"
15-
visit_dir = tmp_path / "data" / "2025" / visit_name
16-
visit_dir.mkdir(parents=True, exist_ok=True)
17-
return visit_dir
18-
19-
20-
def test_dirwatcher_initialises(visit_dir: Path):
12+
def test_dirwatcher_initialises(tmp_path: Path):
2113
# Check that the DirWatcher initialises with the default attributes
22-
watcher = DirWatcher(path=str(visit_dir))
23-
assert watcher._basepath == os.fspath(visit_dir)
14+
watcher = DirWatcher(path=str(tmp_path))
15+
assert watcher._basepath == os.fspath(str(tmp_path))
2416
assert watcher._lastscan == {}
2517
assert watcher._file_candidates == {}
2618
assert watcher._statusbar is None
@@ -36,9 +28,152 @@ def test_dirwatcher_initialises(visit_dir: Path):
3628
assert watcher._halt_thread is False
3729

3830
# Check that the string representation is as expected
39-
assert str(watcher) == f"<DirWatcher ({os.fspath(str(visit_dir))})>"
31+
assert str(watcher) == f"<DirWatcher ({os.fspath(str(tmp_path))})>"
32+
33+
34+
@pytest.fixture
35+
def clem_visit_dir(tmp_path: Path):
36+
visit_name = f"{ExampleVisit.proposal_code}{ExampleVisit.proposal_number}-{ExampleVisit.visit_number}"
37+
visit_dir = tmp_path / "clem" / "data" / "2025" / visit_name
38+
visit_dir.mkdir(parents=True, exist_ok=True)
39+
return visit_dir
40+
41+
42+
@pytest.fixture
43+
def clem_test_files(clem_visit_dir: Path):
44+
# Create test files for the DirWatcher to scan
45+
file_list: list[Path] = []
46+
project_dir = clem_visit_dir / "images" / "test_grid"
47+
48+
# Example atlas collection
49+
for s in range(20):
50+
file_list.append(
51+
project_dir
52+
/ "Overview 1"
53+
/ "Image 1"
54+
/ f"Image 1--Stage{str(s).zfill(2)}.tif"
55+
)
56+
file_list.append(
57+
project_dir / "Overview 1" / "Image 1" / "Metadata" / "Image 1.xlif"
58+
)
59+
60+
# Example image stack collection
61+
for c in range(3):
62+
for z in range(10):
63+
file_list.append(
64+
project_dir
65+
/ "TileScan 1"
66+
/ "Position 1"
67+
/ f"Position 1--C{str(c).zfill(2)}--Z{str(z).zfill(2)}.tif"
68+
)
69+
file_list.append(
70+
project_dir / "TileScan 1" / "Position 1" / "Metadata" / "Position 1.xlif"
71+
)
72+
73+
# Create all files and directories specified
74+
for file in file_list:
75+
if not file.parent.exists():
76+
file.parent.mkdir(parents=True)
77+
if not file.exists():
78+
file.touch()
79+
return sorted(file_list)
80+
81+
82+
@pytest.fixture
83+
def clem_junk_files(clem_visit_dir: Path):
84+
# Create junk files that are to be blacklisted from the CLEM workflow
85+
file_list: list[Path] = []
86+
project_dir = clem_visit_dir / "images" / "test_grid"
87+
88+
# Create junk atlas data
89+
for n in range(5):
90+
for s in range(20):
91+
file_list.append(
92+
project_dir
93+
/ "Image 1"
94+
/ f"Image 1_pmd_{n}"
95+
/ f"Image 1_pmd_{n}--Stage{str(s).zfill(2)}.tif"
96+
)
97+
file_list.append(
98+
project_dir / "Image 1" / f"Image 1_pmd_{n}" / "Metadata" / "Image 1.xlif"
99+
)
100+
101+
# Creat junk image data
102+
for n in range(5):
103+
for c in range(3):
104+
for z in range(10):
105+
file_list.append(
106+
project_dir
107+
/ "Position 1"
108+
/ f"Position 1_pmd_{n}"
109+
/ f"Position 1_pmd_{n}--C{str(c).zfill(2)}--Z{str(z).zfill(2)}.tif"
110+
)
111+
file_list.append(
112+
project_dir
113+
/ "Position 1"
114+
/ f"Position 1_pmd_{n}"
115+
/ "Metadata"
116+
/ "Position 1.xlif"
117+
)
118+
119+
# Create remaining junk files
120+
for file_path in (
121+
"1.xlef",
122+
"Metadata/IOManagerConfiguation.xlif",
123+
"Metadata/Overview 1.xlcf",
124+
"Metadata/TileScan 1.xlcf",
125+
"Overview 1/Image 1/Image 1_histo.lof",
126+
"TileScan 1/Position 1/Position 1_histo.lof",
127+
"Overview 1/Image 1/Metadata/Image 1_histo.xlif",
128+
"TileScan 1/Position 1/Metadata/Position 1_histo.xlif",
129+
):
130+
file_list.append(project_dir / file_path)
131+
132+
# Create files and directoriees
133+
for file in file_list:
134+
if not file.parent.exists():
135+
file.parent.mkdir(parents=True)
136+
if not file.exists():
137+
file.touch()
138+
return sorted(file_list)
139+
140+
141+
scan_directory_params_matrix: tuple[tuple[str, dict[str, list[str]]], ...] = (
142+
# Workflow type | Substrings blacklist
143+
(
144+
"clem",
145+
{
146+
"directories": [
147+
"_pmd_",
148+
],
149+
"files": [
150+
".xlef",
151+
".xlcf",
152+
"_histo.lof",
153+
"_histo.xlif",
154+
"IOManagerConfiguation.xlif",
155+
],
156+
},
157+
),
158+
)
159+
40160

161+
@pytest.mark.parametrize("test_params", scan_directory_params_matrix)
162+
def test_scan_directory(
163+
clem_visit_dir: Path,
164+
clem_test_files: list[Path],
165+
clem_junk_files: list[Path],
166+
test_params: tuple[str, dict[str, list[str]]],
167+
):
168+
# Unpack test params
169+
workflow_type, substrings_blacklist = test_params
41170

42-
@pytest.mark.skip
43-
def test_scan_directory():
44-
pass
171+
# Initialise different watchers based on the workflow to test and run the scan
172+
if workflow_type == "clem":
173+
watcher = DirWatcher(
174+
path=str(clem_visit_dir),
175+
substrings_blacklist=substrings_blacklist,
176+
)
177+
result = watcher._scan_directory()
178+
# Check that the result does not contain the junk files
179+
assert [str(file) for file in clem_test_files] == sorted(result.keys())

0 commit comments

Comments
 (0)