2016-12-13 08:36:08 +08:00
|
|
|
import sys
|
|
|
|
import unittest
|
2017-01-20 01:16:04 +08:00
|
|
|
from unittest import mock
|
2016-12-13 08:36:08 +08:00
|
|
|
|
2015-11-07 19:07:28 +08:00
|
|
|
from django import __version__
|
2017-01-13 02:12:21 +08:00
|
|
|
from django.core.management import CommandError, call_command
|
2017-01-20 01:16:04 +08:00
|
|
|
from django.test import SimpleTestCase
|
2018-04-28 21:20:27 +08:00
|
|
|
from django.test.utils import captured_stdin, captured_stdout
|
2015-11-07 19:07:28 +08:00
|
|
|
|
|
|
|
|
|
|
|
class ShellCommandTestCase(SimpleTestCase):
|
2020-11-11 16:01:44 +08:00
|
|
|
script_globals = 'print("__name__" in globals())'
|
2020-11-10 06:41:13 +08:00
|
|
|
script_with_inline_function = (
|
|
|
|
"import django\ndef f():\n print(django.__version__)\nf()"
|
|
|
|
)
|
2015-11-07 19:07:28 +08:00
|
|
|
|
|
|
|
def test_command_option(self):
|
2018-04-28 21:20:27 +08:00
|
|
|
with self.assertLogs("test", "INFO") as cm:
|
2015-11-07 19:07:28 +08:00
|
|
|
call_command(
|
|
|
|
"shell",
|
|
|
|
command=(
|
|
|
|
"import django; from logging import getLogger; "
|
|
|
|
'getLogger("test").info(django.__version__)'
|
|
|
|
),
|
|
|
|
)
|
2018-04-28 21:20:27 +08:00
|
|
|
self.assertEqual(cm.records[0].getMessage(), __version__)
|
2016-12-13 08:36:08 +08:00
|
|
|
|
2020-11-11 16:01:44 +08:00
|
|
|
def test_command_option_globals(self):
|
|
|
|
with captured_stdout() as stdout:
|
|
|
|
call_command("shell", command=self.script_globals)
|
|
|
|
self.assertEqual(stdout.getvalue().strip(), "True")
|
|
|
|
|
2020-11-10 06:41:13 +08:00
|
|
|
def test_command_option_inline_function_call(self):
|
|
|
|
with captured_stdout() as stdout:
|
|
|
|
call_command("shell", command=self.script_with_inline_function)
|
|
|
|
self.assertEqual(stdout.getvalue().strip(), __version__)
|
|
|
|
|
2016-12-13 08:36:08 +08:00
|
|
|
@unittest.skipIf(
|
|
|
|
sys.platform == "win32", "Windows select() doesn't support file descriptors."
|
|
|
|
)
|
|
|
|
@mock.patch("django.core.management.commands.shell.select")
|
|
|
|
def test_stdin_read(self, select):
|
|
|
|
with captured_stdin() as stdin, captured_stdout() as stdout:
|
|
|
|
stdin.write("print(100)\n")
|
|
|
|
stdin.seek(0)
|
|
|
|
call_command("shell")
|
|
|
|
self.assertEqual(stdout.getvalue().strip(), "100")
|
2017-01-13 02:12:21 +08:00
|
|
|
|
2020-11-11 16:01:44 +08:00
|
|
|
@unittest.skipIf(
|
|
|
|
sys.platform == "win32",
|
|
|
|
"Windows select() doesn't support file descriptors.",
|
|
|
|
)
|
|
|
|
@mock.patch("django.core.management.commands.shell.select") # [1]
|
|
|
|
def test_stdin_read_globals(self, select):
|
|
|
|
with captured_stdin() as stdin, captured_stdout() as stdout:
|
|
|
|
stdin.write(self.script_globals)
|
|
|
|
stdin.seek(0)
|
|
|
|
call_command("shell")
|
|
|
|
self.assertEqual(stdout.getvalue().strip(), "True")
|
|
|
|
|
2020-11-10 06:41:13 +08:00
|
|
|
@unittest.skipIf(
|
|
|
|
sys.platform == "win32",
|
|
|
|
"Windows select() doesn't support file descriptors.",
|
|
|
|
)
|
|
|
|
@mock.patch("django.core.management.commands.shell.select") # [1]
|
|
|
|
def test_stdin_read_inline_function_call(self, select):
|
|
|
|
with captured_stdin() as stdin, captured_stdout() as stdout:
|
|
|
|
stdin.write(self.script_with_inline_function)
|
|
|
|
stdin.seek(0)
|
|
|
|
call_command("shell")
|
|
|
|
self.assertEqual(stdout.getvalue().strip(), __version__)
|
|
|
|
|
2017-01-13 02:12:21 +08:00
|
|
|
@mock.patch("django.core.management.commands.shell.select.select") # [1]
|
|
|
|
@mock.patch.dict("sys.modules", {"IPython": None})
|
|
|
|
def test_shell_with_ipython_not_installed(self, select):
|
|
|
|
select.return_value = ([], [], [])
|
|
|
|
with self.assertRaisesMessage(
|
|
|
|
CommandError, "Couldn't import ipython interface."
|
|
|
|
):
|
|
|
|
call_command("shell", interface="ipython")
|
|
|
|
|
|
|
|
@mock.patch("django.core.management.commands.shell.select.select") # [1]
|
|
|
|
@mock.patch.dict("sys.modules", {"bpython": None})
|
|
|
|
def test_shell_with_bpython_not_installed(self, select):
|
|
|
|
select.return_value = ([], [], [])
|
|
|
|
with self.assertRaisesMessage(
|
|
|
|
CommandError, "Couldn't import bpython interface."
|
|
|
|
):
|
|
|
|
call_command("shell", interface="bpython")
|
|
|
|
|
|
|
|
# [1] Patch select to prevent tests failing when when the test suite is run
|
|
|
|
# in parallel mode. The tests are run in a subprocess and the subprocess's
|
|
|
|
# stdin is closed and replaced by /dev/null. Reading from /dev/null always
|
|
|
|
# returns EOF and so select always shows that sys.stdin is ready to read.
|
2021-07-31 02:34:50 +08:00
|
|
|
# This causes problems because of the call to select.select() toward the
|
2017-01-13 02:12:21 +08:00
|
|
|
# end of shell's handle() method.
|