1bcb26c53c095c7bcd0e5415088e25dbd27f12592Brett Cannonfrom .. import util 223cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport sys 323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonimport unittest 4d62cd5627fc5c01571c018b8a11b152614862effBrett Cannonfrom test import support 523cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 7330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannonclass ParentModuleTests: 823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon """Importing a submodule should import the parent modules.""" 1023cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 1123cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_import_parent(self): 1286aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon with util.mock_spec('pkg.__init__', 'pkg.module') as mock: 13bcb26c53c095c7bcd0e5415088e25dbd27f12592Brett Cannon with util.import_state(meta_path=[mock]): 14330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon module = self.__import__('pkg.module') 15faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertIn('pkg', sys.modules) 1623cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 1723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon def test_bad_parent(self): 1886aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon with util.mock_spec('pkg.module') as mock: 19bcb26c53c095c7bcd0e5415088e25dbd27f12592Brett Cannon with util.import_state(meta_path=[mock]): 20bbb6680ee5650ad1096eba0c86286342c3d08468Brett Cannon with self.assertRaises(ImportError) as cm: 21330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg.module') 22bbb6680ee5650ad1096eba0c86286342c3d08468Brett Cannon self.assertEqual(cm.exception.name, 'pkg') 2323cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 246efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou def test_raising_parent_after_importing_child(self): 256efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou def __init__(): 266efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou import pkg.module 276efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 1/0 2886aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon mock = util.mock_spec('pkg.__init__', 'pkg.module', 296efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou module_code={'pkg': __init__}) 306efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with mock: 316efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with util.import_state(meta_path=[mock]): 326efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with self.assertRaises(ZeroDivisionError): 33330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg') 34faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertNotIn('pkg', sys.modules) 35faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertIn('pkg.module', sys.modules) 366efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with self.assertRaises(ZeroDivisionError): 37330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg.module') 38faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertNotIn('pkg', sys.modules) 39faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertIn('pkg.module', sys.modules) 406efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 416efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou def test_raising_parent_after_relative_importing_child(self): 426efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou def __init__(): 436efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou from . import module 446efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 1/0 4586aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon mock = util.mock_spec('pkg.__init__', 'pkg.module', 466efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou module_code={'pkg': __init__}) 476efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with mock: 486efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with util.import_state(meta_path=[mock]): 496efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with self.assertRaises((ZeroDivisionError, ImportError)): 506efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou # This raises ImportError on the "from . import module" 516efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou # line, not sure why. 52330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg') 53faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertNotIn('pkg', sys.modules) 546efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with self.assertRaises((ZeroDivisionError, ImportError)): 55330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg.module') 56faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertNotIn('pkg', sys.modules) 576efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou # XXX False 58faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith #self.assertIn('pkg.module', sys.modules) 596efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 606efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou def test_raising_parent_after_double_relative_importing_child(self): 616efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou def __init__(): 626efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou from ..subpkg import module 636efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 1/0 6486aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon mock = util.mock_spec('pkg.__init__', 'pkg.subpkg.__init__', 656efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 'pkg.subpkg.module', 666efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou module_code={'pkg.subpkg': __init__}) 676efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with mock: 686efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with util.import_state(meta_path=[mock]): 696efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with self.assertRaises((ZeroDivisionError, ImportError)): 706efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou # This raises ImportError on the "from ..subpkg import module" 716efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou # line, not sure why. 72330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg.subpkg') 73faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertNotIn('pkg.subpkg', sys.modules) 746efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou with self.assertRaises((ZeroDivisionError, ImportError)): 75330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('pkg.subpkg.module') 76faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith self.assertNotIn('pkg.subpkg', sys.modules) 776efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou # XXX False 78faae3adbb98521d039c574fd3ed417f54a72374dEric V. Smith #self.assertIn('pkg.subpkg.module', sys.modules) 796efa50a384f61155cd5315cd32f0f8775fe124c5Antoine Pitrou 801c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19Brett Cannon def test_module_not_package(self): 811c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19Brett Cannon # Try to import a submodule from a non-package should raise ImportError. 821c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19Brett Cannon assert not hasattr(sys, '__path__') 83bbb6680ee5650ad1096eba0c86286342c3d08468Brett Cannon with self.assertRaises(ImportError) as cm: 84330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon self.__import__('sys.no_submodules_here') 85bbb6680ee5650ad1096eba0c86286342c3d08468Brett Cannon self.assertEqual(cm.exception.name, 'sys.no_submodules_here') 861c1dcbfd5db9ec3e47ca9ddf28e7c6b87f09eb19Brett Cannon 87927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon def test_module_not_package_but_side_effects(self): 88927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon # If a module injects something into sys.modules as a side-effect, then 89927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon # pick up on that fact. 90927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon name = 'mod' 91927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon subname = name + '.b' 92927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon def module_injection(): 93927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon sys.modules[subname] = 'total bunk' 9486aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon mock_spec = util.mock_spec('mod', 95927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon module_code={'mod': module_injection}) 9686aae6a7b3b863529b6cce64859c0f56c7963bc0Brett Cannon with mock_spec as mock: 97927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon with util.import_state(meta_path=[mock]): 98d62cd5627fc5c01571c018b8a11b152614862effBrett Cannon try: 99330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon submodule = self.__import__(subname) 100d62cd5627fc5c01571c018b8a11b152614862effBrett Cannon finally: 101d62cd5627fc5c01571c018b8a11b152614862effBrett Cannon support.unload(subname) 102927d87470a0b6f7b0ca3f3a1b39fd3bdc0ec919aBrett Cannon 1033497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow 1043497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow(Frozen_ParentTests, 1053497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow Source_ParentTests 1063497c0bf957be33c6794a4548cfa53dbb0f9b5dfEric Snow ) = util.test_both(ParentModuleTests, __import__=util.__import__) 10723cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 10823cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannon 10923cbd8a6564df0ac3df339f91196c45f3e626d32Brett Cannonif __name__ == '__main__': 110330f71b617f0b1c78a16f1cf29f9887191c20391Brett Cannon unittest.main() 111