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