From 9e67d0cb981b25b26d2720f1e749628b040eb51b Mon Sep 17 00:00:00 2001
From: SerenaFeng <feng.xiaowei@zte.com.cn>
Date: Wed, 18 May 2016 13:32:50 +0800
Subject: add pod related unittests in testAPI

unittest for create/get/list pod in testAPI project

JIRA: FUNCTEST-252

Signed-off-by: SerenaFeng <feng.xiaowei@zte.com.cn>

Change-Id: Ifedb4715abffda20c93284ef58cd93f584879af8
Signed-off-by: SerenaFeng <feng.xiaowei@zte.com.cn>
---
 .../test/result_collection_api/common/constants.py |   1 +
 .../result_collection_api/resources/handlers.py    |   3 +-
 .../test/result_collection_api/resources/models.py |  58 +++++------
 .../result_collection_api/resources/pod_models.py  | 108 +++++++++++++++++++++
 .../tests/unit/fake_pymongo.py                     |   3 +
 .../result_collection_api/tests/unit/test_base.py  |  30 ++++--
 .../result_collection_api/tests/unit/test_pod.py   |  86 ++++++++++++++++
 7 files changed, 250 insertions(+), 39 deletions(-)
 create mode 100644 utils/test/result_collection_api/resources/pod_models.py
 create mode 100644 utils/test/result_collection_api/tests/unit/test_pod.py

(limited to 'utils/test')

diff --git a/utils/test/result_collection_api/common/constants.py b/utils/test/result_collection_api/common/constants.py
index 2c825c109..4d39a142d 100644
--- a/utils/test/result_collection_api/common/constants.py
+++ b/utils/test/result_collection_api/common/constants.py
@@ -12,3 +12,4 @@ DEFAULT_REPRESENTATION = "application/json"
 HTTP_BAD_REQUEST = 400
 HTTP_FORBIDDEN = 403
 HTTP_NOT_FOUND = 404
+HTTP_OK = 200
diff --git a/utils/test/result_collection_api/resources/handlers.py b/utils/test/result_collection_api/resources/handlers.py
index c1e8eb182..fff166237 100644
--- a/utils/test/result_collection_api/resources/handlers.py
+++ b/utils/test/result_collection_api/resources/handlers.py
@@ -13,7 +13,8 @@ from tornado.web import RequestHandler, asynchronous, HTTPError
 from tornado import gen
 from datetime import datetime, timedelta
 
-from models import Pod, TestProject, TestCase, TestResult
+from models import TestProject, TestCase, TestResult
+from resources.pod_models import Pod
 from common.constants import DEFAULT_REPRESENTATION, HTTP_BAD_REQUEST, \
     HTTP_NOT_FOUND, HTTP_FORBIDDEN
 from common.config import prepare_put_request
diff --git a/utils/test/result_collection_api/resources/models.py b/utils/test/result_collection_api/resources/models.py
index 06e95f94f..adf6842c3 100644
--- a/utils/test/result_collection_api/resources/models.py
+++ b/utils/test/result_collection_api/resources/models.py
@@ -5,47 +5,41 @@
 # are made available under the terms of the Apache License, Version 2.0
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
+# feng.xiaowei@zte.com.cn  mv Pod to pod_models.py                 6-18-2016
+# feng.xiaowei@zte.com.cn  add MetaCreateResponse/MetaGetResponse  6-18-2016
 ##############################################################################
 
 
-class Pod:
-    """ describes a POD platform """
-    def __init__(self):
-        self._id = ""
-        self.name = ""
-        self.creation_date = ""
-        self.mode = ""
-        self.details = ""
+class MetaCreateResponse(object):
+    def __init__(self, success=True, uri=''):
+        self.success = success
+        self.uri = uri
 
     @staticmethod
-    def pod_from_dict(pod_dict):
-        if pod_dict is None:
+    def from_dict(meta_dict):
+        if meta_dict is None:
             return None
 
-        p = Pod()
-        p._id = pod_dict.get('_id')
-        p.creation_date = str(pod_dict.get('creation_date'))
-        p.name = pod_dict.get('name')
-        p.mode = pod_dict.get('mode')
-        p.details = pod_dict.get('details')
-        return p
+        meta = MetaCreateResponse()
+        meta.success = meta_dict.get('success')
+        meta.uri = meta_dict.get('uri')
+        return meta
 
-    def format(self):
-        return {
-            "name": self.name,
-            "mode": self.mode,
-            "details": self.details,
-            "creation_date": str(self.creation_date),
-        }
 
-    def format_http(self):
-        return {
-            "_id": str(self._id),
-            "name": self.name,
-            "mode": self.mode,
-            "details": self.details,
-            "creation_date": str(self.creation_date),
-        }
+class MetaGetResponse(object):
+    def __init__(self, success=True, total=0):
+        self.success = success
+        self.total = total
+
+    @staticmethod
+    def from_dict(meta_dict):
+        if meta_dict is None:
+            return None
+
+        meta = MetaGetResponse()
+        meta.success = meta_dict.get('success')
+        meta.total = meta_dict.get('total')
+        return meta
 
 
 class TestProject:
diff --git a/utils/test/result_collection_api/resources/pod_models.py b/utils/test/result_collection_api/resources/pod_models.py
new file mode 100644
index 000000000..5c4ef7221
--- /dev/null
+++ b/utils/test/result_collection_api/resources/pod_models.py
@@ -0,0 +1,108 @@
+from models import MetaCreateResponse, MetaGetResponse
+
+
+class PodCreateRequest(object):
+    def __init__(self, name='', mode='', details=''):
+        self.name = name
+        self.mode = mode
+        self.details = details
+
+    def format(self):
+        return {
+            "name": self.name,
+            "mode": self.mode,
+            "details": self.details,
+        }
+
+    @staticmethod
+    def from_dict(req_dict):
+        if req_dict is None:
+            return None
+
+        req = PodCreateRequest()
+        req.name = req_dict.get('name')
+        req.mode = req_dict.get('mode')
+        req.details = req_dict.get('details')
+        return req
+
+
+class Pod(PodCreateRequest):
+    """ describes a POD platform """
+    def __init__(self, name='', mode='', details='', _id='', create_date=''):
+        super(Pod, self).__init__(name, mode, details)
+        self._id = _id
+        self.creation_date = create_date
+
+    @staticmethod
+    def pod_from_dict(pod_dict):
+        if pod_dict is None:
+            return None
+
+        p = Pod()
+        p._id = pod_dict.get('_id')
+        p.creation_date = str(pod_dict.get('creation_date'))
+        p.name = pod_dict.get('name')
+        p.mode = pod_dict.get('mode')
+        p.details = pod_dict.get('details')
+        return p
+
+    def format(self):
+        f = super(Pod, self).format()
+        f['creation_date'] = str(self.creation_date)
+        return f
+
+    def format_http(self):
+        f = self.format()
+        f['_id'] = str(self._id)
+        return f
+
+
+class PodCreateResponse(object):
+    def __init__(self, pod=None, meta=None):
+        self.pod = pod
+        self.meta = meta
+
+    @staticmethod
+    def from_dict(res_dict):
+        if res_dict is None:
+            return None
+
+        res = PodCreateResponse()
+        res.pod = Pod.pod_from_dict(res_dict.get('pod'))
+        res.meta = MetaCreateResponse.from_dict(res_dict.get('meta'))
+        return res
+
+
+class PodGetResponse(PodCreateRequest):
+    def __init__(self, name='', mode='', details='', create_date=''):
+        self.creation_date = create_date
+        super(PodGetResponse, self).__init__(name, mode, details)
+
+    @staticmethod
+    def from_dict(req_dict):
+        if req_dict is None:
+            return None
+
+        res = PodGetResponse()
+        res.creation_date = str(req_dict.get('creation_date'))
+        res.name = req_dict.get('name')
+        res.mode = req_dict.get('mode')
+        res.details = req_dict.get('details')
+        return res
+
+
+class PodsGetResponse(object):
+    def __init__(self, pods=[], meta=None):
+        self.pods = pods
+        self.meta = meta
+
+    @staticmethod
+    def from_dict(res_dict):
+        if res_dict is None:
+            return None
+
+        res = PodsGetResponse()
+        for pod in res_dict.get('pods'):
+            res.pods.append(PodGetResponse.from_dict(pod))
+        res.meta = MetaGetResponse.from_dict(res_dict.get('meta'))
+        return res
diff --git a/utils/test/result_collection_api/tests/unit/fake_pymongo.py b/utils/test/result_collection_api/tests/unit/fake_pymongo.py
index e2db46038..e5ded376e 100644
--- a/utils/test/result_collection_api/tests/unit/fake_pymongo.py
+++ b/utils/test/result_collection_api/tests/unit/fake_pymongo.py
@@ -123,6 +123,9 @@ class MemDb(object):
             result = executor.submit(self._remove, spec_or_id)
         return result
 
+    def clear(self):
+        self._remove()
+
 pod = MemDb()
 test_projects = MemDb()
 test_cases = MemDb()
diff --git a/utils/test/result_collection_api/tests/unit/test_base.py b/utils/test/result_collection_api/tests/unit/test_base.py
index b72436eb0..98190fb94 100644
--- a/utils/test/result_collection_api/tests/unit/test_base.py
+++ b/utils/test/result_collection_api/tests/unit/test_base.py
@@ -1,3 +1,4 @@
+import json
 from tornado.web import Application
 from tornado.testing import AsyncHTTPTestCase
 
@@ -7,6 +8,12 @@ import fake_pymongo
 
 
 class TestBase(AsyncHTTPTestCase):
+    headers = {'Content-Type': 'application/json; charset=UTF-8'}
+
+    def setUp(self):
+        self.addCleanup(self._clear)
+        super(TestBase, self).setUp()
+
     def get_app(self):
         return Application(
             [
@@ -28,9 +35,20 @@ class TestBase(AsyncHTTPTestCase):
             debug=True,
         )
 
-    def tearDown(self):
-        yield fake_pymongo.pod.remove()
-        yield fake_pymongo.test_projects.remove()
-        yield fake_pymongo.test_cases.remove()
-        yield fake_pymongo.test_results.remove()
-        super(TestBase, self).tearDown()
+    def create(self, uri, body=None):
+        return self.fetch(uri,
+                          method='POST',
+                          body=json.dumps(body),
+                          headers=self.headers)
+
+    def get(self, uri):
+        return self.fetch(uri,
+                          method='GET',
+                          headers=self.headers)
+
+    @staticmethod
+    def _clear():
+        fake_pymongo.pod.clear()
+        fake_pymongo.test_projects.clear()
+        fake_pymongo.test_cases.clear()
+        fake_pymongo.test_results.clear()
diff --git a/utils/test/result_collection_api/tests/unit/test_pod.py b/utils/test/result_collection_api/tests/unit/test_pod.py
new file mode 100644
index 000000000..5a3d485ab
--- /dev/null
+++ b/utils/test/result_collection_api/tests/unit/test_pod.py
@@ -0,0 +1,86 @@
+import unittest
+import json
+
+from test_base import TestBase
+from resources.pod_models import PodCreateRequest, \
+    PodCreateResponse, PodsGetResponse
+from common.constants import HTTP_OK, HTTP_BAD_REQUEST, HTTP_FORBIDDEN
+
+
+class TestPodCreate(TestBase):
+    req = PodCreateRequest(name='zte-1', mode='alive', details='zte pod 1')
+
+    def test_withoutBody(self):
+        res = self.create('/pods', body=None)
+        self.assertEqual(res.code, HTTP_BAD_REQUEST)
+
+    def test_success(self):
+        res = self.create('/pods', body=self.req.format())
+        self.assertEqual(res.code, HTTP_OK)
+        res_body = PodCreateResponse.from_dict(json.loads(res.body))
+        self._assertMeta(res_body.meta, True)
+        self._assertBody(res_body.pod)
+
+    def test_alreadyExist(self):
+        self.create('/pods', body=self.req.format())
+        res = self.create('/pods', body=self.req.format())
+        self.assertEqual(res.code, HTTP_FORBIDDEN)
+        self.assertIn('already exists', res.body)
+
+    def _assertMeta(self, meta, success):
+        self.assertEqual(meta.success, success)
+        if success:
+            self.assertEqual(meta.uri, '/pods/{}'.format(self.req.name))
+
+    def _assertBody(self, res):
+        self.assertEqual(res.name, self.req.name)
+        self.assertEqual(res.mode, self.req.mode)
+        self.assertEqual(res.details, self.req.details)
+        self.assertIsNotNone(res.creation_date)
+        self.assertIsNotNone(res._id)
+
+
+class TestPodGet(TestBase):
+    def test_notExist(self):
+        res = self.get('/pods/notExist')
+        body = PodsGetResponse.from_dict(json.loads(res.body))
+        self._assertMeta(body.meta, 0)
+
+    def test_getOne(self):
+        self.create('/pods', body=TestPodCreate.req.format())
+        res = self.get('/pods/{}'.format(TestPodCreate.req.name))
+        body = PodsGetResponse.from_dict(json.loads(res.body))
+        self._assertMeta(body.meta, 1)
+        self._assertBody(TestPodCreate.req, body.pods[0])
+
+    def test_list(self):
+        req = PodCreateRequest(name='zte-2', mode='alive', details='zte pod 2')
+        self.create('/pods', body=TestPodCreate.req.format())
+        self.create('/pods', body=req.format())
+        res = self.get('/pods')
+        body = PodsGetResponse.from_dict(json.loads(res.body))
+        self._assertMeta(body.meta, 2)
+        for pod in body.pods:
+            if req.name == pod.name:
+                self._assertBody(req, pod)
+            else:
+                self._assertBody(TestPodCreate.req, pod)
+
+    def _assertMeta(self, meta, total):
+        def check_success():
+            if total is 0:
+                return False
+            else:
+                return True
+        self.assertEqual(meta.total, total)
+        self.assertEqual(meta.success, check_success())
+
+    def _assertBody(self, req, res):
+        self.assertEqual(res.name, req.name)
+        self.assertEqual(res.mode, req.mode)
+        self.assertEqual(res.details, req.details)
+        self.assertIsNotNone(res.creation_date)
+
+
+if __name__ == '__main__':
+    unittest.main()
-- 
cgit