From 47791a1639c9ab1da46e750ad11015d9ca868ab0 Mon Sep 17 00:00:00 2001
From: Dean Troyer <dtroyer@gmail.com>
Date: Fri, 1 May 2015 09:38:04 -0500
Subject: [PATCH] Add image show tests

Image v2 uses warlock objects rather than the usua Resource objects
so we need to test for those.  This adds a subset of the Image v2
schema that should be enough to test for proper warlock image handling.

Depends-On: Ic95db2f63d9f5f37e29f0d7e048397da311fbf8c
Change-Id: Ib89cce87f110a554f40e726718e31d39b500a6ae
---
 .../tests/compute/v2/test_server.py           |  8 +-
 openstackclient/tests/image/v1/test_image.py  | 33 +++++++
 openstackclient/tests/image/v2/fakes.py       | 93 ++++++++++++++++++-
 openstackclient/tests/image/v2/test_image.py  | 40 +++++++-
 4 files changed, 166 insertions(+), 8 deletions(-)

diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py
index 079f301eac..baf53742e5 100644
--- a/openstackclient/tests/compute/v2/test_server.py
+++ b/openstackclient/tests/compute/v2/test_server.py
@@ -361,14 +361,14 @@ class TestServerImageCreate(TestServer):
             compute_fakes.server_name,
         )
 
-        collist = ('id', 'is_public', 'name', 'owner', 'protected')
+        collist = ('id', 'name', 'owner', 'protected', 'visibility')
         self.assertEqual(collist, columns)
         datalist = (
             image_fakes.image_id,
-            image_fakes.image_public,
             image_fakes.image_name,
             image_fakes.image_owner,
             image_fakes.image_protected,
+            image_fakes.image_visibility,
         )
         self.assertEqual(datalist, data)
 
@@ -392,14 +392,14 @@ class TestServerImageCreate(TestServer):
             'img-nam',
         )
 
-        collist = ('id', 'is_public', 'name', 'owner', 'protected')
+        collist = ('id', 'name', 'owner', 'protected', 'visibility')
         self.assertEqual(collist, columns)
         datalist = (
             image_fakes.image_id,
-            image_fakes.image_public,
             image_fakes.image_name,
             image_fakes.image_owner,
             image_fakes.image_protected,
+            image_fakes.image_visibility,
         )
         self.assertEqual(datalist, data)
 
diff --git a/openstackclient/tests/image/v1/test_image.py b/openstackclient/tests/image/v1/test_image.py
index 2136f109de..ef7ca9eaa7 100644
--- a/openstackclient/tests/image/v1/test_image.py
+++ b/openstackclient/tests/image/v1/test_image.py
@@ -659,3 +659,36 @@ class TestImageSet(TestImage):
             image_fakes.image_id,
             **kwargs
         )
+
+
+class TestImageShow(TestImage):
+
+    def setUp(self):
+        super(TestImageShow, self).setUp()
+
+        self.images_mock.get.return_value = fakes.FakeResource(
+            None,
+            copy.deepcopy(image_fakes.IMAGE),
+            loaded=True,
+        )
+
+        # Get the command object to test
+        self.cmd = image.ShowImage(self.app, None)
+
+    def test_image_show(self):
+        arglist = [
+            image_fakes.image_id,
+        ]
+        verifylist = [
+            ('image', image_fakes.image_id),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        # DisplayCommandBase.take_action() returns two tuples
+        columns, data = self.cmd.take_action(parsed_args)
+        self.images_mock.get.assert_called_with(
+            image_fakes.image_id,
+        )
+
+        self.assertEqual(image_fakes.IMAGE_columns, columns)
+        self.assertEqual(image_fakes.IMAGE_data, data)
diff --git a/openstackclient/tests/image/v2/fakes.py b/openstackclient/tests/image/v2/fakes.py
index 1b7edf08bf..678291bb86 100644
--- a/openstackclient/tests/image/v2/fakes.py
+++ b/openstackclient/tests/image/v2/fakes.py
@@ -19,18 +19,105 @@ from openstackclient.tests import fakes
 from openstackclient.tests import utils
 
 
-image_id = 'im1'
+image_id = '0f41529e-7c12-4de8-be2d-181abb825b3c'
 image_name = 'graven'
 image_owner = 'baal'
-image_public = False
 image_protected = False
+image_visibility = 'public'
 
 IMAGE = {
     'id': image_id,
     'name': image_name,
-    'is_public': image_public,
     'owner': image_owner,
     'protected': image_protected,
+    'visibility': image_visibility,
+}
+
+IMAGE_columns = tuple(sorted(IMAGE))
+IMAGE_data = tuple((IMAGE[x] for x in sorted(IMAGE)))
+
+# Just enough v2 schema to do some testing
+IMAGE_schema = {
+    "additionalProperties": {
+        "type": "string"
+    },
+    "name": "image",
+    "links": [
+        {
+            "href": "{self}",
+            "rel": "self"
+        },
+        {
+            "href": "{file}",
+            "rel": "enclosure"
+        },
+        {
+            "href": "{schema}",
+            "rel": "describedby"
+        }
+    ],
+    "properties": {
+        "id": {
+            "pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",  # noqa
+            "type": "string",
+            "description": "An identifier for the image"
+        },
+        "name": {
+            "type": [
+                "null",
+                "string"
+            ],
+            "description": "Descriptive name for the image",
+            "maxLength": 255
+        },
+        "owner": {
+            "type": [
+                "null",
+                "string"
+            ],
+            "description": "Owner of the image",
+            "maxLength": 255
+        },
+        "protected": {
+            "type": "boolean",
+            "description": "If true, image will not be deletable."
+        },
+        "self": {
+            "type": "string",
+            "description": "(READ-ONLY)"
+        },
+        "schema": {
+            "type": "string",
+            "description": "(READ-ONLY)"
+        },
+        "size": {
+            "type": [
+                "null",
+                "integer"
+            ],
+            "description": "Size of image file in bytes (READ-ONLY)"
+        },
+        "status": {
+            "enum": [
+                "queued",
+                "saving",
+                "active",
+                "killed",
+                "deleted",
+                "pending_delete"
+            ],
+            "type": "string",
+            "description": "Status of the image (READ-ONLY)"
+        },
+        "visibility": {
+            "enum": [
+                "public",
+                "private"
+            ],
+            "type": "string",
+            "description": "Scope of image accessibility"
+        },
+    }
 }
 
 
diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py
index 7eb23769ec..73b5d39a4a 100644
--- a/openstackclient/tests/image/v2/test_image.py
+++ b/openstackclient/tests/image/v2/test_image.py
@@ -16,6 +16,9 @@
 import copy
 import mock
 
+import warlock
+
+from glanceclient.v2 import schemas
 from openstackclient.image.v2 import image
 from openstackclient.tests import fakes
 from openstackclient.tests.image.v2 import fakes as image_fakes
@@ -223,7 +226,7 @@ class TestImageList(TestImage):
             '',
             '',
             '',
-            '',
+            'public',
             False,
             image_fakes.image_owner,
             '',
@@ -293,3 +296,38 @@ class TestImageList(TestImage):
             image_fakes.image_name
         ), )
         self.assertEqual(datalist, tuple(data))
+
+
+class TestImageShow(TestImage):
+
+    def setUp(self):
+        super(TestImageShow, self).setUp()
+
+        # Set up the schema
+        self.model = warlock.model_factory(
+            image_fakes.IMAGE_schema,
+            schemas.SchemaBasedModel,
+        )
+
+        self.images_mock.get.return_value = self.model(**image_fakes.IMAGE)
+
+        # Get the command object to test
+        self.cmd = image.ShowImage(self.app, None)
+
+    def test_image_show(self):
+        arglist = [
+            image_fakes.image_id,
+        ]
+        verifylist = [
+            ('image', image_fakes.image_id),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        # DisplayCommandBase.take_action() returns two tuples
+        columns, data = self.cmd.take_action(parsed_args)
+        self.images_mock.get.assert_called_with(
+            image_fakes.image_id,
+        )
+
+        self.assertEqual(image_fakes.IMAGE_columns, columns)
+        self.assertEqual(image_fakes.IMAGE_data, data)