|  | 
| 2 | 2 | import io | 
| 3 | 3 | import mimetypes | 
| 4 | 4 | import os | 
|  | 5 | +import shlex | 
| 5 | 6 | import sys | 
| 6 | 7 | import unittest.mock | 
| 7 | 8 | from platform import win32_edition | 
| @@ -389,61 +390,51 @@ def test__all__(self): | 
| 389 | 390 |         support.check__all__(self, mimetypes) | 
| 390 | 391 | 
 | 
| 391 | 392 | 
 | 
| 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)) | 
| 447 | 438 | 
 | 
| 448 | 439 | 
 | 
| 449 | 440 | if __name__ == "__main__": | 
|  | 
0 commit comments