summaryrefslogtreecommitdiff
path: root/tests/test_argparse_completer.py
diff options
context:
space:
mode:
authorKevin Van Brunt <kmvanbrunt@gmail.com>2020-02-18 12:10:34 -0500
committerKevin Van Brunt <kmvanbrunt@gmail.com>2020-02-18 12:10:34 -0500
commitd214709eecf2208b5edb6c52af69a0d76973e595 (patch)
tree3d5096aba973b3eab8d9defed51d0964e472157c /tests/test_argparse_completer.py
parente1dc7637ab99bedaafa421b7fd499ed6302008f1 (diff)
downloadcmd2-git-d214709eecf2208b5edb6c52af69a0d76973e595.tar.gz
Fixed issue where argparse completion errors were being rewrapped as _ActionCompletionError in some cases
Diffstat (limited to 'tests/test_argparse_completer.py')
-rw-r--r--tests/test_argparse_completer.py42
1 files changed, 41 insertions, 1 deletions
diff --git a/tests/test_argparse_completer.py b/tests/test_argparse_completer.py
index 2619d053..83cee30f 100644
--- a/tests/test_argparse_completer.py
+++ b/tests/test_argparse_completer.py
@@ -30,6 +30,8 @@ positional_choices = ['the', 'positional', 'choices']
completions_from_function = ['completions', 'function', 'fairly', 'complete']
completions_from_method = ['completions', 'method', 'missed', 'spot']
+AP_COMP_ERROR_TEXT = "SHOULD ONLY BE THIS TEXT"
+
def choices_function() -> List[str]:
"""Function that provides choices"""
@@ -53,7 +55,7 @@ def completer_takes_arg_tokens(text: str, line: str, begidx: int, endidx: int,
return basic_complete(text, line, begidx, endidx, match_against)
-# noinspection PyMethodMayBeStatic,PyUnusedLocal
+# noinspection PyMethodMayBeStatic,PyUnusedLocal,PyProtectedMember
class AutoCompleteTester(cmd2.Cmd):
"""Cmd2 app that exercises ArgparseCompleter class"""
def __init__(self, *args, **kwargs):
@@ -181,6 +183,7 @@ class AutoCompleteTester(cmd2.Cmd):
choices=one_or_more_choices)
nargs_parser.add_argument("--optional", help="a flag with an optional value", nargs=argparse.OPTIONAL,
choices=optional_choices)
+ # noinspection PyTypeChecker
nargs_parser.add_argument("--range", help="a flag with nargs range", nargs=(1, 2),
choices=range_choices)
nargs_parser.add_argument("--remainder", help="a flag wanting remaining", nargs=argparse.REMAINDER,
@@ -232,6 +235,24 @@ class AutoCompleteTester(cmd2.Cmd):
pass
############################################################################################################
+ # Begin code related to _ArgparseCompletionError
+ ############################################################################################################
+ def raise_argparse_completion_error(self):
+ """Raises ArgparseCompletionError to make sure it gets raised as is"""
+ from cmd2.argparse_completer import _ArgparseCompletionError
+ raise _ArgparseCompletionError(AP_COMP_ERROR_TEXT)
+
+ ap_comp_error_parser = Cmd2ArgumentParser()
+ ap_comp_error_parser.add_argument('pos_ap_comp_err', help='pos ap completion error',
+ choices_method=raise_argparse_completion_error)
+ ap_comp_error_parser.add_argument('--flag_ap_comp_err', help='flag ap completion error',
+ choices_method=raise_argparse_completion_error)
+
+ @with_argparser(ap_comp_error_parser)
+ def do_raise_ap_completion_error(self, args: argparse.Namespace) -> None:
+ pass
+
+ ############################################################################################################
# Begin code related to receiving arg_tokens
############################################################################################################
arg_tokens_parser = Cmd2ArgumentParser()
@@ -772,6 +793,25 @@ def test_completion_error(ac_app, capsys, args, text):
assert "{} broke something".format(text) in out
+@pytest.mark.parametrize('arg', [
+ # Exercise positional arg that raises _ArgparseCompletionError
+ '',
+
+ # Exercise flag arg that raises _ArgparseCompletionError
+ '--flag_ap_comp_err'
+])
+def test_argparse_completion_error(ac_app, capsys, arg):
+ text = ''
+ line = 'raise_ap_completion_error {} {}'.format(arg, text)
+ endidx = len(line)
+ begidx = endidx - len(text)
+
+ first_match = complete_tester(text, line, begidx, endidx, ac_app)
+ assert first_match is None
+ out, err = capsys.readouterr()
+ assert out.strip() == AP_COMP_ERROR_TEXT
+
+
@pytest.mark.parametrize('command_and_args, completions', [
# Exercise a choices function that receives arg_tokens dictionary
('arg_tokens choice subcmd', ['choice', 'subcmd']),