1- import xml .etree .ElementTree as ET
21from pathlib import Path
3- from typing import Any
42from unittest .mock import MagicMock
53
64import pytest
1816# -------------------------------------------------------------------------------------
1917
2018
21- def create_fib_maps_dataset_element (
22- id : int ,
23- name : str ,
24- relative_path : str ,
25- center_x : float ,
26- center_y : float ,
27- center_z : float ,
28- size_x : float ,
29- size_y : float ,
30- size_z : float ,
31- rotation_angle : float ,
32- status : str ,
33- ):
34- # Create dataset node
35- dataset = ET .Element ("Dataset" )
36- # ID node
37- id_node = ET .Element ("Id" )
38- id_node .text = str (id )
39- dataset .append (id_node )
40-
41- # Name node
42- name_node = ET .Element ("Name" )
43- name_node .text = name
44- dataset .append (name_node )
45-
46- # Stage position node
47- box_center = ET .Element ("BoxCenter" )
48- for tag , value in (
49- ("CenterX" , center_x ),
50- ("CenterY" , center_y ),
51- ("CenterZ" , center_z ),
52- ):
53- node = ET .Element (tag )
54- node .text = str (value )
55- box_center .append (node )
56- dataset .append (box_center )
57-
58- # Image size node
59- box_size = ET .Element ("BoxSize" )
60- for tag , value in (
61- ("SizeX" , size_x ),
62- ("SizeY" , size_y ),
63- ("SizeZ" , size_z ),
64- ):
65- node = ET .Element (tag )
66- node .text = str (value )
67- box_size .append (node )
68- dataset .append (box_size )
69-
70- # Rotation angle
71- angle_node = ET .Element ("RotationAngle" )
72- angle_node .text = str (rotation_angle )
73- dataset .append (angle_node )
74-
75- # Relative path
76- image_path_node = ET .Element ("FinalImages" )
77- image_path_node .text = relative_path .replace ("/" , "\\ " )
78- dataset .append (image_path_node )
79-
80- # Status
81- status_node = ET .Element ("Status" )
82- status_node .text = status
83- dataset .append (status_node )
84-
85- return dataset
86-
87-
88- def create_fib_maps_xml_metadata (
89- project_name : str ,
90- datasets : list [dict [str , Any ]],
91- ):
92- # Create root node
93- root = ET .Element ("EMProject" )
94-
95- # Project name node
96- project_name_node = ET .Element ("ProjectName" )
97- project_name_node .text = project_name
98- root .append (project_name_node )
99-
100- # Datasets node
101- datasets_node = ET .Element ("Datasets" )
102- for id , dataset in enumerate (datasets ):
103- datasets_node .append (create_fib_maps_dataset_element (id , ** dataset ))
104- root .append (datasets_node )
105-
106- return root
107-
108-
109- fib_maps_test_datasets = [
110- {
111- "name" : name ,
112- "relative_path" : relative_path ,
113- "center_x" : cx ,
114- "center_y" : cy ,
115- "center_z" : cz ,
116- "size_x" : sx ,
117- "size_y" : sy ,
118- "size_z" : sz ,
119- "rotation_angle" : ra ,
120- "status" : "Finished" ,
121- }
122- for (name , relative_path , cx , cy , cz , sx , sy , sz , ra ) in (
123- (
124- "Electron Snapshot" ,
125- "LayersData/Layer/Electron Snapshot" ,
126- - 0.002 ,
127- - 0.004 ,
128- 0.00000008 ,
129- 0.0036 ,
130- 0.0024 ,
131- 0.0 ,
132- 3.1415926535897931 ,
133- ),
134- (
135- "Electron Snapshot (2)" ,
136- "LayersData/Layer/Electron Snapshot (2)" ,
137- - 0.002 ,
138- - 0.004 ,
139- 0.00000008 ,
140- 0.0036 ,
141- 0.0024 ,
142- 0.0 ,
143- 3.1415926535897931 ,
144- ),
145- (
146- "Electron Snapshot (3)" ,
147- "LayersData/Layer/Electron Snapshot (3)" ,
148- 0.002 ,
149- 0.004 ,
150- 0.00000008 ,
151- 0.0036 ,
152- 0.0024 ,
153- 0.0 ,
154- 3.1415926535897931 ,
155- ),
156- (
157- "Electron Snapshot (4)" ,
158- "LayersData/Layer/Electron Snapshot (4)" ,
159- 0.002 ,
160- 0.004 ,
161- 0.00000008 ,
162- 0.0036 ,
163- 0.0024 ,
164- 0.0 ,
165- 3.1415926535897931 ,
166- ),
167- )
168- ]
169-
170-
17119@pytest .fixture
17220def visit_dir (tmp_path : Path ):
17321 return tmp_path / "visit"
17422
17523
17624@pytest .fixture
177- def fib_maps_metadata_file (visit_dir : Path ):
178- metadata = create_fib_maps_xml_metadata (
179- "test-project" ,
180- fib_maps_test_datasets ,
181- )
182- tree = ET .ElementTree (metadata )
183- ET .indent (tree , space = " " )
184- save_path = visit_dir / "maps/visit/EMproject.emxml"
185- if not save_path .parent .exists ():
186- save_path .parent .mkdir (parents = True , exist_ok = True )
187- tree .write (save_path , encoding = "utf-8" )
188- return save_path
189-
190-
191- @pytest .fixture
192- def fib_maps_images (fib_maps_metadata_file : Path ):
25+ def fib_maps_images (visit_dir : Path ):
19326 image_list = []
194- for dataset in fib_maps_test_datasets :
195- name = str (dataset ["name" ])
196- relative_path = str (dataset ["relative_path" ])
197- file = fib_maps_metadata_file .parent / relative_path / f"{ name } .tiff"
27+ for i in range (4 ):
28+ name = "Electron Snapshot"
29+ if i > 0 :
30+ name += f" ({ i } )"
31+ file = visit_dir / "maps/visit/LayersData/Layer" / f"{ name } .tiff"
19832 if not file .exists ():
19933 file .parent .mkdir (parents = True , exist_ok = True )
20034 file .touch ()
@@ -229,7 +63,6 @@ def test_get_source(
22963 tmp_path : Path ,
23064 visit_dir : Path ,
23165 fib_maps_images : list [Path ],
232- fib_maps_metadata_file : Path ,
23366):
23467 # Mock the MurfeyInstanceEnvironment
23568 mock_environment = MagicMock ()
@@ -238,15 +71,14 @@ def test_get_source(
23871 tmp_path / "another_dir" ,
23972 ]
24073 # Check that the correct source directory is found
241- for file in [ fib_maps_metadata_file , * fib_maps_images ] :
74+ for file in fib_maps_images :
24275 assert _get_source (file , mock_environment ) == visit_dir
24376
24477
24578def test_file_transferred_to (
24679 tmp_path : Path ,
24780 visit_dir : Path ,
24881 fib_maps_images : list [Path ],
249- fib_maps_metadata_file : Path ,
25082):
25183 # Mock the environment
25284 mock_environment = MagicMock ()
@@ -255,7 +87,7 @@ def test_file_transferred_to(
25587
25688 # Iterate across the FIB files to compare against
25789 destination_dir = tmp_path / "fib" / "data" / "current_year" / "visit"
258- for file in [ fib_maps_metadata_file , * fib_maps_images ] :
90+ for file in fib_maps_images :
25991 # Work out what the expected destination will be
26092 assert _file_transferred_to (
26193 environment = mock_environment ,
@@ -265,29 +97,36 @@ def test_file_transferred_to(
26597 ) == destination_dir / file .relative_to (visit_dir )
26698
26799
268- def test_parse_electron_snapshot_metadata ():
269- pass
270-
271-
272100def test_fib_autotem_context ():
273101 pass
274102
275103
276- @pytest .mark .parametrize ("metadata_first" , ((False , True )))
277104def test_fib_maps_context (
278105 mocker : MockerFixture ,
279106 tmp_path : Path ,
280- fib_maps_metadata_file : Path ,
107+ visit_dir : Path ,
281108 fib_maps_images : list [Path ],
282- metadata_first : bool ,
283109):
284- # Mock out irrelevant functions
285- mocker .patch ("murfey.client.contexts.fib._get_source" , return_value = tmp_path )
286- mocker .patch (
287- "murfey.client.contexts.fib._file_transferred_to" , side_effect = fib_maps_images
288- )
110+ # Mock the environment
289111 mock_environment = MagicMock ()
290112
113+ # Create a list of destinations
114+ destination_dir = tmp_path / "fib" / "data" / "current_year" / "visit"
115+ destination_files = [
116+ destination_dir / file .relative_to (visit_dir ) for file in fib_maps_images
117+ ]
118+
119+ # Mock the functions used in 'post_transfer'
120+ mock_get_source = mocker .patch (
121+ "murfey.client.contexts.fib._get_source" , return_value = tmp_path
122+ )
123+ mock_file_transferred_to = mocker .patch (
124+ "murfey.client.contexts.fib._file_transferred_to" , side_effect = destination_files
125+ )
126+ mock_register_fib_atlas = mocker .patch .object (
127+ FIBContext , "_register_atlas" , return_value = True
128+ )
129+
291130 # Initialise the FIBContext
292131 basepath = tmp_path
293132 context = FIBContext (
@@ -296,46 +135,17 @@ def test_fib_maps_context(
296135 machine_config = {},
297136 token = "" ,
298137 )
299- # Assert that its initial state is correct
300- assert not context ._electron_snapshots
301- assert not context ._electron_snapshot_metadata
302- assert not context ._electron_snapshots_submitted
303138
304- if metadata_first :
305- # Read the metadata first
306- context .post_transfer (fib_maps_metadata_file , mock_environment )
307- # Metadata field should now be populated
308- assert all (
309- name in context ._electron_snapshot_metadata .keys ()
310- for name in [image .stem for image in fib_maps_images ]
311- )
312- # Parse the images one-by-one
313- for image in fib_maps_images :
314- name = image .stem
315- context .post_transfer (image , mock_environment )
316- # Entries should now start being removed from 'metadata' and 'images' fields
317- assert (
318- name not in context ._electron_snapshots .keys ()
319- and name not in context ._electron_snapshot_metadata .keys ()
320- and name in context ._electron_snapshots_submitted
321- )
322- else :
323- # Read in images first
324- for image in fib_maps_images :
325- name = image .stem
326- context .post_transfer (image , mock_environment )
327- assert (
328- name in context ._electron_snapshots .keys ()
329- and name not in context ._electron_snapshot_metadata .keys ()
330- and name not in context ._electron_snapshots_submitted
331- )
332- # Read in the metadata
333- context .post_transfer (fib_maps_metadata_file , mock_environment )
334- assert all (
335- name in context ._electron_snapshots_submitted
336- and name not in context ._electron_snapshots .keys ()
337- and name not in context ._electron_snapshot_metadata .keys ()
338- for name in [file .stem for file in fib_maps_images ]
139+ # Parse images one-by-one
140+ for file in fib_maps_images :
141+ context .post_transfer (file , environment = mock_environment )
142+ assert mock_get_source .call_count == len (fib_maps_images )
143+ assert mock_file_transferred_to .call_count == len (fib_maps_images )
144+ assert mock_register_fib_atlas .call_count == len (fib_maps_images )
145+ for dst in destination_files :
146+ mock_register_fib_atlas .assert_any_call (
147+ dst ,
148+ mock_environment ,
339149 )
340150
341151
0 commit comments