changeset 87640:dad74ff75a6b

Issue #19712: Port test.test_importlib.import_ tests to use PEP 451 that don't require changing test.test_importlib.util.mock_modules().
author Brett Cannon <brett@python.org>
date Fri, 29 Nov 2013 16:17:05 -0500
parents a1a936a3b2f6
children 312137dd7ece
files Lib/test/test_importlib/import_/test___loader__.py Lib/test/test_importlib/import_/test_api.py Lib/test/test_importlib/import_/test_path.py
diffstat 3 files changed, 68 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/test/test_importlib/import_/test___loader__.py	Fri Nov 29 18:57:47 2013 +0100
+++ b/Lib/test/test_importlib/import_/test___loader__.py	Fri Nov 29 16:17:05 2013 -0500
@@ -1,3 +1,4 @@
+from importlib import machinery
 import sys
 import types
 import unittest
@@ -6,6 +7,27 @@
 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):
--- a/Lib/test/test_importlib/import_/test_api.py	Fri Nov 29 18:57:47 2013 +0100
+++ b/Lib/test/test_importlib/import_/test_api.py	Fri Nov 29 16:17:05 2013 -0500
@@ -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 @@
     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]])
+
+
+class OldAPITests(APITest):
+    bad_finder_loader = BadLoaderFinder
 
-Frozen_APITests, Source_APITests = util.test_both(
-        APITest, __import__=import_util.__import__)
+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__':
--- a/Lib/test/test_importlib/import_/test_path.py	Fri Nov 29 18:57:47 2013 +0100
+++ b/Lib/test/test_importlib/import_/test_path.py	Fri Nov 29 16:17:05 2013 -0500
@@ -17,7 +17,7 @@
     """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))