Skip to content

Commit c2111a4

Browse files
committed
Added unit test to check that 'find_upstream_visits' correctly handles PermissionError
1 parent 4a0926e commit c2111a4

1 file changed

Lines changed: 58 additions & 2 deletions

File tree

tests/server/api/test_session_shared.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)