[Python-checkins] [3.9] bpo-46421: Fix unittest filename evaluation when called as a module (GH-30654) (GH-31970)

JelleZijlstra webhook-mailer at python.org
Thu Mar 17 23:25:04 EDT 2022


https://github.com/python/cpython/commit/1cab44d8650ae3eece90b04fca373908205e7ee0
commit: 1cab44d8650ae3eece90b04fca373908205e7ee0
branch: 3.9
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: JelleZijlstra <jelle.zijlstra at gmail.com>
date: 2022-03-17T20:24:59-07:00
summary:

[3.9] bpo-46421: Fix unittest filename evaluation when called as a module (GH-30654) (GH-31970)

(cherry picked from commit a0db11b10fca0fee6bb2b8d6277e266bad8c0fdb)

Co-authored-by: Bader Zaidan <bader at zaidan.pw>

files:
A Misc/NEWS.d/next/Library/2022-01-18-01-29-38.bpo-46421.9LdmNr.rst
M Lib/test/test_cmd_line.py
M Lib/unittest/main.py
M Misc/ACKS

diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index 712d861c4d5a3..4b3e33c4fd354 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -136,6 +136,17 @@ def test_run_module_bug1764407(self):
         self.assertTrue(data.find(b'1 loop') != -1)
         self.assertTrue(data.find(b'__main__.Timer') != -1)
 
+    def test_relativedir_bug46421(self):
+        # Test `python -m unittest` with a relative directory beginning with ./
+        # Note: We have to switch to the project's top module's directory, as per
+        # the python unittest wiki. We will switch back when we are done.
+        defaultwd = os.getcwd()
+        projectlibpath = os.path.dirname(__file__).removesuffix("test")
+        with support.change_cwd(projectlibpath):
+            # Testing with and without ./
+            assert_python_ok('-m', 'unittest', "test/test_longexp.py")
+            assert_python_ok('-m', 'unittest', "./test/test_longexp.py")
+
     def test_run_code(self):
         # Test expected operation of the '-c' switch
         # Switch needs an argument
diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py
index e62469aa2a170..88a188c545cd0 100644
--- a/Lib/unittest/main.py
+++ b/Lib/unittest/main.py
@@ -39,7 +39,7 @@ def _convert_name(name):
             name = rel_path
         # on Windows both '\' and '/' are used as path
         # separators. Better to replace both than rely on os.path.sep
-        return name[:-3].replace('\\', '.').replace('/', '.')
+        return os.path.normpath(name)[:-3].replace('\\', '.').replace('/', '.')
     return name
 
 def _convert_names(names):
diff --git a/Misc/ACKS b/Misc/ACKS
index 2a26fdcd16b43..d043195a7b550 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1947,6 +1947,7 @@ Masazumi Yoshikawa
 Arnaud Ysmal
 Bernard Yue
 Moshe Zadka
+Bader Zaidan
 Elias Zamaria
 Milan Zamazal
 Artur Zaprzala
diff --git a/Misc/NEWS.d/next/Library/2022-01-18-01-29-38.bpo-46421.9LdmNr.rst b/Misc/NEWS.d/next/Library/2022-01-18-01-29-38.bpo-46421.9LdmNr.rst
new file mode 100644
index 0000000000000..03ff27fd7d1a7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-01-18-01-29-38.bpo-46421.9LdmNr.rst
@@ -0,0 +1,3 @@
+Fix a unittest issue where if the command was invoked as ``python -m
+unittest`` and the filename(s) began with a dot (.), a ``ValueError`` is
+returned.



More information about the Python-checkins mailing list