summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatyana Leontovich <tleontov@yahoo-inc.com>2013-02-28 18:53:58 +0200
committerTatyana Leontovich <tleontov@yahoo-inc.com>2013-05-17 19:46:07 +0300
commit8451a9482202fee5a4302bb3d7c62cff55365b0c (patch)
treefd4c18b9fd873b680ac0ea80886b7838739d3245
parentde5f2eea025a5ba926bff376f85ce4ad7ca364dd (diff)
downloadpython-glanceclient-8451a9482202fee5a4302bb3d7c62cff55365b0c.tar.gz
Add test for glanceclient shells
Add unittests for the following modules: * glanceclient.shell * glanceclient.v1.shell * glanceclient.v1.legacy_shell * glanceclient.v2.shell Also add mock library to the tools/test-requires Implements: blueprint glanceclient-shells-unittests Change-Id: I5ec527c5efff3726932d234d7c67e08149643f89
-rw-r--r--tests/test_shell.py84
-rw-r--r--tests/utils.py32
-rw-r--r--tests/v1/test_legacy_shell.py585
-rw-r--r--tests/v1/test_shell.py136
-rw-r--r--tests/v2/test_shell_v2.py86
-rw-r--r--tools/test-requires1
6 files changed, 924 insertions, 0 deletions
diff --git a/tests/test_shell.py b/tests/test_shell.py
new file mode 100644
index 0000000..f358546
--- /dev/null
+++ b/tests/test_shell.py
@@ -0,0 +1,84 @@
+# Copyright 2013 OpenStack LLC.
+# Copyright (C) 2013 Yahoo! Inc.
+# All Rights Reserved.
+#
+# 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.
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import argparse
+import cStringIO
+import os
+import sys
+
+from glanceclient import exc
+from glanceclient import shell as openstack_shell
+from tests import utils
+
+DEFAULT_IMAGE_URL = 'http://127.0.0.1:5000/'
+DEFAULT_USERNAME = 'username'
+DEFAULT_PASSWORD = 'password'
+DEFAULT_TENANT_ID = 'tenant_id'
+DEFAULT_TENANT_NAME = 'tenant_name'
+DEFAULT_AUTH_URL = 'http://127.0.0.1:5000/v2.0/'
+DEFAULT_AUTH_TOKEN = ' 3bcc3d3a03f44e3d8377f9247b0ad155'
+TEST_SERVICE_URL = 'http://127.0.0.1:5000/'
+
+
+class ShellTest(utils.TestCase):
+ def setUp(self):
+ super(ShellTest, self).setUp()
+ global _old_env
+ fake_env = {
+ 'OS_USERNAME': DEFAULT_USERNAME,
+ 'OS_PASSWORD': DEFAULT_PASSWORD,
+ 'OS_TENANT_NAME': DEFAULT_TENANT_NAME,
+ 'OS_AUTH_URL': DEFAULT_AUTH_URL,
+ 'OS_IMAGE_URL': DEFAULT_IMAGE_URL,
+ 'OS_AUTH_TOKEN': DEFAULT_AUTH_TOKEN}
+ _old_env, os.environ = os.environ, fake_env.copy()
+
+ global shell, _shell, assert_called, assert_called_anytime
+ _shell = openstack_shell.OpenStackImagesShell()
+ shell = lambda cmd: _shell.main(cmd.split())
+
+ def tearDown(self):
+ super(ShellTest, self).tearDown()
+ global _old_env
+ os.environ = _old_env
+
+ def test_help_unknown_command(self):
+ shell = openstack_shell.OpenStackImagesShell()
+ argstr = 'help foofoo'
+ self.assertRaises(exc.CommandError, shell.main, argstr.split())
+
+ def test_help(self):
+ shell = openstack_shell.OpenStackImagesShell()
+ argstr = 'help'
+ actual = shell.main(argstr.split())
+ self.assertEqual(0, actual)
+
+ def test_help_on_subcommand_error(self):
+ self.assertRaises(exc.CommandError, shell, 'help bad')
+
+ def test_get_base_parser(self):
+ test_shell = openstack_shell.OpenStackImagesShell()
+ actual_parser = test_shell.get_base_parser()
+ description = 'Command-line interface to the OpenStack Images API.'
+ expected = argparse.ArgumentParser(
+ prog='glance', usage=None,
+ description=description,
+ version=None,
+ conflict_handler='error',
+ add_help=False,
+ formatter_class=openstack_shell.HelpFormatter,)
+ self.assertTrue(expected, actual_parser)
diff --git a/tests/utils.py b/tests/utils.py
index d3565ba..0202a42 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -14,7 +14,9 @@
# under the License.
import copy
+import requests
import StringIO
+import testtools
from glanceclient.common import http
@@ -63,3 +65,33 @@ class FakeResponse(object):
def read(self, amt):
return self.body.read(amt)
+
+
+class TestCase(testtools.TestCase):
+ TEST_REQUEST_BASE = {
+ 'config': {'danger_mode': False},
+ 'verify': True}
+
+
+class TestResponse(requests.Response):
+ """
+ Class used to wrap requests.Response and provide some
+ convenience to initialize with a dict
+ """
+ def __init__(self, data):
+ self._text = None
+ super(TestResponse, self)
+ if isinstance(data, dict):
+ self.status_code = data.get('status_code', None)
+ self.headers = data.get('headers', None)
+ # Fake the text attribute to streamline Response creation
+ self._text = data.get('text', None)
+ else:
+ self.status_code = data
+
+ def __eq__(self, other):
+ return self.__dict__ == other.__dict__
+
+ @property
+ def text(self):
+ return self._text
diff --git a/tests/v1/test_legacy_shell.py b/tests/v1/test_legacy_shell.py
new file mode 100644
index 0000000..8d037ac
--- /dev/null
+++ b/tests/v1/test_legacy_shell.py
@@ -0,0 +1,585 @@
+# Copyright 2013 OpenStack LLC.
+# Copyright (C) 2013 Yahoo! Inc.
+# All Rights Reserved.
+#
+# 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.
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import mock
+import testtools
+
+from glanceclient import client
+from glanceclient import exc
+from glanceclient.v1 import legacy_shell as test_shell
+
+
+class LegacyShellV1Test(testtools.TestCase):
+ def test_print_image_formatted(self):
+
+ class FakeClient():
+ endpoint = 'http://no.where'
+
+ class FakeImage():
+ id = 1
+ name = 'fake_image'
+ is_public = False
+ protected = False
+ status = 'active'
+ size = '1024'
+ min_ram = 512
+ min_disk = 10
+ properties = {'a': 'b', 'c': 'd'}
+ created_at = '04.03.2013'
+ owner = 'test'
+ updated_at = '04.03.2013'
+ deleted_at = '04.03.2013'
+
+ test_shell.print_image_formatted(FakeClient(), FakeImage())
+
+ def test_print_image(self):
+ class FakeImage():
+ id = 1
+ name = 'fake_image'
+ is_public = False
+ protected = False
+ status = 'active'
+ size = '1024'
+ min_ram = 512
+ min_disk = 10
+ properties = {'a': 'b', 'c': 'd'}
+ created_at = '04.03.2013'
+ owner = 'test'
+ updated_at = '04.03.2013'
+ deleted_at = '04.03.2013'
+
+ gc = client.Client('1', 'http://no.where:8080')
+ test_shell.print_image_formatted(gc, FakeImage())
+
+ def test_get_image_fields_from_args(self):
+ args = ["field=name"]
+ actual = test_shell.get_image_fields_from_args(args)
+ self.assertEqual({'field': 'name'}, actual)
+
+ def test_get_image_fields_from_args_exception_raises(self):
+ args = {"filed": "name"}
+ self.assertRaises(
+ RuntimeError, test_shell.get_image_fields_from_args, args)
+
+ def test_get_filters_from_args(self):
+ args = ["filter=name"]
+ actual = test_shell.get_image_filters_from_args(args)
+ self.assertEqual({'property-filter': 'name'}, actual)
+
+ def test_get_image_filters_from_args_exception_raises(self):
+ args = {"filter": "name"}
+ actual = test_shell.get_image_filters_from_args(args)
+ self.assertEqual(1, actual)
+
+ def test_do_add_error(self):
+ class FakeClient():
+ endpoint = 'http://no.where'
+
+ class args:
+ fields = 'name'
+
+ actual = test_shell.do_add(FakeClient(), args)
+ self.assertEqual(1, actual)
+
+ def test_do_add(self):
+ gc = client.Client('1', 'http://no.where')
+
+ class FakeImage():
+ fields = ['name=test',
+ 'status=active',
+ 'id=test',
+ 'is_public=True',
+ 'protected=False',
+ 'min_disk=10',
+ 'container_format=ovi',
+ 'status=active']
+ dry_run = True
+
+ test_args = FakeImage()
+ actual = test_shell.do_add(gc, test_args)
+ self.assertEqual(0, actual)
+
+ def test_do_add_with_image_meta(self):
+ gc = client.Client('1', 'http://no.where')
+
+ class FakeImage():
+ fields = ['name=test',
+ 'status=active',
+ 'is_public=True',
+ 'id=test',
+ 'protected=False',
+ 'min_disk=10',
+ 'container_format=ovi',
+ 'status=active',
+ 'size=256',
+ 'location=test',
+ 'checksum=1024',
+ 'owner=test_user']
+ dry_run = True
+
+ test_args = FakeImage()
+ actual = test_shell.do_add(gc, test_args)
+ self.assertEqual(0, actual)
+
+ def test_do_add_without_dry_run(self):
+ gc = client.Client('1', 'http://no.where')
+
+ class FakeImage():
+ fields = ['name=test',
+ 'status=active',
+ 'is_public=True',
+ 'id=test',
+ 'protected=False',
+ 'min_disk=10',
+ 'container_format=ovi',
+ 'status=active',
+ 'size=256',
+ 'location=test',
+ 'checksum=1024',
+ 'owner=test_user']
+ dry_run = False
+ id = 'test'
+ verbose = False
+
+ test_args = FakeImage()
+ with mock.patch.object(gc.images, 'create') as mocked_create:
+ mocked_create.return_value = FakeImage()
+ actual = test_shell.do_add(gc, test_args)
+ self.assertEqual(0, actual)
+
+ def test_do_clear_force_true_error(self):
+ class FakeImage1():
+ id = 1
+ name = 'fake_image'
+ is_public = False
+ protected = False
+ status = 'active'
+ size = '1024'
+ min_ram = 512
+ min_disk = 10
+ properties = {'a': 'b', 'c': 'd'}
+ created_at = '04.03.2013'
+ owner = 'test'
+ updated_at = '04.03.2013'
+ deleted_at = '04.03.2013'
+ force = True
+ verbose = True
+
+ class FakeImages():
+ def __init__(self):
+ self.id = 'test'
+ self.name = 'test_image_name'
+
+ def list(self):
+ self.list = [FakeImage1(), FakeImage1()]
+ return self.list
+
+ class FakeClient():
+ def __init__(self):
+ self.images = FakeImages()
+
+ test_args = FakeImage1()
+ actual = test_shell.do_clear(FakeClient(), test_args)
+ self.assertEqual(1, actual)
+
+ def test_do_clear_force_true(self):
+ class FakeImage1():
+ def __init__(self):
+ self.id = 1
+ self.name = 'fake_image'
+ self.is_public = False
+ self.protected = False
+ self.status = 'active'
+ self.size = '1024'
+ self.min_ram = 512
+ self.min_disk = 10
+ self.properties = {'a': 'b', 'c': 'd'}
+ self.created_at = '04.03.2013'
+ self.owner = 'test'
+ self.updated_at = '04.03.2013'
+ self.deleted_at = '04.03.2013'
+ self.force = True
+ self.verbose = True
+
+ def delete(self):
+ pass
+
+ class FakeImages():
+ def __init__(self):
+ self.id = 'test'
+ self.name = 'test_image_name'
+
+ def list(self):
+ self.list = [FakeImage1(), FakeImage1()]
+ return self.list
+
+ class FakeClient():
+ def __init__(self):
+ self.images = FakeImages()
+
+ test_args = FakeImage1()
+ actual = test_shell.do_clear(FakeClient(), test_args)
+ self.assertEqual(0, actual)
+
+ def test_do_update_error(self):
+ class FakeClient():
+ endpoint = 'http://no.where'
+
+ class Image():
+ fields = ['id', 'is_public', 'name']
+
+ args = Image()
+ fake_client = FakeClient()
+ actual = test_shell.do_update(fake_client, args)
+ self.assertEqual(1, actual)
+
+ def test_do_update_invalid_endpoint(self):
+ class Image():
+ fields = ['id=test_updated', 'is_public=True', 'name=new_name']
+ dry_run = False
+ id = 'test'
+
+ args = Image()
+ gc = client.Client('1', 'http://no.where')
+ self.assertRaises(
+ exc.InvalidEndpoint, test_shell.do_update, gc, args)
+
+ def test_do_update(self):
+ class Image():
+ fields = ['id=test_updated',
+ 'status=active',
+ 'is_public=True',
+ 'name=new_name',
+ 'protected=False']
+ dry_run = True
+ id = 'test'
+
+ args = Image()
+ gc = client.Client('1', 'http://no.where')
+ actual = test_shell.do_update(gc, args)
+ self.assertEqual(0, actual)
+
+ def test_do_update_dry_run_false(self):
+ class Image():
+ fields = ['id=test_updated',
+ 'status=active',
+ 'is_public=True',
+ 'name=new_name',
+ 'protected=False',
+ 'is_public=True']
+ dry_run = False
+ id = 'test'
+ verbose = True
+ is_public = True
+ protected = False
+ status = 'active'
+ size = 1024
+ min_ram = 512
+ min_disk = 512
+ properties = {'property': 'test'}
+ created_at = '12.09.2013'
+
+ args = Image()
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.images, 'update') as mocked_update:
+ mocked_update.return_value = Image()
+ actual = test_shell.do_update(gc, args)
+ self.assertEqual(0, actual)
+
+ def test_do_delete(self):
+ class FakeImage1():
+ def __init__(self):
+ self.id = 1
+ self.name = 'fake_image'
+ self.is_public = False
+ self.protected = False
+ self.status = 'active'
+ self.size = '1024'
+ self.min_ram = 512
+ self.min_disk = 10
+ self.properties = {'a': 'b', 'c': 'd'}
+ self.created_at = '04.03.2013'
+ self.owner = 'test'
+ self.updated_at = '04.03.2013'
+ self.deleted_at = '04.03.2013'
+ self.force = True
+ self.verbose = True
+
+ def delete(self):
+ pass
+
+ def get(self, id):
+ return FakeImage1()
+
+ class FakeClient():
+ def __init__(self):
+ self.images = FakeImage1()
+
+ actual = test_shell.do_delete(FakeClient(), FakeImage1())
+
+ def test_show(self):
+ class Image():
+ fields = ['id=test_updated',
+ 'status=active',
+ 'is_public=True',
+ 'name=new_name',
+ 'protected=False']
+ id = 'test_show'
+ name = 'fake_image'
+ is_public = False
+ protected = False
+ status = 'active'
+ size = '1024'
+ min_ram = 512
+ min_disk = 10
+ properties = {'a': 'b', 'c': 'd'}
+ created_at = '04.03.2013'
+ owner = 'test'
+ updated_at = '04.03.2013'
+
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.images, 'get') as mocked_get:
+ mocked_get.return_value = Image()
+ actual = test_shell.do_show(gc, Image())
+ self.assertEqual(0, actual)
+
+ def test_index(self):
+ class Image():
+ id = 'test'
+ filters = {}
+ limit = 18
+ marker = False
+ sort_key = 'test'
+ kwarg = 'name'
+ sort_dir = 'test'
+ name = 'test'
+ disk_format = 'ovi'
+ container_format = 'ovi'
+ size = 1024
+
+ args = Image()
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.images, 'list') as mocked_list:
+ mocked_list.return_value = [Image(), Image()]
+ actual = test_shell.do_index(gc, args)
+
+ def test_index_return_empty(self):
+ class Image():
+ id = 'test'
+ filters = {}
+ limit = 18
+ marker = False
+ sort_key = 'test'
+ kwarg = 'name'
+ sort_dir = 'test'
+ name = 'test'
+ disk_format = 'ovi'
+ container_format = 'ovi'
+ size = 1024
+
+ args = Image()
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(test_shell, '_get_images') as mocked_get:
+ mocked_get.return_value = False
+ actual = test_shell.do_index(gc, args)
+ self.assertEqual(0, actual)
+
+ def test_do_details(self):
+ class Image():
+ id = 'test'
+ filters = {}
+ limit = 18
+ marker = False
+ sort_key = 'test'
+ kwarg = 'name'
+ sort_dir = 'test'
+ name = 'test'
+ disk_format = 'ovi'
+ container_format = 'ovi'
+ size = 1024
+ is_public = True
+ protected = False
+ status = 'active'
+ min_ram = 512
+ min_disk = 512
+ properties = {}
+ created_at = '12.12.12'
+
+ args = Image()
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.images, 'list') as mocked_list:
+ mocked_list.return_value = [Image(), Image()]
+ actual = test_shell.do_details(gc, args)
+
+ def test_do_image_members(self):
+ class FakeImage1():
+ def __init__(self):
+ self.image_id = 1
+ self.name = 'fake_image'
+ self.is_public = False
+ self.protected = False
+ self.status = 'active'
+ self.size = '1024'
+ self.min_ram = 512
+ self.min_disk = 10
+ self.properties = {'a': 'b', 'c': 'd'}
+ self.created_at = '04.03.2013'
+ self.owner = 'test'
+ self.updated_at = '04.03.2013'
+ self.deleted_at = '04.03.2013'
+ self.force = True
+ self.verbose = True
+
+ def delete(self):
+ pass
+
+ def get(self, id):
+ return FakeImage1()
+
+ class FakeClient():
+ def __init__(self):
+ self.image_members = ImageMembers()
+
+ class ImageMembers():
+ def __init__(self):
+ self.member_id = 'test'
+ self.can_share = True
+
+ def list(self, image):
+ return [ImageMembers(), ImageMembers()]
+
+ actual = test_shell.do_image_members(FakeClient(), FakeImage1())
+
+ def test_do_member_add_error(self):
+ class FakeClient():
+ def __init__(self):
+ self.image_members = ImageMembers()
+
+ class FakeImage1():
+ def __init__(self):
+ self.member_id = 'test'
+ self.fields = ["name", "id", "filter"]
+ self.dry_run = True
+ self.image_id = 'fake_image_id'
+ self.can_share = True
+
+ def delete(self):
+ pass
+
+ def get(self, id):
+ return FakeImage1()
+
+ class ImageMembers():
+ def __init__(self):
+ self.member_id = 'test'
+ self.can_share = True
+
+ def list(self, image):
+ return [ImageMembers(), ImageMembers()]
+
+ actual = test_shell.do_member_add(FakeClient(), FakeImage1())
+
+ def test_do_member_images_empty_result(self):
+ class FakeImage1():
+ def __init__(self):
+ self.member_id = 'test'
+
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.image_members, 'list') as mocked_list:
+ mocked_list.return_value = []
+ actual = test_shell.do_member_images(gc, FakeImage1())
+ self.assertEqual(0, actual)
+
+ def test_do_member_replace(self):
+ class FakeClient():
+ def __init__(self):
+ self.image_members = ImageMembers()
+
+ class ImageMembers():
+ def __init__(self):
+ self.member_id = 'test'
+ self.can_share = True
+ self.dry_run = True
+ self.image_id = "fake_image_id"
+
+ def list(self, image):
+ return [ImageMembers(), ImageMembers()]
+
+ actual = test_shell.do_member_add(FakeClient(), ImageMembers())
+
+ def test_do_members_replace_dry_run_true(self):
+ class Fake():
+ def __init__(self):
+ self.dry_run = True
+ self.can_share = True
+ self.image_id = 'fake_id'
+ self.member_id = 'test'
+
+ gc = client.Client('1', 'http://no.where')
+ actual = test_shell.do_members_replace(gc, Fake())
+
+ def test_do_members_replace_dry_run_false(self):
+ class Fake():
+ def __init__(self):
+ self.dry_run = False
+ self.can_share = True
+ self.image_id = 'fake_id'
+ self.member_id = 'test'
+
+ gc = client.Client('1', 'http://no.where')
+
+ with mock.patch.object(gc.image_members, 'list') as mocked_list:
+ mocked_list.return_value = []
+ with mock.patch.object(gc.image_members, 'create'):
+ actual = test_shell.do_members_replace(gc, Fake())
+
+ def test_do_member_images(self):
+ class FakeClient():
+ def __init__(self):
+ self.image_members = ImageMembers()
+
+ class ImageMembers():
+ def __init__(self):
+ self.member_id = 'test'
+ self.can_share = True
+ self.dry_run = True
+ self.image_id = "fake_image_id"
+
+ def list(self, member):
+ return [ImageMembers(), ImageMembers()]
+
+ actual = test_shell.do_member_images(FakeClient(), ImageMembers())
+
+ def test_create_pretty_table(self):
+ class MyPrettyTable(test_shell.PrettyTable):
+ def __init__(self):
+ self.columns = []
+
+ # Test add column
+ my_pretty_table = MyPrettyTable()
+ my_pretty_table.add_column(1, label='test')
+
+ # Test make header
+ test_res = my_pretty_table.make_header()
+ self.assertEqual('t\n-', test_res)
+
+ # Test make row
+ result = my_pretty_table.make_row('t')
+ self.assertEqual("t", result)
+ result = my_pretty_table._clip_and_justify(
+ data='test', width=4, just=1)
+ self.assertEqual("test", result)
diff --git a/tests/v1/test_shell.py b/tests/v1/test_shell.py
new file mode 100644
index 0000000..2e4bf0a
--- /dev/null
+++ b/tests/v1/test_shell.py
@@ -0,0 +1,136 @@
+# Copyright 2013 OpenStack LLC.
+# Copyright (C) 2013 Yahoo! Inc.
+# All Rights Reserved.
+#
+# 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.
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import os
+
+from glanceclient import exc
+from glanceclient import shell
+from tests import utils
+
+
+class ShellInvalidEndpointTest(utils.TestCase):
+
+ # Patch os.environ to avoid required auth info.
+ def setUp(self):
+ """Run before each test."""
+ super(ShellInvalidEndpointTest, self).setUp()
+ self.old_environment = os.environ.copy()
+ os.environ = {
+ 'OS_USERNAME': 'username',
+ 'OS_PASSWORD': 'password',
+ 'OS_TENANT_ID': 'tenant_id',
+ 'OS_TOKEN_ID': 'test',
+ 'OS_AUTH_URL': 'http://127.0.0.1:5000/v2.0/',
+ 'OS_AUTH_TOKEN': 'pass',
+ 'OS_IMAGE_API_VERSION': '1',
+ 'OS_REGION_NAME': 'test',
+ 'OS_IMAGE_URL': 'http://no.where'}
+
+ self.shell = shell.OpenStackImagesShell()
+
+ def tearDown(self):
+ super(ShellInvalidEndpointTest, self).tearDown()
+ os.environ = self.old_environment
+
+ def run_command(self, cmd):
+ self.shell.main(cmd.split())
+
+ def assert_called(self, method, url, body=None, **kwargs):
+ return self.shell.cs.assert_called(method, url, body, **kwargs)
+
+ def assert_called_anytime(self, method, url, body=None):
+ return self.shell.cs.assert_called_anytime(method, url, body)
+
+ def test_image_list_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint, self.run_command, 'image-list')
+
+ def test_image_details_invalid_endpoint_legacy(self):
+ self.assertRaises(
+ exc.InvalidEndpoint, self.run_command, 'details')
+
+ def test_image_update_invalid_endpoint_legacy(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'update {"name":""test}')
+
+ def test_image_index_invalid_endpoint_legacy(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'index')
+
+ def test_image_create_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'image-create')
+
+ def test_image_delete_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'image-delete <fake>')
+
+ def test_image_download_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'image-download <fake>')
+
+ def test_image_members_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'image-members fake_id')
+
+ def test_members_list_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'member-list --image-id fake')
+
+ def test_member_replace_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'members-replace image_id member_id')
+
+ def test_image_show_invalid_endpoint_legacy(self):
+ self.assertRaises(
+ exc.InvalidEndpoint, self.run_command, 'show image')
+
+ def test_image_show_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'image-show --human-readable <IMAGE_ID>')
+
+ def test_member_images_invalid_endpoint_legacy(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command, 'member-images member_id')
+
+ def test_member_create_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command,
+ 'member-create --can-share <IMAGE_ID> <TENANT_ID>')
+
+ def test_member_delete_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command,
+ 'member-delete <IMAGE_ID> <TENANT_ID>')
+
+ def test_member_add_invalid_endpoint(self):
+ self.assertRaises(
+ exc.InvalidEndpoint,
+ self.run_command,
+ 'member-add <IMAGE_ID> <TENANT_ID>')
diff --git a/tests/v2/test_shell_v2.py b/tests/v2/test_shell_v2.py
new file mode 100644
index 0000000..1f3cc0b
--- /dev/null
+++ b/tests/v2/test_shell_v2.py
@@ -0,0 +1,86 @@
+# Copyright 2013 OpenStack LLC.
+# Copyright (C) 2013 Yahoo! Inc.
+# All Rights Reserved.
+#
+# 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.
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import mock
+import testtools
+
+from glanceclient import client
+from glanceclient.common import utils
+from glanceclient.v2 import shell as test_shell
+
+
+class LegacyShellV1Test(testtools.TestCase):
+ def test_do_image_list(self):
+ gc = client.Client('1', 'http://no.where')
+
+ class Fake():
+ def __init__(self):
+ self.page_size = 18
+ self.visibility = True
+ self.member_status = 'Fake'
+ self.owner = 'test'
+
+ with mock.patch.object(gc.images, 'list') as mocked_list:
+ mocked_list.return_value = {}
+ actual = test_shell.do_image_list(gc, Fake())
+
+ def test_do_image_show(self):
+ gc = client.Client('1', 'http://no.where')
+
+ class Fake():
+ def __init__(self):
+ self.page_size = 18
+ self.id = 'pass'
+
+ with mock.patch.object(gc.images, 'get') as mocked_list:
+ mocked_list.return_value = {}
+ actual = test_shell.do_image_show(gc, Fake())
+
+ def test_do_explain(self):
+ my_mocked_gc = mock.Mock()
+ my_mocked_gc.schemas.return_value = 'test'
+ my_mocked_gc.get.return_value = {}
+
+ class Fake():
+ def __init__(self):
+ self.page_size = 18
+ self.id = 'pass'
+ self.schemas = 'test'
+ self.model = 'test'
+
+ with mock.patch.object(utils, 'print_list'):
+ test_shell.do_explain(my_mocked_gc, Fake())
+
+ def test_image_download(self):
+ class Fake():
+ id = 'pass'
+ file = 'test'
+
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.images, 'data') as mocked_data:
+ mocked_data.return_value = 'test_passed'
+ test_shell.do_image_download(gc, Fake())
+
+ def test_do_image_delete(self):
+ class Fake():
+ id = 'pass'
+ file = 'test'
+
+ gc = client.Client('1', 'http://no.where')
+ with mock.patch.object(gc.images, 'delete') as mocked_delete:
+ mocked_delete.return_value = 0
+ test_shell.do_image_delete(gc, Fake())
diff --git a/tools/test-requires b/tools/test-requires
index b6ea0cb..e5c86ef 100644
--- a/tools/test-requires
+++ b/tools/test-requires
@@ -3,6 +3,7 @@ distribute>=0.6.24
coverage
discover
mox
+mock>=0.8.0
pep8==1.3.3
setuptools-git>=0.4
sphinx>=1.1.2