@@ -39,7 +39,7 @@ def test_find_upstream_visits(
3939 # Create some as directories, and some as files
4040 if n % 2 :
4141 # Only directories should be picked up
42- upstream_visit .mkdir (parents = True , exist_ok = True )
42+ ( upstream_visit / "images" / "grid_1" ) .mkdir (parents = True , exist_ok = True )
4343 upstream_visits [upstream_instrument ] = {upstream_visit .stem : upstream_visit }
4444 # Check that the function can cope with recursive searching
4545 upstream_data_dirs [upstream_instrument ] = (
@@ -57,10 +57,66 @@ def test_find_upstream_visits(
5757 )
5858 mock_get_machine_config .return_value = {instrument_name : mock_machine_config }
5959
60- # Run the function:
60+ # Run the function
6161 result = find_upstream_visits (session_id = session_id , db = mock_murfey_db )
6262
63+ # Check that the expected directories are returned
64+ assert result == upstream_visits
65+
66+
67+ def test_find_upstream_visits_permission_error (
68+ mocker : MockerFixture ,
69+ tmp_path : Path ,
70+ ):
71+ # Get the visit, instrument name, and session ID
72+ visit_name_root = f"{ ExampleVisit .proposal_code } { ExampleVisit .proposal_number } "
73+ visit_name = f"{ visit_name_root } -{ ExampleVisit .visit_number } "
74+ instrument_name = ExampleVisit .instrument_name
75+ session_id = ExampleVisit .murfey_session_id
76+
6377 # Mock the database call
78+ mock_murfey_session_row = MagicMock ()
79+ mock_murfey_session_row .visit = visit_name
80+ mock_murfey_session_row .instrument_name = instrument_name
81+ mock_murfey_db = MagicMock ()
82+ mock_murfey_db .exec .return_value .one .return_value = mock_murfey_session_row
83+
84+ # Create mock upstream visit directories and necessary data structures
85+ upstream_visits : dict [str , dict ] = {}
86+ upstream_data_dirs = {}
87+ for n in range (10 ):
88+ upstream_instrument = f"{ instrument_name } { str (n ).zfill (2 )} "
89+ upstream_visit = (
90+ tmp_path / f"{ upstream_instrument } /data/2020/{ visit_name_root } -{ n } "
91+ )
92+ # Create some as directories, and some as files
93+ if n % 2 :
94+ upstream_visit .mkdir (parents = True , exist_ok = True )
95+ upstream_data_dirs [upstream_instrument ] = upstream_visit .parent .parent
96+ # With os.scandir set to raise PermissionError, dictionaries should be empty
97+ upstream_visits [upstream_instrument ] = {}
98+ else :
99+ upstream_visit .parent .mkdir (parents = True , exist_ok = True )
100+ upstream_visit .touch (exist_ok = True )
101+
102+ # Mock the MachineConfig for this instrument
103+ mock_machine_config = MagicMock (spec = MachineConfig )
104+ mock_machine_config .upstream_data_directories = upstream_data_dirs
105+ mock_get_machine_config = mocker .patch (
106+ "murfey.server.api.session_shared.get_machine_config" ,
107+ )
108+ mock_get_machine_config .return_value = {instrument_name : mock_machine_config }
109+
110+ # Mock the 'os.scandir' function used
111+ mocker .patch (
112+ "murfey.server.api.session_shared.os.scandir" ,
113+ side_effect = PermissionError (),
114+ )
115+
116+ # Run the function:
117+ result = find_upstream_visits (session_id = session_id , db = mock_murfey_db )
118+
119+ # With 'os.scandir' mocked to raise PermissionError, no entries should be returned
64120 assert result == upstream_visits
65121
66122
0 commit comments