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()
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: