def test_compose_epilog_returns_epilog(self): epilog = factory.make_name("epi") self.assertEqual( "\n\n%s" % epilog, "\n".join( api.ActionHelp.compose_epilog(ArgumentParser(epilog=epilog))), )
def test_compose_epilog_explains_documented_keyword_args(self): epilog = ":param foo: The amount of foo." self.assertEqual( "\n\n%s\n%s" % (api.ActionHelp.keyword_args_help, epilog), "\n".join( api.ActionHelp.compose_epilog(ArgumentParser(epilog=epilog))), )
def test_get_positional_args_includes_other_arg(self): parser = ArgumentParser() parser.add_argument("data") option = factory.make_name("opt", sep="_") parser.add_argument(option) self.assertEqual(["data", option], api.ActionHelp.get_positional_args(parser))
def test_get_optional_args_returns_optional_args(self): option = "--%s" % factory.make_name("opt") parser = ArgumentParser(add_help=False) parser.add_argument(option) args = api.ActionHelp.get_optional_args(parser) self.assertEqual([[option]], [action.option_strings for action in args])
def test_subparsers_have_appropriate_execute_defaults(self): parser = ArgumentParser() cli.register_cli_commands(parser) self.assertIsInstance( parser.subparsers.choices["login"].get_default("execute"), cli.cmd_login, )
def test_load_init_command_no_snap(self): environ = {} self.patch(os, "environ", environ) parser = ArgumentParser() cli.register_cli_commands(parser) subparser = parser.subparsers.choices.get("init") self.assertIsInstance(subparser.get_default("execute"), cli.cmd_init)
def test_requires_root(self): parser = ArgumentParser() cmd = snappy.cmd_status(parser) self.patch(os, "getuid").return_value = 1000 error = self.assertRaises(SystemExit, cmd, parser.parse_args([])) self.assertEqual(str(error), "The 'status' command must be run by root.")
def test_compose_optional_args_returns_empty_if_none_defined(self): self.assertEqual( [], api.ActionHelp.compose_optional_args( ArgumentParser(add_help=False) ), )
def test_registers_subparsers(self): profile_name = list(self.make_profile().keys())[0] parser = ArgumentParser() self.assertIsNone(parser._subparsers) api.register_api_commands(parser) self.assertIsNotNone(parser._subparsers) self.assertIsNotNone(parser.subparsers.choices[profile_name])
def test_compose_epilog_preserves_indentation(self): indent = ' ' * 8 epilog = indent + factory.make_name('epi') self.assertEqual( "\n\n%s" % epilog, '\n'.join( api.ActionHelp.compose_epilog(ArgumentParser(epilog=epilog))))
def test_compose_positional_args_does_not_end_with_newline(self): arg = factory.make_name('arg', sep='_') parser = ArgumentParser() parser.add_argument(arg) self.assertThat( '\n'.join(api.ActionHelp.compose_positional_args(parser)), Not(EndsWith('\n')))
def setUp(self): super().setUp() self.parser = ArgumentParser() init.add_create_admin_options(self.parser) self.mock_call = self.patch(init.subprocess, 'call') self.mock_print_msg = self.patch(init, 'print_msg') self.maas_region_path = init.get_maas_region_bin_path()
def test_load_init_command_snap(self): environ = {'SNAP': 'snap-path'} self.patch(os, 'environ', environ) parser = ArgumentParser() cli.register_cli_commands(parser) subparser = parser.subparsers.choices.get('init') self.assertIsInstance(subparser.get_default('execute'), snappy.cmd_init)
def test_doesnt_call_load_regiond_commands_if_no_management(self): self.patch(cli, "get_django_management").return_value = None self.patch(cli, "is_maasserver_available").return_value = sentinel.pkg_util mock_load_regiond_commands = self.patch(cli, "load_regiond_commands") parser = ArgumentParser() cli.register_cli_commands(parser) mock_load_regiond_commands.assert_not_called()
def test_get_positional_args_includes_other_arg(self): parser = ArgumentParser() parser.add_argument('data') option = factory.make_name('opt', sep='_') parser.add_argument(option) self.assertEqual( ['data', option], api.ActionHelp.get_positional_args(parser))
def test_doesnt_call_load_regiond_commands_if_no_maasserver(self): self.patch(cli, "get_django_management").return_value = sentinel.management self.patch(cli, "is_maasserver_available").return_value = None mock_load_regiond_commands = self.patch(cli, "load_regiond_commands") parser = ArgumentParser() cli.register_cli_commands(parser) self.assertThat(mock_load_regiond_commands, MockNotCalled())
def test_compose_positional_args_does_not_end_with_newline(self): arg = factory.make_name("arg", sep="_") parser = ArgumentParser() parser.add_argument(arg) self.assertThat( "\n".join(api.ActionHelp.compose_positional_args(parser)), Not(EndsWith("\n")), )
def test_load_init_command_no_snap_no_maasserver(self): environ = {} self.patch(os, "environ", environ) self.patch(cli, "is_maasserver_available").return_value = None parser = ArgumentParser() cli.register_cli_commands(parser) subparser = parser.subparsers.choices.get("init") self.assertIsNone(subparser)
def test_call_shows_full_enchilada(self): usage = factory.make_name("usage") description = factory.make_name("description") epilog = dedent("""\ More detailed description here. Typically more than one line. :param foo: The amount of foo. """).rstrip() arg = factory.make_name("arg", sep="_") parser = ArgumentParser(usage=usage, description=description, epilog=epilog, add_help=False) parser.add_argument(arg) option = "--%s" % factory.make_name("opt") option_help = factory.make_name("help") parser.add_argument(option, help=option_help) params = { "usage": usage, "description": description, "arg": arg, "keyword_args_help": api.ActionHelp.keyword_args_help.rstrip(), "epilog": epilog, "option": option, "option_help": option_help, } expected_text = (dedent("""\ usage: %(usage)s %(description)s Positional arguments: \t%(arg)s %(keyword_args_help)s %(epilog)s Common command-line options: %(option)s \t%(option_help)s """).rstrip() % params) action_help = self.make_help() self.patch(sys, "exit") self.patch(api, "print") # Invoke ActionHelp.__call__, so we can see what it prints. action_help( parser, self.make_namespace(), self.make_values(), self.make_option_string(), ) self.assertThat(api.print, MockCalledOnceWith(expected_text))
def test_call_exits(self): parser = ArgumentParser(description=factory.make_string()) action_help = self.make_help() self.patch(sys, 'exit') self.patch(api, 'print') action_help( parser, self.make_namespace(), self.make_values(), self.make_option_string()) self.assertThat(sys.exit, MockCalledOnceWith(0))
def test_not_a_subparser(self): top_parser = ArgumentParser() foo = top_parser.subparsers.add_parser("foo", help="foo help") bar = foo.subparsers.add_parser("bar", help="bar help") assert ( get_deepest_subparser(top_parser, ["foo", "bar", "--help"]) is bar ) assert get_deepest_subparser(top_parser, ["--random"]) is top_parser
def setUp(self): super().setUp() self.parser = ArgumentParser() self.cmd = snappy.cmd_config(self.parser) self.patch(os, "getuid").return_value = 0 snap_common = self.make_dir() snap_data = self.make_dir() self.useFixture(EnvironmentVariableFixture("SNAP_COMMON", snap_common)) self.useFixture(EnvironmentVariableFixture("SNAP_DATA", snap_data))
def setUp(self): super().setUp() self.parser = ArgumentParser() self.cmd = cli.cmd_init(self.parser) self.maas_region_path = init.get_maas_region_bin_path() self.call_mock = self.patch(init.subprocess, 'call') self.check_output_mock = self.patch(init.subprocess, 'check_output') self.check_output_mock.return_value = json.dumps( {'external_auth_url': ''})
def test_cmd_configure_supervisord(self): self.patch(snappy, "get_current_mode").return_value = "region+rack" mock_render_supervisord = self.patch(snappy, "render_supervisord") mock_sighup_supervisord = self.patch(snappy, "sighup_supervisord") parser = ArgumentParser() cmd = snappy.cmd_reconfigure_supervisord(parser) cmd(parser.parse_args([])) mock_render_supervisord.assert_called_once_with("region+rack") mock_sighup_supervisord.assert_called_once()
def test_hidden_commands(self): environ = {"SNAP": "snap-path", "SNAP_COMMON": "snap-common"} self.patch(os, "environ", environ) stdout = self.patch(sys, "stdout", StringIO()) parser = ArgumentParser() cli.register_cli_commands(parser) error = self.assertRaises(SystemExit, parser.parse_args, ["--help"]) self.assertEqual(error.code, 0) self.assertNotIn("reconfigure-supervisord", stdout.getvalue())
def setUp(self): super().setUp() self.maas_bin_path = 'snap-path/bin/maas-region' self.mock_subprocess = self.patch(init, 'subprocess') self.mock_environ = patch.dict(init.os.environ, {'SNAP': 'snap-path'}, clear=True) self.mock_environ.start() self.parser = ArgumentParser() init.add_idm_options(self.parser)
def test_loads_all_regiond_commands(self): parser = ArgumentParser() cli.register_cli_commands(parser) for name, app, help_text in cli.regiond_commands: subparser = parser.subparsers.choices.get(name) klass = management.load_command_class(app, name) if help_text is None: help_text = klass.help self.assertIsNotNone(subparser) self.assertEqual(help_text, subparser.description)
def test_cmd_login_raises_unexpected_error_when_validating_apikey(self): parser = ArgumentParser() options = make_options() check_key = self.patch(cli, "check_valid_apikey") check_key_error_message = factory.make_name("error") check_key_error = UnexpectedResponse(check_key_error_message) check_key.side_effect = check_key_error login = cli.cmd_login(parser) error = self.assertRaises(SystemExit, login, options) self.assertEqual(check_key_error_message, str(error))
def test_calls_load_regiond_commands_when_management_and_maasserver(self): self.patch(cli, "get_django_management").return_value = sentinel.management self.patch(cli, "is_maasserver_available").return_value = sentinel.pkg_util mock_load_regiond_commands = self.patch(cli, "load_regiond_commands") parser = ArgumentParser() cli.register_cli_commands(parser) mock_load_regiond_commands.assert_called_once_with( sentinel.management, parser)
def setUp(self): super().setUp() self.maas_bin_path = "snap-path/bin/maas-region" self.mock_subprocess = self.patch(init, "subprocess") self.mock_environ = patch.dict(init.os.environ, {"SNAP": "snap-path"}, clear=True) self.mock_environ.start() self.parser = ArgumentParser() init.add_rbac_options(self.parser) init.add_candid_options(self.parser)