implement create scenario and add unittest 43/27043/3
authorSerenaFeng <feng.xiaowei@zte.com.cn>
Mon, 16 Jan 2017 09:59:06 +0000 (17:59 +0800)
committerSerenaFeng <feng.xiaowei@zte.com.cn>
Mon, 16 Jan 2017 13:16:14 +0000 (21:16 +0800)
JIRA: RELENG-163

Change-Id: Id715a2e5de1022cfd0a745505771d250935541bd
Signed-off-by: SerenaFeng <feng.xiaowei@zte.com.cn>
utils/test/testapi/opnfv_testapi/resources/scenario_handlers.py
utils/test/testapi/opnfv_testapi/resources/scenario_models.py
utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py
utils/test/testapi/opnfv_testapi/tests/unit/scenario-create.json [new file with mode: 0644]
utils/test/testapi/opnfv_testapi/tests/unit/test_base.py
utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py [new file with mode: 0644]

index 75754d8..7bf3d5d 100644 (file)
@@ -1,3 +1,4 @@
+from opnfv_testapi.common.constants import HTTP_FORBIDDEN
 from opnfv_testapi.resources.handlers import GenericApiHandler
 from opnfv_testapi.resources.scenario_models import Scenario
 from opnfv_testapi.tornado_swagger import swagger
@@ -29,10 +30,23 @@ class ScenariosCLHandler(GenericScenarioHandler):
         """
             @description: create a new scenario by name
             @param body: scenario to be created
-            @type body: L{string}
+            @type body: L{ScenarioCreateRequest}
+            @in body: body
             @rtype: L{CreateResponse}
+            @return 200: scenario is created.
+            @raise 403: scenario already exists
+            @raise 400:  body or name not provided
         """
-        pass
+        def query(data):
+            return {'name': data.name}
+
+        def error(data):
+            message = '{} already exists as a scenario'.format(data.name)
+            return HTTP_FORBIDDEN, message
+
+        miss_checks = ['name']
+        db_checks = [(self.table, False, query, error)]
+        self._create(miss_checks=miss_checks, db_checks=db_checks)
 
 
 class ScenarioGURHandler(GenericScenarioHandler):
index 0748a37..b4bb363 100644 (file)
@@ -60,6 +60,17 @@ class ScenarioInstaller(models.ModelBase):
         self.versions = versions if versions else list()
 
 
+@swagger.model()
+class ScenarioCreateRequest(models.ModelBase):
+    """
+        @property installers:
+        @ptype installers: C{list} of L{ScenarioInstaller}
+    """
+    def __init__(self, name='', installers=None):
+        self.name = name
+        self.installers = installers if installers else list()
+
+
 @swagger.model()
 class Scenario(models.ModelBase):
     """
@@ -69,7 +80,7 @@ class Scenario(models.ModelBase):
     def __init__(self, name='', create_date='', _id='', installers=None):
         self.name = name
         self._id = _id
-        self.create_date = create_date
+        self.creation_date = create_date
         self.installers = installers if installers else list()
 
 
diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/scenario-create.json b/utils/test/testapi/opnfv_testapi/tests/unit/scenario-create.json
new file mode 100644 (file)
index 0000000..eba8b6c
--- /dev/null
@@ -0,0 +1,38 @@
+{
+  "name": "nosdn-nofeature-ha",
+  "installers":
+  [
+    {
+      "installer": "apex",
+      "versions":
+      [
+        {
+          "owner": "Luke",
+          "version": "master",
+          "projects":
+          [
+            {
+              "project": "functest",
+              "customs": [ "healthcheck", "vping_ssh"],
+              "scores":
+              [
+                {
+                  "date": "2017-01-08 22:46:44",
+                  "score": "12/14"
+                }
+
+              ],
+              "trust_indicators": []
+            },
+            {
+              "project": "yardstick",
+              "customs": [],
+              "scores": [],
+              "trust_indicators": []
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
index ff1a193..9343ab2 100644 (file)
@@ -47,11 +47,11 @@ class TestBase(AsyncHTTPTestCase):
         return self.create_help(self.basePath, req, *args)
 
     def create_help(self, uri, req, *args):
-        if req:
-            req = req.format()
+        if req and not isinstance(req, str):
+            req = json.dumps(req.format())
         res = self.fetch(self._update_uri(uri, *args),
                          method='POST',
-                         body=json.dumps(req),
+                         body=req if req else json.dumps(None),
                          headers=self.headers)
 
         return self._get_return(res, self.create_res)
@@ -123,9 +123,17 @@ class TestBase(AsyncHTTPTestCase):
         self.assertIn(self.basePath, body.href)
 
     def assert_create_body(self, body, req=None, *args):
+        import inspect
         if not req:
             req = self.req_d
-        new_args = args + tuple([req.name])
+        resource_name = ''
+        if inspect.isclass(req):
+            resource_name = req.name
+        elif isinstance(req, dict):
+            resource_name = req['name']
+        elif isinstance(req, str):
+            resource_name = json.loads(req)['name']
+        new_args = args + tuple([resource_name])
         self.assertIn(self._get_uri(*new_args), body.href)
 
     @staticmethod
@@ -134,3 +142,4 @@ class TestBase(AsyncHTTPTestCase):
         fake_pymongo.projects.clear()
         fake_pymongo.testcases.clear()
         fake_pymongo.results.clear()
+        fake_pymongo.scenarios.clear()
diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py
new file mode 100644 (file)
index 0000000..8e82781
--- /dev/null
@@ -0,0 +1,55 @@
+import json
+import os
+
+from opnfv_testapi.common.constants import HTTP_BAD_REQUEST
+from opnfv_testapi.common.constants import HTTP_FORBIDDEN
+from opnfv_testapi.common.constants import HTTP_OK
+from opnfv_testapi.resources.scenario_models import ScenarioCreateRequest
+from test_testcase import TestBase
+
+
+class TestScenarioBase(TestBase):
+    def setUp(self):
+        super(TestScenarioBase, self).setUp()
+        self.basePath = '/api/v1/scenarios'
+        self.load_request('scenario-create.json')
+
+    def tearDown(self):
+        pass
+
+    def assert_body(self, project, req=None):
+        pass
+
+    def load_request(self, f_req):
+        with open(os.path.join(os.path.dirname(__file__), f_req), 'r') as f:
+            self.req_d = json.dumps(json.load(f))
+            f.close()
+
+
+class TestScenarioCreate(TestScenarioBase):
+    def test_withoutBody(self):
+        (code, body) = self.create()
+        self.assertEqual(code, HTTP_BAD_REQUEST)
+
+    def test_emptyName(self):
+        req_empty = ScenarioCreateRequest('')
+        (code, body) = self.create(req_empty)
+        self.assertEqual(code, HTTP_BAD_REQUEST)
+        self.assertIn('name missing', body)
+
+    def test_noneName(self):
+        req_none = ScenarioCreateRequest(None)
+        (code, body) = self.create(req_none)
+        self.assertEqual(code, HTTP_BAD_REQUEST)
+        self.assertIn('name missing', body)
+
+    def test_success(self):
+        (code, body) = self.create_d()
+        self.assertEqual(code, HTTP_OK)
+        self.assert_create_body(body)
+
+    def test_alreadyExist(self):
+        self.create_d()
+        (code, body) = self.create_d()
+        self.assertEqual(code, HTTP_FORBIDDEN)
+        self.assertIn('already exists', body)