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:
Brett Cannon 2013-11-29 16:17:05 -05:00
parent a951f3d1ac
commit ed05b8a1a1
3 changed files with 68 additions and 16 deletions

View File

@ -1,3 +1,4 @@
from importlib import machinery
import sys import sys
import types import types
import unittest import unittest
@ -6,6 +7,27 @@ from .. import util
from . import util as 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: class LoaderMock:
def find_module(self, fullname, path=None): def find_module(self, fullname, path=None):

View File

@ -1,19 +1,37 @@
from .. import util from .. import util
from . import util as import_util from . import util as import_util
from importlib import machinery
import sys import sys
import types import types
import unittest 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: class BadLoaderFinder:
bad = 'fine.bogus'
@classmethod @classmethod
def find_module(cls, fullname, path): def find_module(cls, fullname, path):
if fullname == cls.bad: if fullname == SUBMOD_NAME:
return cls return cls
@classmethod @classmethod
def load_module(cls, fullname): def load_module(cls, fullname):
if fullname == cls.bad: if fullname == SUBMOD_NAME:
raise ImportError('I cannot be loaded!') raise ImportError('I cannot be loaded!')
@ -37,27 +55,39 @@ class APITest:
def test_nonexistent_fromlist_entry(self): def test_nonexistent_fromlist_entry(self):
# If something in fromlist doesn't exist, that's okay. # If something in fromlist doesn't exist, that's okay.
# issue15715 # issue15715
mod = types.ModuleType('fine') mod = types.ModuleType(PKG_NAME)
mod.__path__ = ['XXX'] mod.__path__ = ['XXX']
with util.import_state(meta_path=[BadLoaderFinder]): with util.import_state(meta_path=[self.bad_finder_loader]):
with util.uncache('fine'): with util.uncache(PKG_NAME):
sys.modules['fine'] = mod sys.modules[PKG_NAME] = mod
self.__import__('fine', fromlist=['not here']) self.__import__(PKG_NAME, fromlist=['not here'])
def test_fromlist_load_error_propagates(self): def test_fromlist_load_error_propagates(self):
# If something in fromlist triggers an exception not related to not # If something in fromlist triggers an exception not related to not
# existing, let that exception propagate. # existing, let that exception propagate.
# issue15316 # issue15316
mod = types.ModuleType('fine') mod = types.ModuleType(PKG_NAME)
mod.__path__ = ['XXX'] mod.__path__ = ['XXX']
with util.import_state(meta_path=[BadLoaderFinder]): with util.import_state(meta_path=[self.bad_finder_loader]):
with util.uncache('fine'): with util.uncache(PKG_NAME):
sys.modules['fine'] = mod sys.modules[PKG_NAME] = mod
with self.assertRaises(ImportError): 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__': if __name__ == '__main__':

View File

@ -17,7 +17,7 @@ class FinderTests:
"""Tests for PathFinder.""" """Tests for PathFinder."""
def test_failure(self): 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>' module = '<test module>'
with util.import_state(): with util.import_state():
self.assertIsNone(self.machinery.PathFinder.find_module(module)) self.assertIsNone(self.machinery.PathFinder.find_module(module))