add unittests of project & refactor response
[releng.git] / utils / test / result_collection_api / tests / unit / test_base.py
1 import json
2 from tornado.web import Application
3 from tornado.testing import AsyncHTTPTestCase
4
5 from resources.handlers import VersionHandler, PodHandler, \
6     TestProjectHandler, TestCasesHandler, TestResultsHandler, DashboardHandler
7 from resources.models import CreateResponse
8 import fake_pymongo
9
10
11 class TestBase(AsyncHTTPTestCase):
12     headers = {'Content-Type': 'application/json; charset=UTF-8'}
13
14     def setUp(self):
15         self.basePath = ''
16         self.create_res = CreateResponse
17         self.get_res = None
18         self.list_res = None
19         self.update_res = None
20         self.req_d = None
21         self.req_e = None
22         self.addCleanup(self._clear)
23         super(TestBase, self).setUp()
24
25     def get_app(self):
26         return Application(
27             [
28                 (r"/version", VersionHandler),
29                 (r"/pods", PodHandler),
30                 (r"/pods/([^/]+)", PodHandler),
31                 (r"/projects", TestProjectHandler),
32                 (r"/projects/([^/]+)", TestProjectHandler),
33                 (r"/projects/([^/]+)/cases", TestCasesHandler),
34                 (r"/projects/([^/]+)/cases/([^/]+)", TestCasesHandler),
35                 (r"/results", TestResultsHandler),
36                 (r"/results([^/]*)", TestResultsHandler),
37                 (r"/results/([^/]*)", TestResultsHandler),
38                 (r"/dashboard", DashboardHandler),
39                 (r"/dashboard([^/]*)", DashboardHandler),
40                 (r"/dashboard/([^/]*)", DashboardHandler),
41             ],
42             db=fake_pymongo,
43             debug=True,
44         )
45
46     def create_d(self):
47         return self.create(self.req_d)
48
49     def create_e(self):
50         return self.create(self.req_e)
51
52     def create(self, req=None):
53         if req:
54             req = req.format()
55
56         res = self.fetch(self.basePath,
57                          method='POST',
58                          body=json.dumps(req),
59                          headers=self.headers)
60
61         return self._get_return(res, self.create_res)
62
63     def get(self, item=None):
64         res = self.fetch(self._get_uri(item),
65                          method='GET',
66                          headers=self.headers)
67
68         def inner():
69             return self.get_res if item else self.list_res
70         return self._get_return(res, inner())
71
72     def update(self, item, new=None):
73         if new:
74             new = new.format()
75         res = self.fetch(self._get_uri(item),
76                          method='PUT',
77                          body=json.dumps(new),
78                          headers=self.headers)
79         return self._get_return(res, self.update_res)
80
81     def delete(self, item):
82         res = self.fetch(self._get_uri(item),
83                          method='DELETE',
84                          headers=self.headers)
85         return res.code
86
87     def _get_uri(self, item=None):
88         uri = self.basePath
89         if item:
90             uri += '/{}'.format(item)
91         return uri
92
93     def _get_return(self, res, cls):
94         code = res.code
95         body = res.body
96         return code, self._get_return_body(code, body, cls)
97
98     @staticmethod
99     def _get_return_body(code, body, cls):
100         return cls.from_dict(json.loads(body)) if code < 300 else body
101
102     def assert_create_body(self, body, req=None):
103         print(body.href)
104         if not req:
105             req = self.req_d
106         self.assertIn(self._get_uri(req.name), body.href)
107
108     @staticmethod
109     def _clear():
110         fake_pymongo.pods.clear()
111         fake_pymongo.projects.clear()
112         fake_pymongo.test_cases.clear()
113         fake_pymongo.test_results.clear()