def test_dispatcher_commands_are_not_loaded_if_not_needed(): class MyCommand1(BaseCommand): """Expected to be executed.""" name = "command1" help_msg = "some help" _executed = [] def run(self, parsed_args): self._executed.append(parsed_args) class MyCommand2(BaseCommand): """Expected to not be instantiated, or parse args, or run.""" name = "command2" help_msg = "some help" def __init__(self, *args): raise AssertionError def fill_parser(self, parser): raise AssertionError def run(self, parsed_args): raise AssertionError groups = [CommandGroup("title", [MyCommand1, MyCommand2])] dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(["command1"]) dispatcher.load_command("config") dispatcher.run() assert isinstance(MyCommand1._executed[0], argparse.Namespace)
def test_tool_exec_command_bad_option_type(help_builder): """Execute a correct command but giving the valid option a bad value.""" def fill_parser(self, parser): parser.add_argument("--number", type=int) cmd = create_command("somecommand", "This command does that.") cmd.fill_parser = fill_parser command_groups = [CommandGroup("group", [cmd])] dispatcher = Dispatcher(command_groups) dispatcher.pre_parse_args(["somecommand", "--number=foo"]) help_builder.init("testapp", "general summary", command_groups) with pytest.raises(ArgumentParsingError) as cm: dispatcher.load_command("config") expected = textwrap.dedent("""\ Usage: testapp [options] command [args]... Try 'testapp somecommand -h' for help. Error: argument --number: invalid int value: 'foo' """) error = cm.value assert str(error) == expected
def test_dispatcher_command_return_code(): """Command ends indicating the return code to be used.""" class MyCommand(BaseCommand): help_msg = "some help" name = "cmdname" def run(self, parsed_args): return 17 groups = [CommandGroup("title", [MyCommand])] dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(["cmdname"]) dispatcher.load_command("config") retcode = dispatcher.run() assert retcode == 17
def test_dispatcher_command_execution_crash(): """Command crashing doesn't pass through, we inform nicely.""" class MyCommand(BaseCommand): help_msg = "some help" name = "cmdname" def run(self, parsed_args): raise ValueError() groups = [CommandGroup("title", [MyCommand])] dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(["cmdname"]) dispatcher.load_command("config") with pytest.raises(ValueError): dispatcher.run()
def test_dispatcher_command_loading(): """Parses and return global arguments.""" cmd = create_command("somecommand") groups = [CommandGroup("title", [cmd])] dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(["somecommand"]) command = dispatcher.load_command("test-config") assert isinstance(command, cmd) assert command.config == "test-config"
def test_tool_exec_command_wrong_option(help_builder): """Execute a correct command but with a wrong option.""" cmd = create_command("somecommand", "This command does that.") command_groups = [CommandGroup("group", [cmd])] dispatcher = Dispatcher(command_groups) dispatcher.pre_parse_args(["somecommand", "--whatever"]) help_builder.init("testapp", "general summary", command_groups) with pytest.raises(ArgumentParsingError) as cm: dispatcher.load_command("config") expected = textwrap.dedent("""\ Usage: testapp [options] command [args]... Try 'testapp somecommand -h' for help. Error: unrecognized arguments: --whatever """) error = cm.value assert str(error) == expected
def test_dispatcher_command_execution_ok(): """Command execution depends of the indicated name in command line, return code ok.""" class MyCommandControl(BaseCommand): help_msg = "some help" def run(self, parsed_args): self._executed.append(parsed_args) class MyCommand1(MyCommandControl): name = "name1" _executed = [] class MyCommand2(MyCommandControl): name = "name2" _executed = [] groups = [CommandGroup("title", [MyCommand1, MyCommand2])] dispatcher = Dispatcher(groups) dispatcher.pre_parse_args(["name2"]) dispatcher.load_command("config") dispatcher.run() assert MyCommand1._executed == [] assert isinstance(MyCommand2._executed[0], argparse.Namespace)