Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 8 additions & 10 deletions Doc/library/mimetypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ it converts file extensions to MIME types.

For each ``type`` entry, the script writes a line into the standard output
stream. If an unknown type occurs, it writes an error message into the
standard error stream and exits with the return code ``1``.
standard output stream and exits with the return code ``1``.


.. mimetypes-cli-example:
Expand All @@ -373,13 +373,9 @@ interface:
$ python -m mimetypes filename.tar.gz
type: application/x-tar encoding: gzip

$ # get a MIME type for a rare file extension
$ python -m mimetypes filename.pict
error: unknown extension of filename.pict

$ # now look in the extended database built into Python
$ python -m mimetypes --lenient filename.pict
type: image/pict encoding: None
$ # get a MIME type for an unknown file extension
$ python -m mimetypes filename.zzz
error: media type unknown for filename.zzz

$ # get a file extension by a MIME type
$ python -m mimetypes --extension text/javascript
Expand All @@ -394,13 +390,15 @@ interface:
.xul

$ # try to feed an unknown file extension
$ python -m mimetypes filename.sh filename.nc filename.xxx filename.txt
$ python -m mimetypes filename.sh filename.nc filename.zzz filename.txt
type: application/x-sh encoding: None
type: application/x-netcdf encoding: None
error: unknown extension of filename.xxx
error: media type unknown for filename.zzz
type: text/plain encoding: None

$ # try to feed an unknown MIME type
$ python -m mimetypes --extension audio/aac audio/opus audio/future audio/x-wav
.aac
.opus
error: unknown type audio/future
.wav
57 changes: 56 additions & 1 deletion Lib/test/test_mimetypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import unittest.mock
from platform import win32_edition
from test import support
from test.support import cpython_only, force_not_colorized, os_helper
from test.support import cpython_only, force_not_colorized, os_helper, requires_subprocess
from test.support.import_helper import ensure_lazy_imports
from test.support.script_helper import assert_python_ok, assert_python_failure

try:
import _winapi
Expand Down Expand Up @@ -508,5 +509,59 @@ def test_invocation_error(self):
self.assertEqual(result, expected)


@requires_subprocess()
class CommandLineSubprocessTest(unittest.TestCase):
def test_help(self):
rc, stdout, stderr = assert_python_ok('-m', 'mimetypes', '--help')
self.assertIn(b'mimetypes', stdout)
self.assertIn(b'--extension', stdout)
self.assertIn(b'--lenient', stdout)

def test_type_lookup(self):
rc, stdout, stderr = assert_python_ok('-m', 'mimetypes', 'foo.pdf')
self.assertEqual(stdout.strip(), b'type: application/pdf encoding: None')
self.assertEqual(stderr, b'')

def test_type_lookup_unknown(self):
rc, stdout, stderr = assert_python_failure('-m', 'mimetypes', 'foo.unknownext12345')
self.assertEqual(stdout.strip(), b'error: media type unknown for foo.unknownext12345')
self.assertEqual(stderr, b'')

def test_extension_flag(self):
rc, stdout, stderr = assert_python_ok('-m', 'mimetypes', '-e', 'image/jpeg')
self.assertEqual(stdout.strip(), b'.jpg')
self.assertEqual(stderr, b'')

def test_extension_flag_unknown(self):
rc, stdout, stderr = assert_python_failure('-m', 'mimetypes', '-e', 'image/unknowntype12345')
self.assertEqual(stdout.strip(), b'error: unknown type image/unknowntype12345')
self.assertEqual(stderr, b'')

def test_lenient_flag(self):
rc, stdout, stderr = assert_python_ok('-m', 'mimetypes', '-e', '--lenient', 'text/xul')
self.assertIn(b'.xul', stdout)
self.assertEqual(stderr, b'')

def test_multiple_inputs(self):
rc, stdout, stderr = assert_python_ok('-m', 'mimetypes', 'foo.pdf', 'foo.png')
self.assertIn(b'type: application/pdf encoding: None', stdout)
self.assertIn(b'type: image/png encoding: None', stdout)
self.assertEqual(stderr, b'')

def test_multiple_inputs_with_error(self):
rc, stdout, stderr = assert_python_failure(
'-m', 'mimetypes', 'foo.pdf', 'foo.unknownext12345'
)
self.assertIn(b'type: application/pdf encoding: None', stdout)
self.assertIn(b'error: media type unknown for foo.unknownext12345', stdout)
self.assertEqual(stderr, b'')

@force_not_colorized
def test_unknown_flag(self):
rc, stdout, stderr = assert_python_failure('-m', 'mimetypes', '--unknown-flag', 'foo.pdf')
self.assertEqual(stdout, b'')
self.assertIn(b'error: unrecognized arguments: --unknown-flag', stderr)


if __name__ == "__main__":
unittest.main()
Loading