3333from django .core .management .commands .loaddata import Command as LoaddataCommand
3434from django .core .management .commands .runserver import Command as RunserverCommand
3535from django .core .management .commands .testserver import Command as TestserverCommand
36+ from django .core .management .utils import find_formatters
3637from django .db import ConnectionHandler , connection
3738from django .db .migrations .recorder import MigrationRecorder
3839from django .test import LiveServerTestCase , SimpleTestCase , TestCase , override_settings
3940from django .test .utils import captured_stderr , captured_stdout
4041from django .urls import path
42+ from django .utils .functional import cached_property
4143from django .utils .version import PY313 , get_docs_version
4244from django .views .static import serve
4345
4749
4850SYSTEM_CHECK_MSG = "System check identified no issues"
4951
50- HAS_BLACK = shutil .which ("black" )
51-
5252
5353class AdminScriptTestCase (SimpleTestCase ):
5454 def setUp (self ):
@@ -112,7 +112,20 @@ def _ext_backend_paths(self):
112112 paths .append (os .path .dirname (backend_dir ))
113113 return paths
114114
115- def run_test (self , args , settings_file = None , apps = None , umask = - 1 ):
115+ @cached_property
116+ def path_without_formatters (self ):
117+ return os .pathsep .join (
118+ [
119+ path_component
120+ for path_component in os .environ .get ("PATH" , "" ).split (os .pathsep )
121+ for formatter_path in find_formatters ().values ()
122+ if os .path .commonpath ([path_component , formatter_path ]) == os .sep
123+ ]
124+ )
125+
126+ def run_test (
127+ self , args , settings_file = None , apps = None , umask = - 1 , discover_formatters = False
128+ ):
116129 base_dir = os .path .dirname (self .test_dir )
117130 # The base dir for Django's tests is one level up.
118131 tests_dir = os .path .dirname (os .path .dirname (__file__ ))
@@ -134,6 +147,8 @@ def run_test(self, args, settings_file=None, apps=None, umask=-1):
134147 python_path .extend (ext_backend_base_dirs )
135148 test_environ ["PYTHONPATH" ] = os .pathsep .join (python_path )
136149 test_environ ["PYTHONWARNINGS" ] = ""
150+ if not discover_formatters :
151+ test_environ ["PATH" ] = self .path_without_formatters
137152
138153 p = subprocess .run (
139154 [sys .executable , * args ],
@@ -145,10 +160,19 @@ def run_test(self, args, settings_file=None, apps=None, umask=-1):
145160 )
146161 return p .stdout , p .stderr
147162
148- def run_django_admin (self , args , settings_file = None , umask = - 1 ):
149- return self .run_test (["-m" , "django" , * args ], settings_file , umask = umask )
163+ def run_django_admin (
164+ self , args , settings_file = None , umask = - 1 , discover_formatters = False
165+ ):
166+ return self .run_test (
167+ ["-m" , "django" , * args ],
168+ settings_file ,
169+ umask = umask ,
170+ discover_formatters = discover_formatters ,
171+ )
150172
151- def run_manage (self , args , settings_file = None , manage_py = None ):
173+ def run_manage (
174+ self , args , settings_file = None , manage_py = None , discover_formatters = False
175+ ):
152176 template_manage_py = (
153177 os .path .join (os .path .dirname (__file__ ), manage_py )
154178 if manage_py
@@ -167,7 +191,11 @@ def run_manage(self, args, settings_file=None, manage_py=None):
167191 with open (test_manage_py , "w" ) as fp :
168192 fp .write (manage_py_contents )
169193
170- return self .run_test (["./manage.py" , * args ], settings_file )
194+ return self .run_test (
195+ ["./manage.py" , * args ],
196+ settings_file ,
197+ discover_formatters = discover_formatters ,
198+ )
171199
172200 def assertNoOutput (self , stream ):
173201 "Utility assertion: assert that the given stream is empty"
@@ -744,10 +772,7 @@ def test_setup_environ(self):
744772 with open (os .path .join (app_path , "apps.py" )) as f :
745773 content = f .read ()
746774 self .assertIn ("class SettingsTestConfig(AppConfig)" , content )
747- self .assertIn (
748- 'name = "settings_test"' if HAS_BLACK else "name = 'settings_test'" ,
749- content ,
750- )
775+ self .assertIn ("name = 'settings_test'" , content )
751776
752777 def test_setup_environ_custom_template (self ):
753778 """
@@ -772,9 +797,7 @@ def test_startapp_unicode_name(self):
772797 with open (os .path .join (app_path , "apps.py" ), encoding = "utf8" ) as f :
773798 content = f .read ()
774799 self .assertIn ("class こんにちはConfig(AppConfig)" , content )
775- self .assertIn (
776- 'name = "こんにちは"' if HAS_BLACK else "name = 'こんにちは'" , content
777- )
800+ self .assertIn ("name = 'こんにちは'" , content )
778801
779802 def test_builtin_command (self ):
780803 """
@@ -1936,7 +1959,7 @@ def setUp(self):
19361959 def test_version (self ):
19371960 "version is handled as a special case"
19381961 args = ["version" ]
1939- out , err = self .run_manage (args )
1962+ out , err = self .run_manage (args , discover_formatters = True )
19401963 self .assertNoOutput (err )
19411964 self .assertOutput (out , get_version ())
19421965
@@ -2689,7 +2712,7 @@ def test_custom_project_template_non_python_files_not_formatted(self):
26892712 args = ["startproject" , "--template" , template_path , "customtestproject" ]
26902713 testproject_dir = os .path .join (self .test_dir , "customtestproject" )
26912714
2692- _ , err = self .run_django_admin (args )
2715+ _ , err = self .run_django_admin (args , discover_formatters = True )
26932716 self .assertNoOutput (err )
26942717 with open (
26952718 os .path .join (template_path , "additional_dir" , "requirements.in" )
@@ -2784,7 +2807,7 @@ def serve_template(request, *args, **kwargs):
27842807 f"{ self .live_server_url } /user_agent_check/project_template.tgz"
27852808 )
27862809 args = ["startproject" , "--template" , template_url , "urltestproject" ]
2787- _ , err = self .run_django_admin (args )
2810+ _ , err = self .run_django_admin (args , discover_formatters = True )
27882811
27892812 self .assertNoOutput (err )
27902813 self .assertIn ("Django/%s" % get_version (), user_agent )
@@ -3126,10 +3149,7 @@ def test_template(self):
31263149 with open (os .path .join (app_path , "apps.py" )) as f :
31273150 content = f .read ()
31283151 self .assertIn ("class NewAppConfig(AppConfig)" , content )
3129- self .assertIn (
3130- 'name = "new_app"' if HAS_BLACK else "name = 'new_app'" ,
3131- content ,
3132- )
3152+ self .assertIn ("name = 'new_app'" , content )
31333153
31343154 def test_creates_directory_when_custom_app_destination_missing (self ):
31353155 args = [
0 commit comments