Skip to content

Commit d9d136e

Browse files
committed
use Hugo's approach for testing mimetypes
1 parent eeb5635 commit d9d136e

File tree

2 files changed

+61
-67
lines changed

2 files changed

+61
-67
lines changed

Lib/mimetypes.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,7 @@ def _default_mime_types():
669669
_default_mime_types()
670670

671671

672-
def _main(args=None):
673-
"""Run the mimetypes command-line interface."""
674-
import sys
672+
def _parse_args(args):
675673
from argparse import ArgumentParser
676674

677675
parser = ArgumentParser(description='map filename extensions to MIME types')
@@ -687,24 +685,29 @@ def _main(args=None):
687685
)
688686
parser.add_argument('type', nargs='+', help='a type to search')
689687
args = parser.parse_args(args)
688+
return args, parser.format_help()
689+
690+
691+
def _main(args=None):
692+
"""Run the mimetypes command-line interface and return a text to print."""
693+
import sys
694+
695+
args, help_text = _parse_args(args)
690696

691697
if args.extension:
692698
for gtype in args.type:
693699
guess = guess_extension(gtype, not args.lenient)
694700
if guess:
695-
print(guess)
696-
else:
697-
# do not use parser.error() as it prints a help message
698-
parser.exit(1, f"error: unknown type {gtype}\n")
701+
return str(guess)
702+
sys.exit(f"error: unknown type {gtype}")
699703
else:
700704
for gtype in args.type:
701705
guess, encoding = guess_type(gtype, not args.lenient)
702706
if guess:
703-
print('type:', guess, 'encoding:', encoding)
704-
else:
705-
# do not use parser.error() as it prints a help message
706-
parser.exit(1, f"error: media type unknown for {gtype}\n")
707+
return f"type: {guess} encoding: {encoding}"
708+
sys.exit(f"error: media type unknown for {gtype}")
709+
return parser.format_help()
707710

708711

709712
if __name__ == '__main__':
710-
_main()
713+
print(_main())

Lib/test/test_mimetypes.py

Lines changed: 46 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import io
33
import mimetypes
44
import os
5+
import shlex
56
import sys
67
import unittest.mock
78
from platform import win32_edition
@@ -389,61 +390,51 @@ def test__all__(self):
389390
support.check__all__(self, mimetypes)
390391

391392

392-
class MimetypesCliTestCase(unittest.TestCase):
393-
394-
def mimetypes_cmd(self, *args):
395-
# We cannot use run_python_until_end() as the latter would not
396-
# call setUpModule() which unsets mimetypes.knowfiles. Instead,
397-
# we need to directly call the main() function in order to avoid
398-
# re-initializing the database.
399-
rc, out, err = 0, io.StringIO(), io.StringIO()
400-
with contextlib.redirect_stdout(out), contextlib.redirect_stderr(err):
401-
try:
402-
mimetypes._main(args)
403-
except SystemExit as exc:
404-
self.assertIsInstance(exc.code, int)
405-
rc = exc.code
406-
return rc, out.getvalue(), err.getvalue()
407-
408-
def test_help_option(self):
409-
retcode, out, err = self.mimetypes_cmd('-h')
410-
self.assertEqual(retcode, 0)
411-
self.assertStartsWith(out, 'usage: ')
412-
self.assertEqual(err, '')
413-
414-
def test_invalid_option(self):
415-
retcode, out, err = self.mimetypes_cmd('--invalid')
416-
self.assertEqual(retcode, 2)
417-
self.assertEqual(out, '')
418-
self.assertStartsWith(err, 'usage: ')
419-
420-
def test_guess_extension(self):
421-
retcode, out, err = self.mimetypes_cmd('-l', '-e', 'image/jpg')
422-
self.assertEqual(retcode, 0)
423-
self.assertEqual(out, '.jpg\n')
424-
self.assertEqual(err, '')
425-
426-
retcode, out, err = self.mimetypes_cmd('-e', 'image/jpg')
427-
self.assertEqual(retcode, 1)
428-
self.assertEqual(out, '')
429-
self.assertEqual(err, 'error: unknown type image/jpg\n')
430-
431-
retcode, out, err = self.mimetypes_cmd('-e', 'image/jpeg')
432-
self.assertEqual(retcode, 0)
433-
self.assertEqual(out, '.jpg\n')
434-
self.assertEqual(err, '')
435-
436-
def test_guess_type(self):
437-
retcode, out, err = self.mimetypes_cmd('-l', 'foo.webp')
438-
self.assertEqual(retcode, 0)
439-
self.assertEqual(out, 'type: image/webp encoding: None\n')
440-
self.assertEqual(err, '')
441-
442-
def test_guess_type_conflicting_with_mimetypes(self):
443-
retcode, out, err = self.mimetypes_cmd('foo.pic')
444-
self.assertEqual(retcode, 1)
445-
self.assertEqual(out, '')
446-
self.assertEqual(err, 'error: media type unknown for foo.pic\n')
393+
class CommandLineTest(unittest.TestCase):
394+
def test_parse_args(self):
395+
args, help_text = mimetypes._parse_args("-h")
396+
self.assertTrue(help_text.startswith("usage: "))
397+
398+
args, help_text = mimetypes._parse_args("--invalid")
399+
self.assertTrue(help_text.startswith("usage: "))
400+
401+
args, _ = mimetypes._parse_args(shlex.split("-l -e image/jpg"))
402+
self.assertTrue(args.extension)
403+
self.assertTrue(args.lenient)
404+
self.assertEqual(args.type, ["image/jpg"])
405+
406+
args, _ = mimetypes._parse_args(shlex.split("-e image/jpg"))
407+
self.assertTrue(args.extension)
408+
self.assertFalse(args.lenient)
409+
self.assertEqual(args.type, ["image/jpg"])
410+
411+
args, _ = mimetypes._parse_args(shlex.split("-l foo.webp"))
412+
self.assertFalse(args.extension)
413+
self.assertTrue(args.lenient)
414+
self.assertEqual(args.type, ["foo.webp"])
415+
416+
args, _ = mimetypes._parse_args(shlex.split("foo.pic"))
417+
self.assertFalse(args.extension)
418+
self.assertFalse(args.lenient)
419+
self.assertEqual(args.type, ["foo.pic"])
420+
421+
422+
def test_invocation(self):
423+
for command, expected in [
424+
("-l -e image/jpg", ".jpg"),
425+
("-e image/jpeg", ".jpg"),
426+
("-l foo.webp", "type: image/webp encoding: None"),
427+
]:
428+
self.assertEqual(mimetypes._main(shlex.split(command)), expected)
429+
430+
431+
def test_invocation_error(self):
432+
for command, expected in [
433+
("-e image/jpg", "error: unknown type image/jpg"),
434+
("foo.pic", "error: media type unknown for foo.pic"),
435+
]:
436+
with self.assertRaisesRegex(SystemExit, expected):
437+
mimetypes._main(shlex.split(command))
447438

448439

449440
if __name__ == "__main__":

0 commit comments

Comments
 (0)