Merge "Add missing test for "Show API v2 details" action"
diff --git a/releasenotes/notes/network-show-version-18e1707a4df0a3d3.yaml b/releasenotes/notes/network-show-version-18e1707a4df0a3d3.yaml
new file mode 100644
index 0000000..36a9710
--- /dev/null
+++ b/releasenotes/notes/network-show-version-18e1707a4df0a3d3.yaml
@@ -0,0 +1,7 @@
+---
+features:
+- |
+    Add ``show_version`` function to the ``NetworkVersionsClient`` client. This
+    allows the possibility of getting details for Networking API.
+
+    .. API reference: https://developer.openstack.org/api-ref/network/v2/index.html#show-api-v2-details
diff --git a/tempest/api/network/test_versions.py b/tempest/api/network/test_versions.py
index 2f01e50..020cb5c 100644
--- a/tempest/api/network/test_versions.py
+++ b/tempest/api/network/test_versions.py
@@ -29,7 +29,7 @@
         """
 
         result = self.network_versions_client.list_versions()
-        expected_versions = ('v2.0')
+        expected_versions = ('v2.0',)
         expected_resources = ('id', 'links', 'status')
         received_list = result.values()
 
@@ -38,3 +38,14 @@
                 for resource in expected_resources:
                     self.assertIn(resource, version)
                 self.assertIn(version['id'], expected_versions)
+
+    @decorators.attr(type='smoke')
+    @decorators.idempotent_id('e64b7216-3178-4263-967c-d389290988bf')
+    def test_show_api_v2_details(self):
+        """Test that GET /v2.0/ returns expected resources."""
+        current_version = 'v2.0'
+        expected_resources = ('subnet', 'network', 'port')
+        result = self.network_versions_client.show_version(current_version)
+        actual_resources = [r['name'] for r in result['resources']]
+        for resource in expected_resources:
+            self.assertIn(resource, actual_resources)
diff --git a/tempest/lib/services/network/versions_client.py b/tempest/lib/services/network/versions_client.py
index f87fe87..807f416 100644
--- a/tempest/lib/services/network/versions_client.py
+++ b/tempest/lib/services/network/versions_client.py
@@ -12,32 +12,36 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import time
-
 from oslo_serialization import jsonutils as json
 
+from tempest.lib.common import rest_client
 from tempest.lib.services.network import base
 
 
 class NetworkVersionsClient(base.BaseNetworkClient):
 
     def list_versions(self):
-        """Do a GET / to fetch available API version information."""
+        """Do a GET / to fetch available API version information.
 
-        version_url = self._get_base_version_url()
+        For more information, please refer to the official API reference:
+        https://developer.openstack.org/api-ref/network/v2/index.html#list-api-versions
+        """
 
-        # Note: we do a raw_request here because we want to use
+        # Note: we do a self.get('/') here because we want to use
         # an unversioned URL, not "v2/$project_id/".
-        # Since raw_request doesn't log anything, we do that too.
-        start = time.time()
-        self._log_request_start('GET', version_url)
-        response, body = self.raw_request(version_url, 'GET')
-        self._error_checker(response, body)
-        end = time.time()
-        self._log_request('GET', version_url, response,
-                          secs=(end - start), resp_body=body)
-
-        self.response_checker('GET', response, body)
-        self.expected_success(200, response.status)
+        resp, body = self.get('/')
         body = json.loads(body)
-        return body
+        self.expected_success(200, resp.status)
+        return rest_client.ResponseBody(resp, body)
+
+    def show_version(self, version):
+        """Do a GET /<version> to fetch available resources.
+
+        For more information, please refer to the official API reference:
+        https://developer.openstack.org/api-ref/network/v2/index.html#show-api-v2-details
+        """
+
+        resp, body = self.get(version + '/')
+        body = json.loads(body)
+        self.expected_success(200, resp.status)
+        return rest_client.ResponseBody(resp, body)
diff --git a/tempest/tests/lib/services/network/test_versions_client.py b/tempest/tests/lib/services/network/test_versions_client.py
index 026dc6d..188fc31 100644
--- a/tempest/tests/lib/services/network/test_versions_client.py
+++ b/tempest/tests/lib/services/network/test_versions_client.py
@@ -12,63 +12,92 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import copy
-
 from tempest.lib.services.network import versions_client
 from tempest.tests.lib import fake_auth_provider
 from tempest.tests.lib.services import base
 
 
 class TestNetworkVersionsClient(base.BaseServiceTest):
-
-    FAKE_INIT_VERSION = {
-        "version": {
-            "id": "v2.0",
-            "links": [
-                {
-                    "href": "http://openstack.example.com/v2.0/",
-                    "rel": "self"
-                },
-                {
-                    "href": "http://docs.openstack.org/",
-                    "rel": "describedby",
-                    "type": "text/html"
-                }
-            ],
-            "status": "CURRENT"
-            }
-        }
+    VERSION = "v2.0"
 
     FAKE_VERSIONS_INFO = {
-        "versions": [FAKE_INIT_VERSION["version"]]
-        }
-
-    FAKE_VERSION_INFO = copy.deepcopy(FAKE_INIT_VERSION)
-
-    FAKE_VERSION_INFO["version"]["media-types"] = [
-        {
-            "base": "application/json",
-            "type": "application/vnd.openstack.network+json;version=2.0"
-        }
+        "versions": [
+            {
+                "id": "v2.0",
+                "links": [
+                    {
+                        "href": "http://openstack.example.com/%s/" % VERSION,
+                        "rel": "self"
+                    }
+                ],
+                "status": "CURRENT"
+            }
         ]
+    }
+
+    FAKE_VERSION_DETAILS = {
+        "resources": [
+            {
+                "collection": "subnets",
+                "links": [
+                    {
+                        "href": "http://openstack.example.com:9696/"
+                                "%s/subnets" % VERSION,
+                        "rel": "self"
+                    }
+                ],
+                "name": "subnet"
+            },
+            {
+                "collection": "networks",
+                "links": [
+                    {
+                        "href": "http://openstack.example.com:9696/"
+                                "%s/networks" % VERSION,
+                        "rel": "self"
+                    }
+                ],
+                "name": "network"
+            },
+            {
+                "collection": "ports",
+                "links": [
+                    {
+                        "href": "http://openstack.example.com:9696/"
+                                "%s/ports" % VERSION,
+                        "rel": "self"
+                    }
+                ],
+                "name": "port"
+            }
+        ]
+    }
 
     def setUp(self):
         super(TestNetworkVersionsClient, self).setUp()
         fake_auth = fake_auth_provider.FakeAuthProvider()
-        self.versions_client = (
-            versions_client.NetworkVersionsClient
-            (fake_auth, 'compute', 'regionOne'))
+        self.versions_client = versions_client.NetworkVersionsClient(
+            fake_auth, 'compute', 'regionOne')
 
-    def _test_versions_client(self, bytes_body=False):
+    def _test_versions_client(self, func, body, bytes_body=False, **kwargs):
         self.check_service_client_function(
-            self.versions_client.list_versions,
-            'tempest.lib.common.rest_client.RestClient.raw_request',
-            self.FAKE_VERSIONS_INFO,
-            bytes_body,
-            200)
+            func, 'tempest.lib.common.rest_client.RestClient.raw_request',
+            body, bytes_body, 200, **kwargs)
 
     def test_list_versions_client_with_str_body(self):
-        self._test_versions_client()
+        self._test_versions_client(self.versions_client.list_versions,
+                                   self.FAKE_VERSIONS_INFO)
 
     def test_list_versions_client_with_bytes_body(self):
-        self._test_versions_client(bytes_body=True)
+        self._test_versions_client(self.versions_client.list_versions,
+                                   self.FAKE_VERSIONS_INFO, bytes_body=True)
+
+    def test_show_version_client_with_str_body(self):
+        self._test_versions_client(self.versions_client.show_version,
+                                   self.FAKE_VERSION_DETAILS,
+                                   version=self.VERSION)
+
+    def test_show_version_client_with_bytes_body(self):
+        self._test_versions_client(self.versions_client.show_version,
+                                   self.FAKE_VERSION_DETAILS, bytes_body=True,
+                                   version=self.VERSION)