https://github.com/python/cpython/commit/53908bd7905b849e110d2c6f4bce739bff037146
commit: 53908bd7905b849e110d2c6f4bce739bff037146
branch: main
author: Bénédikt Tran <10796600+picn...@users.noreply.github.com>
committer: hugovk <1324225+hug...@users.noreply.github.com>
date: 2025-04-08T09:08:59Z
summary:

gh-93096: fix `test_mimetypes.test_guess_type_conflicting_with_mimetypes` 
(#131408)

files:
M Lib/mimetypes.py
M Lib/test/test_mimetypes.py

diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
index 6b94fe3c4df756..67660e4f0368ce 100644
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -669,9 +669,7 @@ def _default_mime_types():
 _default_mime_types()
 
 
-def _main():
-    """Run the mimetypes command-line interface."""
-    import sys
+def _parse_args(args):
     from argparse import ArgumentParser
 
     parser = ArgumentParser(description='map filename extensions to MIME 
types')
@@ -686,23 +684,30 @@ def _main():
         help='additionally search for common but non-standard types'
     )
     parser.add_argument('type', nargs='+', help='a type to search')
-    args = parser.parse_args()
+    args = parser.parse_args(args)
+    return args, parser.format_help()
+
+
+def _main(args=None):
+    """Run the mimetypes command-line interface and return a text to print."""
+    import sys
+
+    args, help_text = _parse_args(args)
 
     if args.extension:
         for gtype in args.type:
             guess = guess_extension(gtype, not args.lenient)
             if guess:
-                print(guess)
-            else:
-                sys.exit(f"error: unknown type {gtype}")
+                return str(guess)
+            sys.exit(f"error: unknown type {gtype}")
     else:
         for gtype in args.type:
             guess, encoding = guess_type(gtype, not args.lenient)
             if guess:
-                print('type:', guess, 'encoding:', encoding)
-            else:
-                sys.exit(f"error: media type unknown for {gtype}")
+                return f"type: {guess} encoding: {encoding}"
+            sys.exit(f"error: media type unknown for {gtype}")
+    return parser.format_help()
 
 
 if __name__ == '__main__':
-    _main()
+    print(_main())
diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py
index b5d1f50099e16a..2da1c13800e875 100644
--- a/Lib/test/test_mimetypes.py
+++ b/Lib/test/test_mimetypes.py
@@ -1,14 +1,13 @@
 import io
 import mimetypes
 import os
+import shlex
 import sys
 import unittest.mock
-from os import linesep
-
+from platform import win32_edition
 from test import support
 from test.support import os_helper
 from test.support.script_helper import run_python_until_end
-from platform import win32_edition
 
 try:
     import _winapi
@@ -390,55 +389,52 @@ def test__all__(self):
         support.check__all__(self, mimetypes)
 
 
-class MimetypesCliTestCase(unittest.TestCase):
-
-    def mimetypes_cmd(cls, *args, **kwargs):
-        result, _ = run_python_until_end('-m', 'mimetypes', *args)
-        return result.rc, result.out.decode(), result.err.decode()
-
-    def test_help_option(self):
-        retcode, out, err = self.mimetypes_cmd('-h')
-        self.assertEqual(retcode, 0)
-        self.assertStartsWith(out, 'usage: ')
-        self.assertEqual(err, '')
-
-    def test_invalid_option(self):
-        retcode, out, err = self.mimetypes_cmd('--invalid')
-        self.assertEqual(retcode, 2)
-        self.assertEqual(out, '')
-        self.assertStartsWith(err, 'usage: ')
-
-    def test_guess_extension(self):
-        retcode, out, err = self.mimetypes_cmd('-l', '-e', 'image/jpg')
-        self.assertEqual(retcode, 0)
-        self.assertEqual(out, f'.jpg{linesep}')
-        self.assertEqual(err, '')
-
-        retcode, out, err = self.mimetypes_cmd('-e', 'image/jpg')
-        self.assertEqual(retcode, 1)
-        self.assertEqual(out, '')
-        self.assertEqual(err, f'error: unknown type image/jpg{linesep}')
-
-        retcode, out, err = self.mimetypes_cmd('-e', 'image/jpeg')
-        self.assertEqual(retcode, 0)
-        self.assertEqual(out, f'.jpg{linesep}')
-        self.assertEqual(err, '')
-
-    def test_guess_type(self):
-        retcode, out, err = self.mimetypes_cmd('-l', 'foo.webp')
-        self.assertEqual(retcode, 0)
-        self.assertEqual(out, f'type: image/webp encoding: None{linesep}')
-        self.assertEqual(err, '')
-
-    @unittest.skipIf(
-        sys.platform == 'darwin',
-        'macOS lists common_types in mime.types thus making them always known'
-    )
-    def test_guess_type_conflicting_with_mimetypes(self):
-        retcode, out, err = self.mimetypes_cmd('foo.pic')
-        self.assertEqual(retcode, 1)
-        self.assertEqual(out, '')
-        self.assertEqual(err, f'error: media type unknown for 
foo.pic{linesep}')
+class CommandLineTest(unittest.TestCase):
+    def test_parse_args(self):
+        args, help_text = mimetypes._parse_args("-h")
+        self.assertTrue(help_text.startswith("usage: "))
+
+        args, help_text = mimetypes._parse_args("--invalid")
+        self.assertTrue(help_text.startswith("usage: "))
+
+        args, _ = mimetypes._parse_args(shlex.split("-l -e image/jpg"))
+        self.assertTrue(args.extension)
+        self.assertTrue(args.lenient)
+        self.assertEqual(args.type, ["image/jpg"])
+
+        args, _ = mimetypes._parse_args(shlex.split("-e image/jpg"))
+        self.assertTrue(args.extension)
+        self.assertFalse(args.lenient)
+        self.assertEqual(args.type, ["image/jpg"])
+
+        args, _ = mimetypes._parse_args(shlex.split("-l foo.webp"))
+        self.assertFalse(args.extension)
+        self.assertTrue(args.lenient)
+        self.assertEqual(args.type, ["foo.webp"])
+
+        args, _ = mimetypes._parse_args(shlex.split("foo.pic"))
+        self.assertFalse(args.extension)
+        self.assertFalse(args.lenient)
+        self.assertEqual(args.type, ["foo.pic"])
+
+
+    def test_invocation(self):
+        for command, expected in [
+            ("-l -e image/jpg", ".jpg"),
+            ("-e image/jpeg", ".jpg"),
+            ("-l foo.webp", "type: image/webp encoding: None"),
+        ]:
+            self.assertEqual(mimetypes._main(shlex.split(command)), expected)
+
+
+    def test_invocation_error(self):
+        for command, expected in [
+            ("-e image/jpg", "error: unknown type image/jpg"),
+            ("foo.pic", "error: media type unknown for foo.pic"),
+        ]:
+            with self.assertRaisesRegex(SystemExit, expected):
+                mimetypes._main(shlex.split(command))
+
 
 if __name__ == "__main__":
     unittest.main()

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to