Commit 6c6b3f77 authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #19352: Fix unittest discovery when a module can be reached through...

Issue #19352: Fix unittest discovery when a module can be reached through several paths (e.g. under Debian/Ubuntu with virtualenv).
parents 3d3e1ba8 d5d0bc35
...@@ -276,8 +276,8 @@ class TestLoader(object): ...@@ -276,8 +276,8 @@ class TestLoader(object):
yield _make_failed_import_test(name, self.suiteClass) yield _make_failed_import_test(name, self.suiteClass)
else: else:
mod_file = os.path.abspath(getattr(module, '__file__', full_path)) mod_file = os.path.abspath(getattr(module, '__file__', full_path))
realpath = _jython_aware_splitext(mod_file) realpath = _jython_aware_splitext(os.path.realpath(mod_file))
fullpath_noext = _jython_aware_splitext(full_path) fullpath_noext = _jython_aware_splitext(os.path.realpath(full_path))
if realpath.lower() != fullpath_noext.lower(): if realpath.lower() != fullpath_noext.lower():
module_dir = os.path.dirname(realpath) module_dir = os.path.dirname(realpath)
mod_name = _jython_aware_splitext(os.path.basename(full_path)) mod_name = _jython_aware_splitext(os.path.basename(full_path))
......
...@@ -366,7 +366,7 @@ class TestDiscovery(unittest.TestCase): ...@@ -366,7 +366,7 @@ class TestDiscovery(unittest.TestCase):
self.assertTrue(program.failfast) self.assertTrue(program.failfast)
self.assertTrue(program.catchbreak) self.assertTrue(program.catchbreak)
def test_detect_module_clash(self): def setup_module_clash(self):
class Module(object): class Module(object):
__file__ = 'bar/foo.py' __file__ = 'bar/foo.py'
sys.modules['foo'] = Module sys.modules['foo'] = Module
...@@ -393,7 +393,10 @@ class TestDiscovery(unittest.TestCase): ...@@ -393,7 +393,10 @@ class TestDiscovery(unittest.TestCase):
os.listdir = listdir os.listdir = listdir
os.path.isfile = isfile os.path.isfile = isfile
os.path.isdir = isdir os.path.isdir = isdir
return full_path
def test_detect_module_clash(self):
full_path = self.setup_module_clash()
loader = unittest.TestLoader() loader = unittest.TestLoader()
mod_dir = os.path.abspath('bar') mod_dir = os.path.abspath('bar')
...@@ -406,6 +409,25 @@ class TestDiscovery(unittest.TestCase): ...@@ -406,6 +409,25 @@ class TestDiscovery(unittest.TestCase):
) )
self.assertEqual(sys.path[0], full_path) self.assertEqual(sys.path[0], full_path)
def test_module_symlink_ok(self):
full_path = self.setup_module_clash()
original_realpath = os.path.realpath
mod_dir = os.path.abspath('bar')
expected_dir = os.path.abspath('foo')
def cleanup():
os.path.realpath = original_realpath
self.addCleanup(cleanup)
def realpath(path):
if path == os.path.join(mod_dir, 'foo.py'):
return os.path.join(expected_dir, 'foo.py')
return path
os.path.realpath = realpath
loader = unittest.TestLoader()
loader.discover(start_dir='foo', pattern='foo.py')
def test_discovery_from_dotted_path(self): def test_discovery_from_dotted_path(self):
loader = unittest.TestLoader() loader = unittest.TestLoader()
......
...@@ -19,6 +19,9 @@ Core and Builtins ...@@ -19,6 +19,9 @@ Core and Builtins
Library Library
------- -------
- Issue #19352: Fix unittest discovery when a module can be reached
through several paths (e.g. under Debian/Ubuntu with virtualenv).
- Issue #15207: Fix mimetypes to read from correct part of Windows registry - Issue #15207: Fix mimetypes to read from correct part of Windows registry
Original patch by Dave Chambers Original patch by Dave Chambers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment