django/tests/dbshell/test_sqlite.py

43 lines
1.6 KiB
Python

import subprocess
from pathlib import Path
from unittest import mock, skipUnless
from django.core.management import CommandError, call_command
from django.db import connection
from django.db.backends.sqlite3.client import DatabaseClient
from django.test import SimpleTestCase
class SqliteDbshellCommandTestCase(SimpleTestCase):
def settings_to_cmd_args_env(self, settings_dict, parameters=None):
if parameters is None:
parameters = []
return DatabaseClient.settings_to_cmd_args_env(settings_dict, parameters)
def test_path_name(self):
self.assertEqual(
self.settings_to_cmd_args_env({"NAME": Path("test.db.sqlite3")}),
(["sqlite3", Path("test.db.sqlite3")], None),
)
def test_parameters(self):
self.assertEqual(
self.settings_to_cmd_args_env({"NAME": "test.db.sqlite3"}, ["-help"]),
(["sqlite3", "test.db.sqlite3", "-help"], None),
)
@skipUnless(connection.vendor == "sqlite", "SQLite test")
def test_non_zero_exit_status_when_path_to_db_is_path(self):
sqlite_with_path = {
"ENGINE": "django.db.backends.sqlite3",
"NAME": Path("test.db.sqlite3"),
}
cmd_args = self.settings_to_cmd_args_env(sqlite_with_path)[0]
msg = '"sqlite3 test.db.sqlite3" returned non-zero exit status 1.'
with mock.patch(
"django.db.backends.sqlite3.client.DatabaseClient.runshell",
side_effect=subprocess.CalledProcessError(returncode=1, cmd=cmd_args),
), self.assertRaisesMessage(CommandError, msg):
call_command("dbshell")