diff options
| author | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-11-04 14:34:17 -0500 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-11-10 14:14:22 -0500 |
| commit | a26b660cff4c5b17dd0622fabcb877cff93dd858 (patch) | |
| tree | d7e9977ac4fac730276fedfbecbd4b0a91faba98 | |
| parent | edacefdf2aea43137a1cf195c685f96fc9f09a56 (diff) | |
Refs #36680 -- Avoided manipulating PATH in AdminScriptTestCase.
This mostly reverts 6436ec321073bf0622af815e0af08f54c97f9b30,
which was fragile. Instead, if black is present, we use it to format the
expected and actual results, instead of hard-coding the expected
formatted value.
Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>
| -rw-r--r-- | tests/admin_scripts/tests.py | 73 |
1 files changed, 28 insertions, 45 deletions
diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index c01a5571dc..0c27194568 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -33,13 +33,11 @@ from django.core.management.base import LabelCommand, SystemCheckError from django.core.management.commands.loaddata import Command as LoaddataCommand from django.core.management.commands.runserver import Command as RunserverCommand from django.core.management.commands.testserver import Command as TestserverCommand -from django.core.management.utils import find_formatters from django.db import ConnectionHandler, connection from django.db.migrations.recorder import MigrationRecorder from django.test import LiveServerTestCase, SimpleTestCase, TestCase, override_settings from django.test.utils import captured_stderr, captured_stdout from django.urls import path -from django.utils.functional import cached_property from django.utils.version import PY313, get_docs_version from django.views.static import serve @@ -49,6 +47,8 @@ custom_templates_dir = os.path.join(os.path.dirname(__file__), "custom_templates SYSTEM_CHECK_MSG = "System check identified no issues" +HAS_BLACK = shutil.which("black") + class AdminScriptTestCase(SimpleTestCase): def setUp(self): @@ -112,21 +112,7 @@ class AdminScriptTestCase(SimpleTestCase): paths.append(os.path.dirname(backend_dir)) return paths - @cached_property - def path_without_formatters(self): - return os.pathsep.join( - [ - path_component - for path_component in os.environ.get("PATH", "").split(os.pathsep) - for formatter_path in find_formatters().values() - if formatter_path - and os.path.commonpath([path_component, formatter_path]) == os.sep - ] - ) - - def run_test( - self, args, settings_file=None, apps=None, umask=-1, discover_formatters=False - ): + def run_test(self, args, settings_file=None, apps=None, umask=-1): base_dir = os.path.dirname(self.test_dir) # The base dir for Django's tests is one level up. tests_dir = os.path.dirname(os.path.dirname(__file__)) @@ -148,8 +134,6 @@ class AdminScriptTestCase(SimpleTestCase): python_path.extend(ext_backend_base_dirs) test_environ["PYTHONPATH"] = os.pathsep.join(python_path) test_environ["PYTHONWARNINGS"] = "" - if not discover_formatters: - test_environ["PATH"] = self.path_without_formatters p = subprocess.run( [sys.executable, *args], @@ -161,19 +145,10 @@ class AdminScriptTestCase(SimpleTestCase): ) return p.stdout, p.stderr - def run_django_admin( - self, args, settings_file=None, umask=-1, discover_formatters=False - ): - return self.run_test( - ["-m", "django", *args], - settings_file, - umask=umask, - discover_formatters=discover_formatters, - ) + def run_django_admin(self, args, settings_file=None, umask=-1): + return self.run_test(["-m", "django", *args], settings_file, umask=umask) - def run_manage( - self, args, settings_file=None, manage_py=None, discover_formatters=False - ): + def run_manage(self, args, settings_file=None, manage_py=None): template_manage_py = ( os.path.join(os.path.dirname(__file__), manage_py) if manage_py @@ -192,11 +167,17 @@ class AdminScriptTestCase(SimpleTestCase): with open(test_manage_py, "w") as fp: fp.write(manage_py_contents) - return self.run_test( - ["./manage.py", *args], - settings_file, - discover_formatters=discover_formatters, - ) + return self.run_test(["./manage.py", *args], settings_file) + + def assertInAfterFormatting(self, member, container, msg=None): + if HAS_BLACK: + import black + + # Black does not have a stable API, but this is still less fragile + # than attempting to filter out all paths where it is available. + member = black.format_str(member, mode=black.FileMode()) + + self.assertIn(member, container, msg=msg) def assertNoOutput(self, stream): "Utility assertion: assert that the given stream is empty" @@ -773,7 +754,7 @@ class DjangoAdminSettingsDirectory(AdminScriptTestCase): with open(os.path.join(app_path, "apps.py")) as f: content = f.read() self.assertIn("class SettingsTestConfig(AppConfig)", content) - self.assertIn("name = 'settings_test'", content) + self.assertInAfterFormatting("name = 'settings_test'", content) def test_setup_environ_custom_template(self): """ @@ -798,7 +779,7 @@ class DjangoAdminSettingsDirectory(AdminScriptTestCase): with open(os.path.join(app_path, "apps.py"), encoding="utf8") as f: content = f.read() self.assertIn("class こんにちはConfig(AppConfig)", content) - self.assertIn("name = 'こんにちは'", content) + self.assertInAfterFormatting("name = 'こんにちは'", content) def test_builtin_command(self): """ @@ -1960,7 +1941,7 @@ class CommandTypes(AdminScriptTestCase): def test_version(self): "version is handled as a special case" args = ["version"] - out, err = self.run_manage(args, discover_formatters=True) + out, err = self.run_manage(args) self.assertNoOutput(err) self.assertOutput(out, get_version()) @@ -2713,7 +2694,7 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase): args = ["startproject", "--template", template_path, "customtestproject"] testproject_dir = os.path.join(self.test_dir, "customtestproject") - _, err = self.run_django_admin(args, discover_formatters=True) + _, err = self.run_django_admin(args) self.assertNoOutput(err) with open( os.path.join(template_path, "additional_dir", "requirements.in") @@ -2808,7 +2789,7 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase): f"{self.live_server_url}/user_agent_check/project_template.tgz" ) args = ["startproject", "--template", template_url, "urltestproject"] - _, err = self.run_django_admin(args, discover_formatters=True) + _, err = self.run_django_admin(args) self.assertNoOutput(err) self.assertIn("Django/%s" % get_version(), user_agent) @@ -2879,8 +2860,10 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase): test_manage_py = os.path.join(testproject_dir, "manage.py") with open(test_manage_py) as fp: content = fp.read() - self.assertIn('project_name = "another_project"', content) - self.assertIn('project_directory = "%s"' % testproject_dir, content) + self.assertInAfterFormatting('project_name = "another_project"', content) + self.assertInAfterFormatting( + 'project_directory = "%s"' % testproject_dir, content + ) def test_no_escaping_of_project_variables(self): "Make sure template context variables are not html escaped" @@ -2990,7 +2973,7 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase): self.assertNoOutput(err) render_py_path = os.path.join(testproject_dir, ".hidden", "render.py") with open(render_py_path) as fp: - self.assertIn( + self.assertInAfterFormatting( f"# The {project_name} should be rendered.", fp.read(), ) @@ -3150,7 +3133,7 @@ class StartApp(AdminScriptTestCase): with open(os.path.join(app_path, "apps.py")) as f: content = f.read() self.assertIn("class NewAppConfig(AppConfig)", content) - self.assertIn("name = 'new_app'", content) + self.assertInAfterFormatting("name = 'new_app'", content) def test_creates_directory_when_custom_app_destination_missing(self): args = [ |
