|
1 | 1 | import os |
| 2 | +import re |
2 | 3 | import sys |
3 | 4 |
|
4 | 5 | import unittest |
@@ -54,8 +55,9 @@ def isfile(path): |
54 | 55 | loader._get_module_from_name = lambda path: path + ' module' |
55 | 56 | loader.loadTestsFromModule = lambda module: module + ' tests' |
56 | 57 |
|
57 | | - loader._top_level_dir = '/foo' |
58 | | - suite = list(loader._find_tests('/foo', 'test*.py')) |
| 58 | + top_level = os.path.abspath('/foo') |
| 59 | + loader._top_level_dir = top_level |
| 60 | + suite = list(loader._find_tests(top_level, 'test*.py')) |
59 | 61 |
|
60 | 62 | expected = [name + ' module tests' for name in |
61 | 63 | ('test1', 'test2')] |
@@ -298,6 +300,46 @@ def discover(self, start_dir, pattern, top_level_dir): |
298 | 300 | self.assertTrue(program.failfast) |
299 | 301 | self.assertTrue(program.catchbreak) |
300 | 302 |
|
| 303 | + def test_detect_module_clash(self): |
| 304 | + class Module(object): |
| 305 | + __file__ = 'bar/foo.py' |
| 306 | + sys.modules['foo'] = Module |
| 307 | + full_path = os.path.abspath('foo') |
| 308 | + original_listdir = os.listdir |
| 309 | + original_isfile = os.path.isfile |
| 310 | + original_isdir = os.path.isdir |
| 311 | + |
| 312 | + def cleanup(): |
| 313 | + os.listdir = original_listdir |
| 314 | + os.path.isfile = original_isfile |
| 315 | + os.path.isdir = original_isdir |
| 316 | + del sys.modules['foo'] |
| 317 | + if full_path in sys.path: |
| 318 | + sys.path.remove(full_path) |
| 319 | + self.addCleanup(cleanup) |
| 320 | + |
| 321 | + def listdir(_): |
| 322 | + return ['foo.py'] |
| 323 | + def isfile(_): |
| 324 | + return True |
| 325 | + def isdir(_): |
| 326 | + return True |
| 327 | + os.listdir = listdir |
| 328 | + os.path.isfile = isfile |
| 329 | + os.path.isdir = isdir |
| 330 | + |
| 331 | + loader = unittest.TestLoader() |
| 332 | + |
| 333 | + mod_dir = os.path.abspath('bar') |
| 334 | + expected_dir = os.path.abspath('foo') |
| 335 | + msg = re.escape(r"'foo' module incorrectly imported from %r. Expected %r. " |
| 336 | + "Is this module globally installed?" % (mod_dir, expected_dir)) |
| 337 | + self.assertRaisesRegexp( |
| 338 | + ImportError, '^%s$' % msg, loader.discover, |
| 339 | + start_dir='foo', pattern='foo.py' |
| 340 | + ) |
| 341 | + self.assertEqual(sys.path[0], full_path) |
| 342 | + |
301 | 343 |
|
302 | 344 | if __name__ == '__main__': |
303 | 345 | unittest.main() |
0 commit comments