Fixed #31076 -- Fixed dbshell crash on Windows with Python < 3.8.
subprocess.run()'s args parameter accepts path-like objects on Windows since Python 3.8.
This commit is contained in:
parent
4161e35048
commit
9d40b6bbf4
|
@ -7,6 +7,8 @@ class DatabaseClient(BaseDatabaseClient):
|
|||
executable_name = 'sqlite3'
|
||||
|
||||
def runshell(self):
|
||||
# TODO: Remove str() when dropping support for PY37.
|
||||
# args parameter accepts path-like objects on Windows since Python 3.8.
|
||||
args = [self.executable_name,
|
||||
self.connection.settings_dict['NAME']]
|
||||
str(self.connection.settings_dict['NAME'])]
|
||||
subprocess.run(args, check=True)
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
from pathlib import Path
|
||||
from subprocess import CompletedProcess
|
||||
from unittest import mock, skipUnless
|
||||
|
||||
from django.db import connection
|
||||
from django.db.backends.sqlite3.client import DatabaseClient
|
||||
from django.test import SimpleTestCase
|
||||
|
||||
|
||||
@skipUnless(connection.vendor == 'sqlite', 'SQLite tests.')
|
||||
class SqliteDbshellCommandTestCase(SimpleTestCase):
|
||||
def _run_dbshell(self):
|
||||
"""Run runshell command and capture its arguments."""
|
||||
def _mock_subprocess_run(*args, **kwargs):
|
||||
self.subprocess_args = list(*args)
|
||||
return CompletedProcess(self.subprocess_args, 0)
|
||||
|
||||
client = DatabaseClient(connection)
|
||||
with mock.patch('subprocess.run', new=_mock_subprocess_run):
|
||||
client.runshell()
|
||||
return self.subprocess_args
|
||||
|
||||
def test_path_name(self):
|
||||
with mock.patch.dict(
|
||||
connection.settings_dict,
|
||||
{'NAME': Path('test.db.sqlite3')},
|
||||
):
|
||||
self.assertEqual(
|
||||
self._run_dbshell(),
|
||||
['sqlite3', 'test.db.sqlite3'],
|
||||
)
|
Loading…
Reference in New Issue