Issue #19712: Port test.test_importlib.import_ tests to use PEP 451
that don't require changing test.test_importlib.util.mock_modules().
This commit is contained in:
parent
a951f3d1ac
commit
ed05b8a1a1
|
@ -1,3 +1,4 @@
|
|||
from importlib import machinery
|
||||
import sys
|
||||
import types
|
||||
import unittest
|
||||
|
@ -6,6 +7,27 @@ from .. import util
|
|||
from . import util as import_util
|
||||
|
||||
|
||||
class SpecLoaderMock:
|
||||
|
||||
def find_spec(self, fullname, path=None, target=None):
|
||||
return machinery.ModuleSpec(fullname, self)
|
||||
|
||||
def exec_module(self, module):
|
||||
pass
|
||||
|
||||
|
||||
class SpecLoaderAttributeTests:
|
||||
|
||||
def test___loader__(self):
|
||||
loader = SpecLoaderMock()
|
||||
with util.uncache('blah'), util.import_state(meta_path=[loader]):
|
||||
module = self.__import__('blah')
|
||||
self.assertEqual(loader, module.__loader__)
|
||||
|
||||
Frozen_SpecTests, Source_SpecTests = util.test_both(
|
||||
SpecLoaderAttributeTests, __import__=import_util.__import__)
|
||||
|
||||
|
||||
class LoaderMock:
|
||||
|
||||
def find_module(self, fullname, path=None):
|
||||
|
|
|
@ -1,19 +1,37 @@
|
|||
from .. import util
|
||||
from . import util as import_util
|
||||
|
||||
from importlib import machinery
|
||||
import sys
|
||||
import types
|
||||
import unittest
|
||||
|
||||
PKG_NAME = 'fine'
|
||||
SUBMOD_NAME = 'fine.bogus'
|
||||
|
||||
|
||||
class BadSpecFinderLoader:
|
||||
@classmethod
|
||||
def find_spec(cls, fullname, path=None, target=None):
|
||||
if fullname == SUBMOD_NAME:
|
||||
spec = machinery.ModuleSpec(fullname, cls)
|
||||
return spec
|
||||
|
||||
@staticmethod
|
||||
def exec_module(module):
|
||||
if module.__name__ == SUBMOD_NAME:
|
||||
raise ImportError('I cannot be loaded!')
|
||||
|
||||
|
||||
class BadLoaderFinder:
|
||||
bad = 'fine.bogus'
|
||||
@classmethod
|
||||
def find_module(cls, fullname, path):
|
||||
if fullname == cls.bad:
|
||||
if fullname == SUBMOD_NAME:
|
||||
return cls
|
||||
|
||||
@classmethod
|
||||
def load_module(cls, fullname):
|
||||
if fullname == cls.bad:
|
||||
if fullname == SUBMOD_NAME:
|
||||
raise ImportError('I cannot be loaded!')
|
||||
|
||||
|
||||
|
@ -37,27 +55,39 @@ class APITest:
|
|||
def test_nonexistent_fromlist_entry(self):
|
||||
# If something in fromlist doesn't exist, that's okay.
|
||||
# issue15715
|
||||
mod = types.ModuleType('fine')
|
||||
mod = types.ModuleType(PKG_NAME)
|
||||
mod.__path__ = ['XXX']
|
||||
with util.import_state(meta_path=[BadLoaderFinder]):
|
||||
with util.uncache('fine'):
|
||||
sys.modules['fine'] = mod
|
||||
self.__import__('fine', fromlist=['not here'])
|
||||
with util.import_state(meta_path=[self.bad_finder_loader]):
|
||||
with util.uncache(PKG_NAME):
|
||||
sys.modules[PKG_NAME] = mod
|
||||
self.__import__(PKG_NAME, fromlist=['not here'])
|
||||
|
||||
def test_fromlist_load_error_propagates(self):
|
||||
# If something in fromlist triggers an exception not related to not
|
||||
# existing, let that exception propagate.
|
||||
# issue15316
|
||||
mod = types.ModuleType('fine')
|
||||
mod = types.ModuleType(PKG_NAME)
|
||||
mod.__path__ = ['XXX']
|
||||
with util.import_state(meta_path=[BadLoaderFinder]):
|
||||
with util.uncache('fine'):
|
||||
sys.modules['fine'] = mod
|
||||
with util.import_state(meta_path=[self.bad_finder_loader]):
|
||||
with util.uncache(PKG_NAME):
|
||||
sys.modules[PKG_NAME] = mod
|
||||
with self.assertRaises(ImportError):
|
||||
self.__import__('fine', fromlist=['bogus'])
|
||||
self.__import__(PKG_NAME,
|
||||
fromlist=[SUBMOD_NAME.rpartition('.')[-1]])
|
||||
|
||||
Frozen_APITests, Source_APITests = util.test_both(
|
||||
APITest, __import__=import_util.__import__)
|
||||
|
||||
class OldAPITests(APITest):
|
||||
bad_finder_loader = BadLoaderFinder
|
||||
|
||||
Frozen_OldAPITests, Source_OldAPITests = util.test_both(
|
||||
OldAPITests, __import__=import_util.__import__)
|
||||
|
||||
|
||||
class SpecAPITests(APITest):
|
||||
bad_finder_loader = BadSpecFinderLoader
|
||||
|
||||
Frozen_SpecAPITests, Source_SpecAPITests = util.test_both(
|
||||
SpecAPITests, __import__=import_util.__import__)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -17,7 +17,7 @@ class FinderTests:
|
|||
"""Tests for PathFinder."""
|
||||
|
||||
def test_failure(self):
|
||||
# Test None returned upon not finding a suitable finder.
|
||||
# Test None returned upon not finding a suitable loader.
|
||||
module = '<test module>'
|
||||
with util.import_state():
|
||||
self.assertIsNone(self.machinery.PathFinder.find_module(module))
|
||||
|
|
Loading…
Reference in New Issue