summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorEric Lin <anselor@gmail.com>2020-08-20 15:47:22 -0400
committerEric Lin <anselor@gmail.com>2020-08-20 18:08:45 -0400
commit27b10936b123053accc41f20246a0c027d0cbb66 (patch)
tree075c3bc028e1e9f711c9fa6f63301a418d7ee4c9 /tests
parentdddf868439edf24a0f642ce1f39ba66ef82bead3 (diff)
downloadcmd2-git-27b10936b123053accc41f20246a0c027d0cbb66.tar.gz
Added tests for invalid subcommands
Diffstat (limited to 'tests')
-rw-r--r--tests/test_argparse.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/test_argparse.py b/tests/test_argparse.py
index 1334f9e3..0d46b15a 100644
--- a/tests/test_argparse.py
+++ b/tests/test_argparse.py
@@ -92,6 +92,7 @@ class ArgparseApp(cmd2.Cmd):
known_parser.add_argument('-p', '--piglatin', action='store_true', help='atinLay')
known_parser.add_argument('-s', '--shout', action='store_true', help='N00B EMULATION MODE')
known_parser.add_argument('-r', '--repeat', type=int, help='output [n] times')
+
@cmd2.with_argparser(known_parser, with_unknown_args=True)
def do_speak(self, args, extra, *, keyword_arg: Optional[str] = None):
"""Repeat what you tell me to."""
@@ -131,89 +132,108 @@ def test_invalid_syntax(argparse_app):
out, err = run_cmd(argparse_app, 'speak "')
assert err[0] == "Invalid syntax: No closing quotation"
+
def test_argparse_basic_command(argparse_app):
out, err = run_cmd(argparse_app, 'say hello')
assert out == ['hello']
+
def test_argparse_remove_quotes(argparse_app):
out, err = run_cmd(argparse_app, 'say "hello there"')
assert out == ['hello there']
+
def test_argparser_kwargs(argparse_app, capsys):
"""Test with_argparser wrapper passes through kwargs to command function"""
argparse_app.do_say('word', keyword_arg="foo")
out, err = capsys.readouterr()
assert out == "foo\n"
+
def test_argparse_preserve_quotes(argparse_app):
out, err = run_cmd(argparse_app, 'tag mytag "hello"')
assert out[0] == '<mytag>"hello"</mytag>'
+
def test_argparse_custom_namespace(argparse_app):
out, err = run_cmd(argparse_app, 'test_argparse_ns')
assert out[0] == 'custom'
+
def test_argparse_with_list(argparse_app):
out, err = run_cmd(argparse_app, 'speak -s hello world!')
assert out == ['HELLO WORLD!']
+
def test_argparse_with_list_remove_quotes(argparse_app):
out, err = run_cmd(argparse_app, 'speak -s hello "world!"')
assert out == ['HELLO WORLD!']
+
def test_argparse_with_list_preserve_quotes(argparse_app):
out, err = run_cmd(argparse_app, 'test_argparse_with_list_quotes "hello" person')
assert out[0] == '"hello" person'
+
def test_argparse_with_list_custom_namespace(argparse_app):
out, err = run_cmd(argparse_app, 'test_argparse_with_list_ns')
assert out[0] == 'custom'
+
def test_argparse_with_list_and_empty_doc(argparse_app):
out, err = run_cmd(argparse_app, 'speak -s hello world!')
assert out == ['HELLO WORLD!']
+
def test_argparser_correct_args_with_quotes_and_midline_options(argparse_app):
out, err = run_cmd(argparse_app, "speak 'This is a' -s test of the emergency broadcast system!")
assert out == ['THIS IS A TEST OF THE EMERGENCY BROADCAST SYSTEM!']
+
def test_argparser_and_unknown_args_kwargs(argparse_app, capsys):
"""Test with_argparser_and_unknown_args wrapper passes through kwargs to command function"""
argparse_app.do_speak('', keyword_arg="foo")
out, err = capsys.readouterr()
assert out == "foo\n"
+
def test_argparse_quoted_arguments_multiple(argparse_app):
out, err = run_cmd(argparse_app, 'say "hello there" "rick & morty"')
assert out == ['hello there rick & morty']
+
def test_argparse_help_docstring(argparse_app):
out, err = run_cmd(argparse_app, 'help say')
assert out[0].startswith('usage: say')
assert out[1] == ''
assert out[2] == 'Repeat what you tell me to.'
+
def test_argparse_help_description(argparse_app):
out, err = run_cmd(argparse_app, 'help tag')
assert out[0].startswith('usage: tag')
assert out[1] == ''
assert out[2] == 'create a html tag'
+
def test_argparse_prog(argparse_app):
out, err = run_cmd(argparse_app, 'help tag')
progname = out[0].split(' ')[1]
assert progname == 'tag'
+
def test_arglist(argparse_app):
out, err = run_cmd(argparse_app, 'arglist "we should" get these')
assert out[0] == 'True'
+
def test_arglist_kwargs(argparse_app, capsys):
"""Test with_argument_list wrapper passes through kwargs to command function"""
argparse_app.do_arglist('arg', keyword_arg="foo")
out, err = capsys.readouterr()
assert out == "foo\n"
+
def test_preservelist(argparse_app):
out, err = run_cmd(argparse_app, 'preservelist foo "bar baz"')
assert out[0] == "['foo', '\"bar baz\"']"
@@ -269,6 +289,7 @@ class SubcommandApp(cmd2.Cmd):
func = getattr(args, 'func')
func(self, args)
+
@pytest.fixture
def subcommand_app():
app = SubcommandApp()
@@ -284,17 +305,20 @@ def test_subcommand_bar(subcommand_app):
out, err = run_cmd(subcommand_app, 'base bar baz')
assert out == ['((baz))']
+
def test_subcommand_invalid(subcommand_app):
out, err = run_cmd(subcommand_app, 'base baz')
assert err[0].startswith('usage: base')
assert err[1].startswith("base: error: argument SUBCOMMAND: invalid choice: 'baz'")
+
def test_subcommand_base_help(subcommand_app):
out, err = run_cmd(subcommand_app, 'help base')
assert out[0].startswith('usage: base')
assert out[1] == ''
assert out[2] == 'Base command help'
+
def test_subcommand_help(subcommand_app):
# foo has no aliases
out, err = run_cmd(subcommand_app, 'help base foo')
@@ -334,10 +358,12 @@ def test_subcommand_help(subcommand_app):
assert out[1] == ''
assert out[2] == 'positional arguments:'
+
def test_subcommand_invalid_help(subcommand_app):
out, err = run_cmd(subcommand_app, 'help base baz')
assert out[0].startswith('usage: base')
+
def test_add_another_subcommand(subcommand_app):
"""
This tests makes sure _set_parser_prog() sets _prog_prefix on every _SubParsersAction so that all future calls
@@ -345,3 +371,40 @@ def test_add_another_subcommand(subcommand_app):
"""
new_parser = subcommand_app.base_subparsers.add_parser('new_sub', help="stuff")
assert new_parser.prog == "base new_sub"
+
+
+def test_unittest_mock():
+ from unittest import mock
+ from cmd2 import CommandSetRegistrationError
+
+ with mock.patch.object(ArgparseApp, 'namespace_provider'):
+ with pytest.raises(CommandSetRegistrationError):
+ app = ArgparseApp()
+
+ with mock.patch.object(ArgparseApp, 'namespace_provider', spec=True):
+ app = ArgparseApp()
+
+ with mock.patch.object(ArgparseApp, 'namespace_provider', spec_set=True):
+ app = ArgparseApp()
+
+ with mock.patch.object(ArgparseApp, 'namespace_provider', autospec=True):
+ app = ArgparseApp()
+
+
+def test_pytest_mock_invalid(mocker):
+ from cmd2 import CommandSetRegistrationError
+
+ mocker.patch.object(ArgparseApp, 'namespace_provider')
+ with pytest.raises(CommandSetRegistrationError):
+ app = ArgparseApp()
+
+
+@pytest.mark.parametrize('spec_param', [
+ {'spec': True},
+ {'spec_set': True},
+ {'autospec': True},
+])
+def test_pytest_mock_valid(mocker, spec_param):
+ mocker.patch.object(ArgparseApp, 'namespace_provider', **spec_param)
+ app = ArgparseApp()
+