11from dataclasses import dataclass
22import inspect
3- import os
3+ from pathlib import Path
44import typing
55
66import pytest
1111from resins .models .model_base import ModelData , InstrumentModel
1212
1313
14- TEST_DIR = os . path . dirname ( os . path . abspath ( __file__ ))
15- FAKE_YAML = os . path . join ( TEST_DIR , 'fake_instrument.yaml' )
14+ TEST_DIR = Path ( __file__ ). parent
15+ FAKE_YAML = TEST_DIR / 'fake_instrument.yaml'
1616
1717
1818@dataclass (init = True , repr = True , frozen = True , slots = True )
@@ -68,13 +68,6 @@ def broaden(self, omega_q, data, mesh):
6868def mock_models ():
6969 return {'mock' : MockModel }
7070
71- @pytest .fixture
72- def mock_instrument_map ():
73- return {
74- 'TEST' : ('fake_instrument.yaml' , None ),
75- 'ALIAS' : ('fake_instrument.yaml' , 'VERSION1' ),
76- }
77-
7871
7972@pytest .fixture (scope = 'module' )
8073def data ():
@@ -127,35 +120,45 @@ def test_instrument(data):
127120 )
128121
129122
130- def test_available_instruments (mock_instrument_map , mocker ):
131- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
132- assert i .Instrument .available_instruments () == ['TEST' , 'ALIAS' ]
123+ @pytest .fixture
124+ def patch_importlib_files (mocker ):
125+ """Make all calls to importlib.resources.files() return TEST_DIR
126+
127+ This is used to replace resins.instrument_data with test data
128+ """
129+ mocker .patch ('importlib.resources.files' , lambda _ : Path (TEST_DIR ))
133130
134131
135- def test_private_available_versions ( mock_instrument_map , mocker ):
136- mocker . patch ( 'resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
137- mocker . patch ( 'resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
132+ @ pytest . fixture
133+ def patch_instrument_map ( mocker ):
134+ """Replace main INSTRUMENT_MAP with test examples"""
138135
136+ instrument_map = {
137+ 'TEST' : ('fake_instrument.yaml' , None ),
138+ 'ALIAS' : ('fake_instrument.yaml' , 'VERSION1' ),
139+ }
140+ mocker .patch ('resins.instrument.INSTRUMENT_MAP' , instrument_map )
141+
142+
143+ def test_available_instruments (patch_instrument_map ):
144+ assert i .Instrument .available_instruments () == ['TEST' , 'ALIAS' ]
145+
146+
147+ def test_private_available_versions (patch_instrument_map , patch_importlib_files ):
139148 actual_versions , actual_default = i .Instrument ._available_versions (FAKE_YAML )
140149
141150 assert actual_default == 'TEST'
142151 assert actual_versions == ['VERSION1' , 'TEST' ]
143152
144153
145- def test_available_versions (mock_instrument_map , mocker ):
146- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
147- mocker .patch ('resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
148-
154+ def test_available_versions (patch_instrument_map , patch_importlib_files ):
149155 actual_versions , actual_default = i .Instrument .available_versions ('TEST' )
150156
151157 assert actual_default == 'TEST'
152158 assert actual_versions == ['VERSION1' , 'TEST' ]
153159
154160
155- def test_available_versions_alias (mock_instrument_map , mocker ):
156- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
157- mocker .patch ('resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
158-
161+ def test_available_versions_alias (patch_instrument_map , patch_importlib_files ):
159162 actual_versions , actual_default = i .Instrument .available_versions ('ALIAS' )
160163
161164 assert actual_default == 'VERSION1'
@@ -185,10 +188,7 @@ def test_from_file_invalid_version():
185188 i .Instrument .from_file (FAKE_YAML , 'INVALID_VERSION' )
186189
187190
188- def test_from_default (data , mock_instrument_map , mocker ):
189- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
190- mocker .patch ('resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
191-
191+ def test_from_default (data , patch_instrument_map , patch_importlib_files ):
192192 instrument = i .Instrument .from_default ('TEST' , 'VERSION1' )
193193
194194 assert isinstance (instrument , i .Instrument )
@@ -197,10 +197,7 @@ def test_from_default(data, mock_instrument_map, mocker):
197197 assert instrument ._models == data ['version' ]['VERSION1' ]['models' ]
198198
199199
200- def test_from_default_default (data , mock_instrument_map , mocker ):
201- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
202- mocker .patch ('resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
203-
200+ def test_from_default_default (data , patch_instrument_map , patch_importlib_files ):
204201 instrument = i .Instrument .from_default ('TEST' )
205202
206203 assert isinstance (instrument , i .Instrument )
@@ -211,20 +208,14 @@ def test_from_default_default(data, mock_instrument_map, mocker):
211208
212209@pytest .mark .parametrize ("name,expected_path,implied_ver" ,
213210 [('TEST' , FAKE_YAML , None ), ('ALIAS' , FAKE_YAML , 'VERSION1' )])
214- def test_get_file (name , expected_path , implied_ver , mock_instrument_map , mocker ):
215- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
216- mocker .patch ('resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
217-
211+ def test_get_file (name , expected_path , implied_ver , patch_instrument_map , patch_importlib_files ):
218212 actual_path , actual_version = i .Instrument ._get_file (name )
219213
220- assert actual_path == expected_path
214+ assert Path ( actual_path ) == expected_path
221215 assert actual_version == implied_ver
222216
223217
224- def test_get_file_invalid (mock_instrument_map , mocker ):
225- mocker .patch ('resins.instrument.INSTRUMENT_MAP' , mock_instrument_map )
226- mocker .patch ('resins.instrument.INSTRUMENT_DATA_PATH' , TEST_DIR )
227-
218+ def test_get_file_invalid (patch_instrument_map , patch_importlib_files ):
228219 with pytest .raises (i .InvalidInstrumentError ):
229220 i .Instrument ._get_file ('INVALID_INSTRUMENT' )
230221
0 commit comments