From fbc412e533bd7cb07c6d930e194f660e14b2319f Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Thu, 31 Jan 2013 19:30:25 -0600 Subject: Multiple API version support * Use multiple entry point groups to represent each API+version combination supported * Add some tests Try it out: * Right now only '* user' commands have multiple overlapping versions; you can see the selection between v2.0 and v3 by looking at the command help output for 'tenant' vs 'project': os --os-identity-api-version=2.0 help set user os --os-identity-api-version=3 help set user Change-Id: I7114fd246843df0243d354a7cce697810bb7de62 --- tests/common/test_clientmanager.py | 35 ++++++++++++++++++ tests/common/test_commandmanager.py | 71 +++++++++++++++++++++++++++++++++++++ tests/test_clientmanager.py | 35 ------------------ tests/test_shell.py | 24 +++++++++++++ 4 files changed, 130 insertions(+), 35 deletions(-) create mode 100644 tests/common/test_clientmanager.py create mode 100644 tests/common/test_commandmanager.py delete mode 100644 tests/test_clientmanager.py (limited to 'tests') diff --git a/tests/common/test_clientmanager.py b/tests/common/test_clientmanager.py new file mode 100644 index 00000000..fe99c599 --- /dev/null +++ b/tests/common/test_clientmanager.py @@ -0,0 +1,35 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +from openstackclient.common import clientmanager +from tests import utils + + +class Container(object): + attr = clientmanager.ClientCache(lambda x: object()) + + def __init__(self): + pass + + +class TestClientManager(utils.TestCase): + def setUp(self): + super(TestClientManager, self).setUp() + + def test_singleton(self): + # NOTE(dtroyer): Verify that the ClientCache descriptor only invokes + # the factory one time and always returns the same value after that. + c = Container() + self.assertEqual(c.attr, c.attr) diff --git a/tests/common/test_commandmanager.py b/tests/common/test_commandmanager.py new file mode 100644 index 00000000..f0a0b341 --- /dev/null +++ b/tests/common/test_commandmanager.py @@ -0,0 +1,71 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +import mock + +from openstackclient.common import commandmanager +from tests import utils + + +class FakeCommand(object): + @classmethod + def load(cls): + return cls + + def __init__(self): + return + +FAKE_CMD_ONE = FakeCommand +FAKE_CMD_TWO = FakeCommand +FAKE_CMD_ALPHA = FakeCommand +FAKE_CMD_BETA = FakeCommand + + +class FakeCommandManager(commandmanager.CommandManager): + commands = {} + + def _load_commands(self, group=None): + if not group: + self.commands['one'] = FAKE_CMD_ONE + self.commands['two'] = FAKE_CMD_TWO + else: + self.commands['alpha'] = FAKE_CMD_ALPHA + self.commands['beta'] = FAKE_CMD_BETA + + +class TestCommandManager(utils.TestCase): + def test_add_command_group(self): + mgr = FakeCommandManager('test') + + # Make sure add_command() still functions + mock_cmd_one = mock.Mock() + mgr.add_command('mock', mock_cmd_one) + cmd_mock, name, args = mgr.find_command(['mock']) + self.assertEqual(cmd_mock, mock_cmd_one) + + # Find a command added in initialization + cmd_one, name, args = mgr.find_command(['one']) + self.assertEqual(cmd_one, FAKE_CMD_ONE) + + # Load another command group + mgr.add_command_group('latin') + + # Find a new command + cmd_alpha, name, args = mgr.find_command(['alpha']) + self.assertEqual(cmd_alpha, FAKE_CMD_ALPHA) + + # Ensure that the original commands were not overwritten + cmd_two, name, args = mgr.find_command(['two']) + self.assertEqual(cmd_two, FAKE_CMD_TWO) diff --git a/tests/test_clientmanager.py b/tests/test_clientmanager.py deleted file mode 100644 index fe99c599..00000000 --- a/tests/test_clientmanager.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -from openstackclient.common import clientmanager -from tests import utils - - -class Container(object): - attr = clientmanager.ClientCache(lambda x: object()) - - def __init__(self): - pass - - -class TestClientManager(utils.TestCase): - def setUp(self): - super(TestClientManager, self).setUp() - - def test_singleton(self): - # NOTE(dtroyer): Verify that the ClientCache descriptor only invokes - # the factory one time and always returns the same value after that. - c = Container() - self.assertEqual(c.attr, c.attr) diff --git a/tests/test_shell.py b/tests/test_shell.py index ac634c32..d259785f 100644 --- a/tests/test_shell.py +++ b/tests/test_shell.py @@ -108,6 +108,30 @@ class TestShell(utils.TestCase): default_args["image_api_version"]) +class TestShellHelp(TestShell): + """Test the deferred help flag""" + def setUp(self): + super(TestShellHelp, self).setUp() + self.orig_env, os.environ = os.environ, {} + + def tearDown(self): + super(TestShellHelp, self).tearDown() + os.environ = self.orig_env + + def test_help_options(self): + flag = "-h list server" + kwargs = { + "deferred_help": True, + } + with mock.patch("openstackclient.shell.OpenStackShell.initialize_app", + self.app): + _shell, _cmd = make_shell(), flag + fake_execute(_shell, _cmd) + + self.assertEqual(_shell.options.deferred_help, + kwargs["deferred_help"]) + + class TestShellPasswordAuth(TestShell): def setUp(self): super(TestShellPasswordAuth, self).setUp() -- cgit v1.2.1