Skip to content

Commit cbeb22d

Browse files
committed
Updated argparse_custom unit tests.
1 parent ad4a3de commit cbeb22d

3 files changed

Lines changed: 59 additions & 20 deletions

File tree

tests/test_argparse.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,7 @@ def base_helpless(self, args) -> None:
335335
parser_bar.set_defaults(func=base_bar)
336336

337337
# create the parser for the "helpless" subcommand
338-
# This subcommand has aliases and no help text. It exists to prevent changes to update_prog() which
339-
# use an approach which relies on action._choices_actions list. See comment in that function for more
340-
# details.
338+
# This subcommand has aliases and no help text.
341339
parser_helpless = base_subparsers.add_parser('helpless', aliases=['helpless_1', 'helpless_2'])
342340
parser_helpless.add_argument('z', help='string')
343341
parser_helpless.set_defaults(func=base_helpless)
@@ -445,19 +443,6 @@ def test_subcommand_invalid_help(subcommand_app) -> None:
445443
assert out[0].startswith('Usage: base')
446444

447445

448-
def test_add_another_subcommand(subcommand_app) -> None:
449-
"""This tests makes sure update_prog() sets _prog_prefix on every _SubParsersAction so that all future calls
450-
to add_parser() write the correct prog value to the parser being added.
451-
"""
452-
base_parser = subcommand_app._command_parsers.get(subcommand_app.do_base)
453-
for sub_action in base_parser._actions:
454-
if isinstance(sub_action, argparse._SubParsersAction):
455-
new_parser = sub_action.add_parser('new_sub', help='stuff')
456-
break
457-
458-
assert new_parser.prog == "base new_sub"
459-
460-
461446
def test_subcmd_decorator(subcommand_app) -> None:
462447
# Test subcommand that has help option
463448
out, err = run_cmd(subcommand_app, 'test_subcmd_decorator subcmd')

tests/test_argparse_custom.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
)
1515
from cmd2.argparse_custom import (
1616
Cmd2HelpFormatter,
17-
Cmd2RichArgparseConsole,
1817
generate_range_error,
1918
register_argparse_argument_parameter,
2019
)
20+
from cmd2.rich_utils import Cmd2RichArgparseConsole
2121

2222
from .conftest import run_cmd
2323

@@ -476,3 +476,59 @@ def side_effect(color, **kwargs):
476476
assert mock_set_color.call_count == 2
477477
mock_set_color.assert_any_call(True, file=sys.stdout)
478478
mock_set_color.assert_any_call(True)
479+
480+
481+
def test_update_prog() -> None:
482+
"""Test Cmd2ArgumentParser.update_prog() across various scenarios."""
483+
484+
# Set up a complex parser hierarchy
485+
old_root = 'old_app'
486+
parser = Cmd2ArgumentParser(prog=old_root)
487+
488+
# Positionals before subcommand
489+
parser.add_argument('pos1')
490+
491+
# Mutually exclusive group with positionals
492+
group = parser.add_mutually_exclusive_group(required=True)
493+
group.add_argument('posA', nargs='?')
494+
group.add_argument('posB', nargs='?')
495+
496+
# Subparsers with aliases and no help text
497+
subparsers = parser.add_subparsers(dest='cmd')
498+
499+
# Subcommand with aliases
500+
sub1 = subparsers.add_parser('sub1', aliases=['s1', 'alias1'], help='help for sub1')
501+
502+
# Subcommand with no help text
503+
sub2 = subparsers.add_parser('sub2')
504+
505+
# Nested subparser
506+
sub2.add_argument('inner_pos')
507+
sub2_subparsers = sub2.add_subparsers(dest='sub2_cmd')
508+
leaf = sub2_subparsers.add_parser('leaf', help='leaf help')
509+
510+
# Verify initial progs look correct
511+
assert parser.prog == 'old_app'
512+
assert sub1.prog == 'old_app pos1 (posA | posB) sub1'
513+
assert sub2.prog == 'old_app pos1 (posA | posB) sub2'
514+
assert leaf.prog == 'old_app pos1 (posA | posB) sub2 inner_pos leaf'
515+
516+
# Perform update
517+
new_root = 'new_app'
518+
parser.update_prog(new_root)
519+
520+
# Verify new progs look correct
521+
assert parser.prog == 'new_app'
522+
assert sub1.prog == 'new_app pos1 (posA | posB) sub1'
523+
assert sub2.prog == 'new_app pos1 (posA | posB) sub2'
524+
assert leaf.prog == 'new_app pos1 (posA | posB) sub2 inner_pos leaf'
525+
526+
# Verify that action._prog_prefix was updated by adding a new subparser
527+
sub3 = subparsers.add_parser('sub3')
528+
assert sub3.prog == 'new_app pos1 (posA | posB) sub3'
529+
530+
# Verify aliases still point to the correct parser
531+
for action in parser._actions:
532+
if isinstance(action, argparse._SubParsersAction):
533+
assert action.choices['s1'].prog == sub1.prog
534+
assert action.choices['alias1'].prog == sub1.prog

tests/test_argparse_subcommands.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ def base_helpless(self, args) -> None:
4545
parser_bar.set_defaults(func=base_bar)
4646

4747
# create the parser for the "helpless" subcommand
48-
# This subcommand has aliases and no help text. It exists to prevent changes to update_prog() which
49-
# use an approach which relies on action._choices_actions list. See comment in that function for more
50-
# details.
48+
# This subcommand has aliases and no help text.
5149
parser_helpless = base_subparsers.add_parser('helpless', aliases=['helpless_1', 'helpless_2'])
5250
parser_helpless.add_argument('z', help='string')
5351
parser_helpless.set_defaults(func=base_helpless)

0 commit comments

Comments
 (0)