ยปCore Development>Code coverage>Lib/importlib/test/test_util.py

Python code coverage for Lib/importlib/test/test_util.py

#countcontent
1n/afrom importlib import util
2n/afrom . import util as test_util
3n/aimport imp
4n/aimport sys
5n/aimport types
6n/aimport unittest
7n/a
8n/a
9n/aclass ModuleForLoaderTests(unittest.TestCase):
10n/a
11n/a """Tests for importlib.util.module_for_loader."""
12n/a
13n/a def return_module(self, name):
14n/a fxn = util.module_for_loader(lambda self, module: module)
15n/a return fxn(self, name)
16n/a
17n/a def raise_exception(self, name):
18n/a def to_wrap(self, module):
19n/a raise ImportError
20n/a fxn = util.module_for_loader(to_wrap)
21n/a try:
22n/a fxn(self, name)
23n/a except ImportError:
24n/a pass
25n/a
26n/a def test_new_module(self):
27n/a # Test that when no module exists in sys.modules a new module is
28n/a # created.
29n/a module_name = 'a.b.c'
30n/a with test_util.uncache(module_name):
31n/a module = self.return_module(module_name)
32n/a self.assertIn(module_name, sys.modules)
33n/a self.assertIsInstance(module, types.ModuleType)
34n/a self.assertEqual(module.__name__, module_name)
35n/a
36n/a def test_reload(self):
37n/a # Test that a module is reused if already in sys.modules.
38n/a name = 'a.b.c'
39n/a module = imp.new_module('a.b.c')
40n/a with test_util.uncache(name):
41n/a sys.modules[name] = module
42n/a returned_module = self.return_module(name)
43n/a self.assertIs(returned_module, sys.modules[name])
44n/a
45n/a def test_new_module_failure(self):
46n/a # Test that a module is removed from sys.modules if added but an
47n/a # exception is raised.
48n/a name = 'a.b.c'
49n/a with test_util.uncache(name):
50n/a self.raise_exception(name)
51n/a self.assertNotIn(name, sys.modules)
52n/a
53n/a def test_reload_failure(self):
54n/a # Test that a failure on reload leaves the module in-place.
55n/a name = 'a.b.c'
56n/a module = imp.new_module(name)
57n/a with test_util.uncache(name):
58n/a sys.modules[name] = module
59n/a self.raise_exception(name)
60n/a self.assertIs(module, sys.modules[name])
61n/a
62n/a def test_decorator_attrs(self):
63n/a def fxn(self, module): pass
64n/a wrapped = util.module_for_loader(fxn)
65n/a self.assertEqual(wrapped.__name__, fxn.__name__)
66n/a self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
67n/a
68n/a def test_false_module(self):
69n/a # If for some odd reason a module is considered false, still return it
70n/a # from sys.modules.
71n/a class FalseModule(types.ModuleType):
72n/a def __bool__(self): return False
73n/a
74n/a name = 'mod'
75n/a module = FalseModule(name)
76n/a with test_util.uncache(name):
77n/a self.assertFalse(module)
78n/a sys.modules[name] = module
79n/a given = self.return_module(name)
80n/a self.assertIs(given, module)
81n/a
82n/a def test_attributes_set(self):
83n/a # __name__, __loader__, and __package__ should be set (when
84n/a # is_package() is defined; undefined implicitly tested elsewhere).
85n/a class FakeLoader:
86n/a def __init__(self, is_package):
87n/a self._pkg = is_package
88n/a def is_package(self, name):
89n/a return self._pkg
90n/a @util.module_for_loader
91n/a def load_module(self, module):
92n/a return module
93n/a
94n/a name = 'pkg.mod'
95n/a with test_util.uncache(name):
96n/a loader = FakeLoader(False)
97n/a module = loader.load_module(name)
98n/a self.assertEqual(module.__name__, name)
99n/a self.assertIs(module.__loader__, loader)
100n/a self.assertEqual(module.__package__, 'pkg')
101n/a
102n/a name = 'pkg.sub'
103n/a with test_util.uncache(name):
104n/a loader = FakeLoader(True)
105n/a module = loader.load_module(name)
106n/a self.assertEqual(module.__name__, name)
107n/a self.assertIs(module.__loader__, loader)
108n/a self.assertEqual(module.__package__, name)
109n/a
110n/a
111n/aclass SetPackageTests(unittest.TestCase):
112n/a
113n/a """Tests for importlib.util.set_package."""
114n/a
115n/a def verify(self, module, expect):
116n/a """Verify the module has the expected value for __package__ after
117n/a passing through set_package."""
118n/a fxn = lambda: module
119n/a wrapped = util.set_package(fxn)
120n/a wrapped()
121n/a self.assertTrue(hasattr(module, '__package__'))
122n/a self.assertEqual(expect, module.__package__)
123n/a
124n/a def test_top_level(self):
125n/a # __package__ should be set to the empty string if a top-level module.
126n/a # Implicitly tests when package is set to None.
127n/a module = imp.new_module('module')
128n/a module.__package__ = None
129n/a self.verify(module, '')
130n/a
131n/a def test_package(self):
132n/a # Test setting __package__ for a package.
133n/a module = imp.new_module('pkg')
134n/a module.__path__ = ['<path>']
135n/a module.__package__ = None
136n/a self.verify(module, 'pkg')
137n/a
138n/a def test_submodule(self):
139n/a # Test __package__ for a module in a package.
140n/a module = imp.new_module('pkg.mod')
141n/a module.__package__ = None
142n/a self.verify(module, 'pkg')
143n/a
144n/a def test_setting_if_missing(self):
145n/a # __package__ should be set if it is missing.
146n/a module = imp.new_module('mod')
147n/a if hasattr(module, '__package__'):
148n/a delattr(module, '__package__')
149n/a self.verify(module, '')
150n/a
151n/a def test_leaving_alone(self):
152n/a # If __package__ is set and not None then leave it alone.
153n/a for value in (True, False):
154n/a module = imp.new_module('mod')
155n/a module.__package__ = value
156n/a self.verify(module, value)
157n/a
158n/a def test_decorator_attrs(self):
159n/a def fxn(module): pass
160n/a wrapped = util.set_package(fxn)
161n/a self.assertEqual(wrapped.__name__, fxn.__name__)
162n/a self.assertEqual(wrapped.__qualname__, fxn.__qualname__)
163n/a
164n/a
165n/aclass ResolveNameTests(unittest.TestCase):
166n/a
167n/a """Tests importlib.util.resolve_name()."""
168n/a
169n/a def test_absolute(self):
170n/a # bacon
171n/a self.assertEqual('bacon', util.resolve_name('bacon', None))
172n/a
173n/a def test_aboslute_within_package(self):
174n/a # bacon in spam
175n/a self.assertEqual('bacon', util.resolve_name('bacon', 'spam'))
176n/a
177n/a def test_no_package(self):
178n/a # .bacon in ''
179n/a with self.assertRaises(ValueError):
180n/a util.resolve_name('.bacon', '')
181n/a
182n/a def test_in_package(self):
183n/a # .bacon in spam
184n/a self.assertEqual('spam.eggs.bacon',
185n/a util.resolve_name('.bacon', 'spam.eggs'))
186n/a
187n/a def test_other_package(self):
188n/a # ..bacon in spam.bacon
189n/a self.assertEqual('spam.bacon',
190n/a util.resolve_name('..bacon', 'spam.eggs'))
191n/a
192n/a def test_escape(self):
193n/a # ..bacon in spam
194n/a with self.assertRaises(ValueError):
195n/a util.resolve_name('..bacon', 'spam')
196n/a
197n/a
198n/adef test_main():
199n/a from test import support
200n/a support.run_unittest(
201n/a ModuleForLoaderTests,
202n/a SetPackageTests,
203n/a ResolveNameTests
204n/a )
205n/a
206n/a
207n/aif __name__ == '__main__':
208n/a test_main()