1import os.path 2import pathlib 3import unittest 4 5from importlib import import_module 6from importlib.readers import MultiplexedPath, NamespaceReader 7 8from . import util 9 10 11class MultiplexedPathTest(util.DiskSetup, unittest.TestCase): 12 MODULE = 'namespacedata01' 13 14 def setUp(self): 15 super().setUp() 16 self.folder = pathlib.Path(self.data.__path__[0]) 17 self.data01 = pathlib.Path(self.load_fixture('data01').__file__).parent 18 self.data02 = pathlib.Path(self.load_fixture('data02').__file__).parent 19 20 def test_init_no_paths(self): 21 with self.assertRaises(FileNotFoundError): 22 MultiplexedPath() 23 24 def test_init_file(self): 25 with self.assertRaises(NotADirectoryError): 26 MultiplexedPath(self.folder / 'binary.file') 27 28 def test_iterdir(self): 29 contents = {path.name for path in MultiplexedPath(self.folder).iterdir()} 30 try: 31 contents.remove('__pycache__') 32 except (KeyError, ValueError): 33 pass 34 self.assertEqual( 35 contents, {'subdirectory', 'binary.file', 'utf-16.file', 'utf-8.file'} 36 ) 37 38 def test_iterdir_duplicate(self): 39 contents = { 40 path.name for path in MultiplexedPath(self.folder, self.data01).iterdir() 41 } 42 for remove in ('__pycache__', '__init__.pyc'): 43 try: 44 contents.remove(remove) 45 except (KeyError, ValueError): 46 pass 47 self.assertEqual( 48 contents, 49 {'__init__.py', 'binary.file', 'subdirectory', 'utf-16.file', 'utf-8.file'}, 50 ) 51 52 def test_is_dir(self): 53 self.assertEqual(MultiplexedPath(self.folder).is_dir(), True) 54 55 def test_is_file(self): 56 self.assertEqual(MultiplexedPath(self.folder).is_file(), False) 57 58 def test_open_file(self): 59 path = MultiplexedPath(self.folder) 60 with self.assertRaises(FileNotFoundError): 61 path.read_bytes() 62 with self.assertRaises(FileNotFoundError): 63 path.read_text() 64 with self.assertRaises(FileNotFoundError): 65 path.open() 66 67 def test_join_path(self): 68 prefix = str(self.folder.parent) 69 path = MultiplexedPath(self.folder, self.data01) 70 self.assertEqual( 71 str(path.joinpath('binary.file'))[len(prefix) + 1 :], 72 os.path.join('namespacedata01', 'binary.file'), 73 ) 74 sub = path.joinpath('subdirectory') 75 assert isinstance(sub, MultiplexedPath) 76 assert 'namespacedata01' in str(sub) 77 assert 'data01' in str(sub) 78 self.assertEqual( 79 str(path.joinpath('imaginary'))[len(prefix) + 1 :], 80 os.path.join('namespacedata01', 'imaginary'), 81 ) 82 self.assertEqual(path.joinpath(), path) 83 84 def test_join_path_compound(self): 85 path = MultiplexedPath(self.folder) 86 assert not path.joinpath('imaginary/foo.py').exists() 87 88 def test_join_path_common_subdir(self): 89 prefix = str(self.data02.parent) 90 path = MultiplexedPath(self.data01, self.data02) 91 self.assertIsInstance(path.joinpath('subdirectory'), MultiplexedPath) 92 self.assertEqual( 93 str(path.joinpath('subdirectory', 'subsubdir'))[len(prefix) + 1 :], 94 os.path.join('data02', 'subdirectory', 'subsubdir'), 95 ) 96 97 def test_repr(self): 98 self.assertEqual( 99 repr(MultiplexedPath(self.folder)), 100 f"MultiplexedPath('{self.folder}')", 101 ) 102 103 def test_name(self): 104 self.assertEqual( 105 MultiplexedPath(self.folder).name, 106 os.path.basename(self.folder), 107 ) 108 109 110class NamespaceReaderTest(util.DiskSetup, unittest.TestCase): 111 MODULE = 'namespacedata01' 112 113 def test_init_error(self): 114 with self.assertRaises(ValueError): 115 NamespaceReader(['path1', 'path2']) 116 117 def test_resource_path(self): 118 namespacedata01 = import_module('namespacedata01') 119 reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) 120 121 root = self.data.__path__[0] 122 self.assertEqual( 123 reader.resource_path('binary.file'), os.path.join(root, 'binary.file') 124 ) 125 self.assertEqual( 126 reader.resource_path('imaginary'), os.path.join(root, 'imaginary') 127 ) 128 129 def test_files(self): 130 reader = NamespaceReader(self.data.__spec__.submodule_search_locations) 131 root = self.data.__path__[0] 132 self.assertIsInstance(reader.files(), MultiplexedPath) 133 self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')") 134 135 136if __name__ == '__main__': 137 unittest.main() 138