mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						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) | ||||
|   | ||||
							
								
								
									
										31
									
								
								tests/dbshell/test_sqlite.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								tests/dbshell/test_sqlite.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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'], | ||||
|             ) | ||||
		Reference in New Issue
	
	Block a user