Imported Upstream version 1.1.2
[platform/upstream/python-nose.git] / functional_tests / test_importer.py
1 import os
2 import sys
3 import unittest
4 from nose.importer import Importer
5
6
7 class TestImporter(unittest.TestCase):
8
9     def setUp(self):
10         self.dir = os.path.normpath(os.path.join(os.path.dirname(__file__),
11                                                  'support'))
12         self.imp = Importer()
13         self._mods = sys.modules.copy()
14         self._path = sys.path[:]
15         sys.modules.pop('mod', None)
16         sys.modules.pop('pak', None)
17         sys.modules.pop('pak.mod', None)
18         sys.modules.pop('pak.sub', None)
19         
20     def tearDown(self):
21         to_del = [ m for m in sys.modules.keys() if
22                    m not in self._mods ]
23         if to_del:
24             for mod in to_del:
25                 del sys.modules[mod]
26         sys.modules.update(self._mods)
27         sys.path = self._path[:]
28
29     def test_import_from_dir(self):
30         imp = self.imp
31
32         d1 = os.path.join(self.dir, 'dir1')
33         d2 = os.path.join(self.dir, 'dir2')
34         
35         # simple name        
36         m1 = imp.importFromDir(d1, 'mod')
37         m2 = imp.importFromDir(d2, 'mod')
38         self.assertNotEqual(m1, m2)
39         self.assertNotEqual(m1.__file__, m2.__file__)
40
41         # dotted name
42         p1 = imp.importFromDir(d1, 'pak.mod')
43         p2 = imp.importFromDir(d2, 'pak.mod')
44         self.assertNotEqual(p1, p2)
45         self.assertNotEqual(p1.__file__, p2.__file__)
46
47     def test_import_from_path(self):
48         imp = self.imp
49
50         jn = os.path.join
51         d1 = jn(self.dir, 'dir1')
52         d2 = jn(self.dir, 'dir2')
53         
54         # simple name        
55         m1 = imp.importFromPath(jn(d1, 'mod.py'), 'mod')
56         m2 = imp.importFromPath(jn(d2, 'mod.py'), 'mod')
57         self.assertNotEqual(m1, m2)
58         self.assertNotEqual(m1.__file__, m2.__file__)
59
60         # dotted name
61         p1 = imp.importFromPath(jn(d1, 'pak', 'mod.py'), 'pak.mod')
62         p2 = imp.importFromPath(jn(d2, 'pak', 'mod.py'), 'pak.mod')
63         self.assertNotEqual(p1, p2)
64         self.assertNotEqual(p1.__file__, p2.__file__)
65
66         # simple name -- package
67         sp1 = imp.importFromPath(jn(d1, 'pak'), 'pak')
68         sp2 = imp.importFromPath(jn(d2, 'pak'), 'pak')
69         self.assertNotEqual(sp1, sp2)
70         assert sp1.__path__
71         assert sp2.__path__
72         self.assertNotEqual(sp1.__path__, sp2.__path__)
73
74         # dotted name -- package
75         dp1 = imp.importFromPath(jn(d1, 'pak', 'sub'), 'pak.sub')
76         dp2 = imp.importFromPath(jn(d2, 'pak', 'sub'), 'pak.sub')
77         self.assertNotEqual(dp1, dp2)
78         assert dp1.__path__
79         assert dp2.__path__
80         self.assertNotEqual(dp1.__path__, dp2.__path__)
81
82     def test_import_sets_intermediate_modules(self):
83         imp = self.imp
84         path = os.path.join(self.dir,
85                             'package2', 'test_pak', 'test_sub', 'test_mod.py')
86         mod = imp.importFromPath(path, 'test_pak.test_sub.test_mod')
87         print mod, dir(mod)
88         assert 'test_pak' in sys.modules, 'test_pak was not imported?'
89         test_pak = sys.modules['test_pak']
90         assert hasattr(test_pak, 'test_sub'), "test_pak.test_sub was not set"
91         
92     def test_cached_no_reload(self):
93         imp = self.imp
94         d1 = os.path.join(self.dir, 'dir1')
95         m1 = imp.importFromDir(d1, 'mod')
96         m2 = imp.importFromDir(d1, 'mod')        
97         assert m1 is m2, "%s is not %s" % (m1, m2)
98
99     def test_cached_no_reload_dotted(self):
100         imp = self.imp
101         d1 = os.path.join(self.dir, 'dir1')
102         p1 = imp.importFromDir(d1, 'pak.mod')
103         p2 = imp.importFromDir(d1, 'pak.mod')
104         assert p1 is p2, "%s is not %s" % (p1, p2)
105
106     def test_import_sets_sys_modules(self):
107         imp = self.imp
108         d1 = os.path.join(self.dir, 'dir1')
109         p1 = imp.importFromDir(d1, 'pak.mod')
110         assert sys.modules['pak.mod'] is p1, "pak.mod not in sys.modules"
111         assert sys.modules['pak'], "pak not in sys.modules"
112         assert sys.modules['pak'].mod is p1, \
113                "sys.modules['pak'].mod is not the module we loaded"
114
115     def test_failed_import_raises_import_error(self):
116         imp = self.imp
117         def bad_import():
118             imp.importFromPath(self.dir, 'no.such.module')
119         self.assertRaises(ImportError, bad_import)
120
121     def test_sys_modules_same_path_no_reload(self):
122         imp = self.imp
123
124         d1 = os.path.join(self.dir, 'dir1')
125         d2 = os.path.join(self.dir, 'dir2')
126         sys.path.insert(0, d1)
127         mod_sys_imported = __import__('mod')
128         mod_nose_imported = imp.importFromDir(d1, 'mod')
129         assert mod_nose_imported is mod_sys_imported, \
130                "nose reimported a module in sys.modules from the same path"
131
132         mod_nose_imported2 = imp.importFromDir(d2, 'mod')
133         assert mod_nose_imported2 != mod_sys_imported, \
134                "nose failed to reimport same name, different dir"
135
136     def test_import_pkg_from_path_fpw(self):
137         imp = self.imp
138         imp.config.firstPackageWins = True
139         jn = os.path.join
140         d1 = jn(self.dir, 'dir1')
141         d2 = jn(self.dir, 'dir2')
142         
143         # dotted name
144         p1 = imp.importFromPath(jn(d1, 'pak', 'mod.py'), 'pak.mod')
145         p2 = imp.importFromPath(jn(d2, 'pak', 'mod.py'), 'pak.mod')
146         self.assertEqual(p1, p2)
147         self.assertEqual(p1.__file__, p2.__file__)
148
149         # simple name -- package
150         sp1 = imp.importFromPath(jn(d1, 'pak'), 'pak')
151         sp2 = imp.importFromPath(jn(d2, 'pak'), 'pak')
152         self.assertEqual(sp1, sp2)
153         assert sp1.__path__
154         assert sp2.__path__
155         self.assertEqual(sp1.__path__, sp2.__path__)
156
157         # dotted name -- package
158         dp1 = imp.importFromPath(jn(d1, 'pak', 'sub'), 'pak.sub')
159         dp2 = imp.importFromPath(jn(d2, 'pak', 'sub'), 'pak.sub')
160         self.assertEqual(dp1, dp2)
161         assert dp1.__path__
162         assert dp2.__path__
163         self.assertEqual(dp1.__path__, dp2.__path__)
164         
165 if __name__ == '__main__':
166     import logging
167     logging.basicConfig(level=logging.DEBUG)
168     unittest.main()