Source code for ibllib.tests.extractors.test_extractors_base

import json
import unittest
import tempfile
from pathlib import Path
from unittest.mock import patch, MagicMock

from ibllib.io.extractors import base


[docs] class TestExtractorMaps(unittest.TestCase): """Tests for functions that return Bpod extractor classes."""
[docs] def setUp(self): # Store original __import__ self.orig_import = __import__ tmp = tempfile.TemporaryDirectory() self.addCleanup(tmp.cleanup) self.custom_extractors_path = Path(tmp.name).joinpath('task_extractor_map.json') self.custom_extractors = {'fooChoiceWorld': 'Bar'} self.projects = MagicMock() self.projects.__file__ = str(self.custom_extractors_path.with_name('__init__.py')) with open(self.custom_extractors_path, 'w') as fp: json.dump(self.custom_extractors, fp)
[docs] def import_mock(self, name, *args): """Return mock for project_extraction imports.""" if name == 'projects' or name == 'projects.base': return self.projects return self.orig_import(name, *args)
[docs] def test_get_task_extractor_map(self): """Test ibllib.io.extractors.base._get_task_extractor_map function.""" # Check the custom map is loaded with patch('builtins.__import__', side_effect=self.import_mock): extractors = base._get_task_extractor_map() self.assertTrue(self.custom_extractors.items() < extractors.items()) # Test handles case where module not installed with patch('builtins.__import__', side_effect=ModuleNotFoundError): extractors = base._get_task_extractor_map() self.assertFalse(set(self.custom_extractors.items()).issubset(set(extractors.items()))) # Remove the file and check exception is caught self.custom_extractors_path.unlink() extractors = base._get_task_extractor_map() self.assertFalse(set(self.custom_extractors.items()).issubset(set(extractors.items())))
[docs] def test_get_bpod_extractor_class(self): """Test ibllib.io.extractors.base.get_bpod_extractor_class function.""" # installe # alf_path = self.custom_extractors_path.parent.joinpath('subject', '2020-01-01', '001', 'raw_task_data_00') # alf_path.mkdir(parents=True) settings_file = Path(__file__).parent.joinpath( 'data', 'session_biased_ge5', 'raw_behavior_data', '_iblrig_taskSettings.raw.json' ) # shutil.copy(settings_file, alf_path) session_path = settings_file.parents[1] self.assertEqual('BiasedTrials', base.get_bpod_extractor_class(session_path)) session_path = str(session_path).replace('session_biased_ge5', 'session_training_ge5') self.assertEqual('TrainingTrials', base.get_bpod_extractor_class(session_path)) session_path = str(session_path).replace('session_training_ge5', 'foobar') self.assertRaises(ValueError, base.get_bpod_extractor_class, session_path)
[docs] def test_protocol2extractor(self): """Test ibllib.io.extractors.base.protocol2extractor function.""" # Test fuzzy match (proc, expected), = self.custom_extractors.items() with patch('builtins.__import__', side_effect=self.import_mock): extractor = base.protocol2extractor('_mw_' + proc) self.assertEqual(expected, extractor) # Test unknown protocol self.assertRaises(ValueError, base.protocol2extractor, proc)
if __name__ == '__main__': unittest.main()