From f25ad4e8a7e4bd6505b2144494da81fbcad40b7d Mon Sep 17 00:00:00 2001 From: SerenaFeng Date: Thu, 19 May 2016 18:13:27 +0800 Subject: add unittests of project & refactor response post body: {'href':''} get body: Pod/Project list body: list of Pod/Project update body: Pod/Project delete: no body JIRA: FUNCTEST-253 Change-Id: I28c6f5b35d8909d827f2f803197d95be4abd44bb Signed-off-by: SerenaFeng --- .../result_collection_api/resources/handlers.py | 168 ++++++++++----------- 1 file changed, 81 insertions(+), 87 deletions(-) (limited to 'utils/test/result_collection_api/resources/handlers.py') diff --git a/utils/test/result_collection_api/resources/handlers.py b/utils/test/result_collection_api/resources/handlers.py index fff166237..45572e031 100644 --- a/utils/test/result_collection_api/resources/handlers.py +++ b/utils/test/result_collection_api/resources/handlers.py @@ -5,6 +5,10 @@ # 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 refactor db.pod to db.pods 5-19-2016 +# feng.xiaowei@zte.com.cn refactor test_project to project 5-19-2016 +# feng.xiaowei@zte.com.cn refactor response body 5-19-2016 +# feng.xiaowei@zte.com.cn refactor pod/project response info 5-19-2016 ############################################################################## import json @@ -13,7 +17,8 @@ from tornado.web import RequestHandler, asynchronous, HTTPError from tornado import gen from datetime import datetime, timedelta -from models import TestProject, TestCase, TestResult +from models import TestCase, TestResult, CreateResponse +from resources.project_models import Project from resources.pod_models import Pod from common.constants import DEFAULT_REPRESENTATION, HTTP_BAD_REQUEST, \ HTTP_NOT_FOUND, HTTP_FORBIDDEN @@ -24,6 +29,11 @@ from dashboard.dashboard_utils import get_dashboard_cases, \ get_dashboard_result +def format_data(data, cls): + cls_data = cls.from_dict(data) + return cls_data.format_http() + + class GenericApiHandler(RequestHandler): """ The purpose of this class is to take benefit of inheritance and prepare @@ -36,7 +46,7 @@ class GenericApiHandler(RequestHandler): self.db = self.settings["db"] def prepare(self): - if not (self.request.method == "GET"): + if not (self.request.method == "GET" or self.request.method == "DELETE"): if self.request.headers.get("Content-Type") is not None: if self.request.headers["Content-Type"].startswith( DEFAULT_REPRESENTATION): @@ -49,8 +59,9 @@ class GenericApiHandler(RequestHandler): else: self.json_args = None - def finish_request(self, json_object): - self.write(json.dumps(json_object)) + def finish_request(self, json_object=None): + if json_object: + self.write(json.dumps(json_object)) self.set_header("Content-Type", DEFAULT_REPRESENTATION) self.finish() @@ -84,20 +95,19 @@ class PodHandler(GenericApiHandler): if pod_name is not None: get_request["name"] = pod_name - - res = [] - cursor = self.db.pod.find(get_request) - while (yield cursor.fetch_next): - pod = Pod.pod_from_dict(cursor.next_object()) - res.append(pod.format()) - - meta = dict() - meta["total"] = len(res) - meta["success"] = True if len(res) > 0 else False - - answer = dict() - answer["pods"] = res - answer["meta"] = meta + answer = yield self.db.pods.find_one(get_request) + if answer is None: + raise HTTPError(HTTP_NOT_FOUND, + "{} Not Exist".format(pod_name)) + else: + answer = format_data(answer, Pod) + else: + res = [] + cursor = self.db.pods.find(get_request) + while (yield cursor.fetch_next): + res.append(format_data(cursor.next_object(), Pod)) + answer = dict() + answer['pods'] = res self.finish_request(answer) @@ -112,28 +122,19 @@ class PodHandler(GenericApiHandler): query = {"name": self.json_args.get("name")} # check for existing name in db - mongo_dict = yield self.db.pod.find_one(query) + mongo_dict = yield self.db.pods.find_one(query) if mongo_dict is not None: raise HTTPError(HTTP_FORBIDDEN, "{} already exists as a pod".format( self.json_args.get("name"))) - pod = Pod.pod_from_dict(self.json_args) + pod = Pod.from_dict(self.json_args) pod.creation_date = datetime.now() - future = self.db.pod.insert(pod.format()) - result = yield future - pod._id = result + yield self.db.pods.insert(pod.format()) - meta = dict() - meta["success"] = True - meta["uri"] = "/pods/{}".format(pod.name) - - answer = dict() - answer["pod"] = pod.format_http() - answer["meta"] = meta - - self.finish_request(answer) + res = CreateResponse(self.request.full_url() + '/{}'.format(pod.name)) + self.finish_request(res.format()) @asynchronous @gen.coroutine @@ -141,7 +142,7 @@ class PodHandler(GenericApiHandler): """ Remove a POD # check for an existing pod to be deleted - mongo_dict = yield self.db.pod.find_one( + mongo_dict = yield self.db.pods.find_one( {'name': pod_name}) pod = TestProject.pod(mongo_dict) if pod is None: @@ -150,7 +151,7 @@ class PodHandler(GenericApiHandler): .format(pod_name)) # just delete it, or maybe save it elsewhere in a future - res = yield self.db.test_projects.remove( + res = yield self.db.projects.remove( {'name': pod_name}) meta = dict() @@ -188,28 +189,23 @@ class TestProjectHandler(GenericApiHandler): :param project_name: """ - if project_name is None: - project_name = "" - get_request = dict() - if len(project_name) > 0: + if project_name is not None: get_request["name"] = project_name - - res = [] - cursor = self.db.test_projects.find(get_request) - while (yield cursor.fetch_next): - test_project = TestProject.testproject_from_dict( - cursor.next_object()) - res.append(test_project.format_http()) - - meta = dict() - meta["total"] = len(res) - meta["success"] = True if len(res) > 0 else False - - answer = dict() - answer["test_projects"] = res - answer["meta"] = meta + answer = yield self.db.projects.find_one(get_request) + if answer is None: + raise HTTPError(HTTP_NOT_FOUND, + "{} Not Exist".format(project_name)) + else: + answer = format_data(answer, Project) + else: + res = [] + cursor = self.db.projects.find(get_request) + while (yield cursor.fetch_next): + res.append(format_data(cursor.next_object(), Project)) + answer = dict() + answer['projects'] = res self.finish_request(answer) @@ -224,20 +220,20 @@ class TestProjectHandler(GenericApiHandler): query = {"name": self.json_args.get("name")} # check for name in db - mongo_dict = yield self.db.test_projects.find_one(query) + mongo_dict = yield self.db.projects.find_one(query) if mongo_dict is not None: raise HTTPError(HTTP_FORBIDDEN, "{} already exists as a project".format( self.json_args.get("name"))) - test_project = TestProject.testproject_from_dict(self.json_args) - test_project.creation_date = datetime.now() + project = Project.from_dict(self.json_args) + project.creation_date = datetime.now() - future = self.db.test_projects.insert(test_project.format()) - result = yield future - test_project._id = result + yield self.db.projects.insert(project.format()) + + res = CreateResponse(self.request.full_url() + '/{}'.format(project.name)) + self.finish_request(res.format()) - self.finish_request(test_project.format_http()) @asynchronous @gen.coroutine @@ -246,10 +242,13 @@ class TestProjectHandler(GenericApiHandler): print "PUT request for : {}".format(project_name) + if self.json_args is None: + raise HTTPError(HTTP_BAD_REQUEST) + query = {'name': project_name} - mongo_dict = yield self.db.test_projects.find_one(query) - test_project = TestProject.testproject_from_dict(mongo_dict) - if test_project is None: + mongo_dict = yield self.db.projects.find_one(query) + project = Project.from_dict(mongo_dict) + if project is None: raise HTTPError(HTTP_NOT_FOUND, "{} could not be found".format(project_name)) @@ -258,8 +257,8 @@ class TestProjectHandler(GenericApiHandler): # check for payload name parameter in db # avoid a request if the project name has not changed in the payload - if new_name != test_project.name: - mongo_dict = yield self.db.test_projects.find_one( + if new_name != project.name: + mongo_dict = yield self.db.projects.find_one( {"name": new_name}) if mongo_dict is not None: raise HTTPError(HTTP_FORBIDDEN, @@ -271,28 +270,25 @@ class TestProjectHandler(GenericApiHandler): request = prepare_put_request(request, "name", new_name, - test_project.name) + project.name) request = prepare_put_request(request, "description", new_description, - test_project.description) + project.description) """ raise exception if there isn't a change """ if not request: - raise HTTPError(HTTP_FORBIDDEN, - "Nothing to update") + raise HTTPError(HTTP_FORBIDDEN, "Nothing to update") """ we merge the whole document """ - edit_request = test_project.format() + edit_request = project.format() edit_request.update(request) """ Updating the DB """ - res = yield self.db.test_projects.update({'name': project_name}, - edit_request) - print res - edit_request["_id"] = str(test_project._id) + yield self.db.projects.update({'name': project_name}, edit_request) + new_project = yield self.db.projects.find_one({"_id": project._id}) - self.finish_request({"message": "success", "content": edit_request}) + self.finish_request(format_data(new_project, Project)) @asynchronous @gen.coroutine @@ -302,20 +298,18 @@ class TestProjectHandler(GenericApiHandler): print "DELETE request for : {}".format(project_name) # check for an existing project to be deleted - mongo_dict = yield self.db.test_projects.find_one( + mongo_dict = yield self.db.projects.find_one( {'name': project_name}) - test_project = TestProject.testproject_from_dict(mongo_dict) + test_project = Project.from_dict(mongo_dict) if test_project is None: raise HTTPError(HTTP_NOT_FOUND, "{} could not be found as a project to be deleted" .format(project_name)) # just delete it, or maybe save it elsewhere in a future - res = yield self.db.test_projects.remove( - {'name': project_name}) - print res + yield self.db.projects.remove({'name': project_name}) - self.finish_request({"message": "success"}) + self.finish_request() class TestCasesHandler(GenericApiHandler): @@ -379,14 +373,14 @@ class TestCasesHandler(GenericApiHandler): "Check your request payload") # retrieve test project - mongo_dict = yield self.db.test_projects.find_one( + mongo_dict = yield self.db.projects.find_one( {"name": project_name}) if mongo_dict is None: raise HTTPError(HTTP_FORBIDDEN, "Could not find project {}" .format(project_name)) - # test_project = TestProject.testproject_from_dict(self.json_args) + # test_project = TestProject.from_dict(self.json_args) case = TestCase.test_case_from_dict(self.json_args) case.project_name = project_name @@ -470,14 +464,14 @@ class TestCasesHandler(GenericApiHandler): # check for an existing case to be deleted mongo_dict = yield self.db.test_cases.find_one(case_request) - test_project = TestProject.testproject_from_dict(mongo_dict) + test_project = Project.from_dict(mongo_dict) if test_project is None: raise HTTPError(HTTP_NOT_FOUND, "{}/{} could not be found as a case to be deleted" .format(project_name, case_name)) # just delete it, or maybe save it elsewhere in a future - res = yield self.db.test_projects.remove(case_request) + res = yield self.db.projects.remove(case_request) print res self.finish_request({"message": "success"}) @@ -623,7 +617,7 @@ class TestResultsHandler(GenericApiHandler): # TODO : replace checks with jsonschema # check for project - mongo_dict = yield self.db.test_projects.find_one( + mongo_dict = yield self.db.projects.find_one( {"name": self.json_args.get("project_name")}) if mongo_dict is None: raise HTTPError(HTTP_NOT_FOUND, @@ -639,7 +633,7 @@ class TestResultsHandler(GenericApiHandler): .format(self.json_args.get("case_name"))) # check for pod - mongo_dict = yield self.db.pod.find_one( + mongo_dict = yield self.db.pods.find_one( {"name": self.json_args.get("pod_name")}) if mongo_dict is None: raise HTTPError(HTTP_NOT_FOUND, -- cgit 1.2.3-korg