From beaa5f31e1e97bbde83a609c4b143193899f79ff Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sun, 15 Jan 2023 09:19:52 +0000 Subject: [4.2.x] Fixed #34259 -- Passed called_from_command_line to command subparsers. Backport of 017fa23d3b0aee9142f531c2a0002fc86c82a54c from main --- .../management/commands/subparser_vanilla.py | 13 ++++++++++++ tests/user_commands/tests.py | 24 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 tests/user_commands/management/commands/subparser_vanilla.py (limited to 'tests') diff --git a/tests/user_commands/management/commands/subparser_vanilla.py b/tests/user_commands/management/commands/subparser_vanilla.py new file mode 100644 index 0000000000..1605f21cad --- /dev/null +++ b/tests/user_commands/management/commands/subparser_vanilla.py @@ -0,0 +1,13 @@ +import argparse + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + def add_arguments(self, parser): + subparsers = parser.add_subparsers(parser_class=argparse.ArgumentParser) + parser_foo = subparsers.add_parser("foo") + parser_foo.add_argument("bar", type=int) + + def handle(self, *args, **options): + pass diff --git a/tests/user_commands/tests.py b/tests/user_commands/tests.py index e40632385c..408108b552 100644 --- a/tests/user_commands/tests.py +++ b/tests/user_commands/tests.py @@ -468,6 +468,30 @@ class CommandRunTests(AdminScriptTestCase): self.assertNoOutput(err) self.assertEqual(out.strip(), "Set foo") + def test_subparser_error_formatting(self): + self.write_settings("settings.py", apps=["user_commands"]) + out, err = self.run_manage(["subparser", "foo", "twelve"]) + self.maxDiff = None + self.assertNoOutput(out) + err_lines = err.splitlines() + self.assertEqual(len(err_lines), 2) + self.assertEqual( + err_lines[1], + "manage.py subparser foo: error: argument bar: invalid int value: 'twelve'", + ) + + def test_subparser_non_django_error_formatting(self): + self.write_settings("settings.py", apps=["user_commands"]) + out, err = self.run_manage(["subparser_vanilla", "foo", "seven"]) + self.assertNoOutput(out) + err_lines = err.splitlines() + self.assertEqual(len(err_lines), 2) + self.assertEqual( + err_lines[1], + "manage.py subparser_vanilla foo: error: argument bar: invalid int value: " + "'seven'", + ) + class UtilsTests(SimpleTestCase): def test_no_existent_external_program(self): -- cgit v1.3