test_07_api_project.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. # -*- coding: utf-8 -*-
  2. """Test Apis."""
  3. import urllib
  4. import json
  5. import pytest
  6. from flask import current_app
  7. from utils import *
  8. @pytest.mark.usefixtures('db')
  9. class TestApiProject:
  10. """api role testing"""
  11. uri_prefix = '/api/project'
  12. server_id = {}
  13. project_data = {
  14. "environment_id": 1,
  15. "space_id": 1,
  16. "excludes": u"*.log",
  17. "keep_version_num": 11,
  18. "name": u"walden-瓦尔登",
  19. "post_deploy": u"echo post_deploy",
  20. "post_release": u"echo post_release",
  21. "prev_deploy": u"echo prev_deploy",
  22. "prev_release": u"echo prev_release",
  23. "repo_mode": u"branch",
  24. "repo_password": u"",
  25. "repo_url": u"git@github.com:meolu/walle-web.git",
  26. "repo_username": u"",
  27. "server_ids": u"1,2",
  28. "target_releases": u"/tmp/walle/library",
  29. "target_root": u"/tmp/walle/root",
  30. "target_user": u"work",
  31. "target_port": u"22",
  32. "task_vars": u"debug=1;\\napp=auotapp.py",
  33. "user_id": 1,
  34. }
  35. project_data_members = [
  36. {"user_id": 1, "role": "MASTER"},
  37. {"user_id": 2, "role": "DEVELOPER"}
  38. ]
  39. # should be equal to project_data_2.name
  40. project_name_2 = u'walle-web'
  41. project_data_2 = {
  42. "environment_id": 2,
  43. "space_id": 1,
  44. "excludes": u"*.log",
  45. "keep_version_num": 10,
  46. "name": u"walle-web",
  47. "post_deploy": u"echo post_deploy",
  48. "post_release": u"echo post_release",
  49. "prev_deploy": u"echo prev_deploy",
  50. "prev_release": u"echo prev_release",
  51. "repo_mode": u"branch",
  52. "repo_password": u"",
  53. "repo_url": u"git@github.com:meolu/walle-web.git",
  54. "repo_username": u"",
  55. "server_ids": u"1,2",
  56. "target_releases": u"/tmp/walle/library",
  57. "target_root": u"/tmp/walle/root",
  58. "target_user": u"work",
  59. "target_port": u"22",
  60. "task_vars": u"debug=1;\\napp=auotapp.py",
  61. "user_id": 1
  62. }
  63. project_data_2_update = {
  64. "environment_id": 1,
  65. "space_id": 1,
  66. "excludes": u"*.log",
  67. "keep_version_num": 11,
  68. "name": u"walle-web to walden edit",
  69. "post_deploy": u"echo post_deploy; pwd",
  70. "post_release": u"echo post_release; pwd",
  71. "prev_deploy": u"echo prev_deploy; pwd",
  72. "prev_release": u"echo prev_release; pwd",
  73. "repo_mode": u"tag",
  74. "repo_password": u"",
  75. "repo_url": u"git@github.com:meolu/walden.git",
  76. "repo_username": u"",
  77. "server_ids": u"1,2",
  78. "target_releases": u"/tmp/walden/library",
  79. "target_root": u"/tmp/walden/root",
  80. "target_user": u"work",
  81. "target_port": u"22",
  82. "task_vars": u"debug=1;\\napp=auotapp.py; project=walden",
  83. "user_id": 1
  84. }
  85. project_data_remove = {
  86. 'name': u'this server will be deleted soon',
  87. "environment_id": 1,
  88. "space_id": 1,
  89. "excludes": u"*.log",
  90. "keep_version_num": 11,
  91. "post_deploy": u"echo post_deploy",
  92. "post_release": u"echo post_release",
  93. "prev_deploy": u"echo prev_deploy",
  94. "prev_release": u"echo prev_release",
  95. "repo_mode": u"branch",
  96. "repo_password": u"",
  97. "repo_url": u"git@github.com:meolu/walle-web.git",
  98. "repo_username": u"",
  99. "server_ids": u"1,2",
  100. "target_releases": u"/tmp/walle/library",
  101. "target_root": u"/tmp/walle/root",
  102. "target_user": u"work",
  103. "target_port": u"22",
  104. "task_vars": u"debug=1;\\napp=auotapp.py",
  105. "user_id": 1
  106. }
  107. def test_create(self, user, testapp, client, db):
  108. """create successful."""
  109. # 1. create another project
  110. project_data = dict(self.project_data, **dict({'members': json.dumps(self.project_data_members)}))
  111. resp = client.post('%s/' % (self.uri_prefix), data=project_data)
  112. response_success(resp)
  113. self.project_compare_req_resp(self.project_data, resp)
  114. self.project_data['id'] = resp_json(resp)['data']['id']
  115. # 2. create another project
  116. resp = client.post('%s/' % (self.uri_prefix), data=self.project_data_2)
  117. response_success(resp)
  118. self.project_compare_req_resp(self.project_data_2, resp)
  119. self.project_data_2['id'] = resp_json(resp)['data']['id']
  120. def test_one(self, user, testapp, client, db):
  121. """item successful."""
  122. # Goes to homepage
  123. resp = client.get('%s/%d' % (self.uri_prefix, self.project_data['id']))
  124. response_success(resp)
  125. self.project_compare_req_resp(self.project_data, resp)
  126. def test_get_list_page_size(self, user, testapp, client):
  127. """test list should create 2 users at least, due to test pagination, searching."""
  128. query = {
  129. 'page': 1,
  130. 'size': 1,
  131. }
  132. response = {
  133. 'count': 2,
  134. }
  135. resp = client.get('%s/?%s' % (self.uri_prefix, urllib.urlencode(query)))
  136. response_success(resp)
  137. resp_dict = resp_json(resp)
  138. self.project_compare_in(self.project_data_2, resp_dict['data']['list'].pop())
  139. self.project_compare_req_resp(response, resp)
  140. def test_get_list_query(self, user, testapp, client):
  141. """test list should create 2 users at least, due to test pagination, searching."""
  142. query = {
  143. 'page': 1,
  144. 'size': 1,
  145. 'kw': self.project_name_2
  146. }
  147. response = {
  148. 'count': 1,
  149. }
  150. resp = client.get('%s/?%s' % (self.uri_prefix, urllib.urlencode(query)))
  151. response_success(resp)
  152. resp_dict = resp_json(resp)
  153. self.project_compare_in(self.project_data_2, resp_dict['data']['list'].pop())
  154. self.project_compare_req_resp(response, resp)
  155. def test_get_update(self, user, testapp, client):
  156. """Login successful."""
  157. # 1.update
  158. resp = client.put('%s/%d' % (self.uri_prefix, self.project_data_2['id']), data=self.project_data_2_update)
  159. response_success(resp)
  160. self.project_compare_req_resp(self.project_data_2_update, resp)
  161. # 3.get it
  162. resp = client.get('%s/%d' % (self.uri_prefix, self.project_data_2['id']))
  163. response_success(resp)
  164. self.project_compare_req_resp(self.project_data_2_update, resp)
  165. def test_get_update_members(self, user, testapp, client):
  166. """Login successful."""
  167. # 1.1 create user group
  168. headers = {'content-type': 'application/json'}
  169. resp = client.put('%s/%d/members' % (self.uri_prefix, self.project_data_2['id']), data=json.dumps(self.project_data_members), headers=headers)
  170. current_app.logger.info(resp)
  171. response_success(resp)
  172. current_app.logger.info(resp_json(resp)['data'])
  173. self.project_data_2_update['members'] = json.dumps(self.project_data_members)
  174. self.compare_member_req_resp(self.project_data_2_update, resp)
  175. # # 1.update
  176. # resp = client.put('%s/%d/members' % (self.uri_prefix, self.project_data_2['id']), data=self.project_data_2_update)
  177. #
  178. # response_success(resp)
  179. # self.project_compare_req_resp(self.project_data_2_update, resp)
  180. # 3.get it
  181. resp = client.get('%s/%d' % (self.uri_prefix, self.project_data_2['id']))
  182. response_success(resp)
  183. self.compare_member_req_resp(self.project_data_2_update, resp)
  184. def test_get_remove(self, user, testapp, client):
  185. """Login successful."""
  186. # 1.create another role
  187. resp = client.post('%s/' % (self.uri_prefix), data=self.project_data_remove)
  188. project_id = resp_json(resp)['data']['id']
  189. response_success(resp)
  190. # 2.delete
  191. resp = client.delete('%s/%d' % (self.uri_prefix, project_id))
  192. response_success(resp)
  193. # 3.get it
  194. resp = client.get('%s/%d' % (self.uri_prefix, project_id))
  195. response_error(resp)
  196. def get_list_ids(self, projectOrigin):
  197. group_list = projectOrigin.copy()
  198. group_list['user_ids'] = map(int, projectOrigin['user_ids'].split(','))
  199. return group_list
  200. def project_compare_req_resp(self, req_obj, resp):
  201. """
  202. there is some thing difference in project api
  203. such as server_ids
  204. :param resp:
  205. :return:
  206. """
  207. resp_obj = resp_json(resp)['data']
  208. servers = []
  209. if resp_obj.has_key('server_info'):
  210. for server in resp_obj['server_info']:
  211. servers.append(str(server['id']))
  212. self.project_compare_in(req_obj, resp_obj)
  213. def project_compare_in(self, req_obj, resp_obj):
  214. for k, v in req_obj.items():
  215. assert k in resp_obj.keys(), 'Key %r not in response (keys are %r)' % (k, resp_obj.keys())
  216. assert resp_obj[k] == v, 'Value for key %r should be %r but is %r' % (k, v, resp_obj[k])
  217. def compare_member_req_resp(self, request, response):
  218. for user_response in resp_json(response)['data']['members']:
  219. for user_request in json.loads(request['members']):
  220. if user_request['user_id'] == user_response['user_id']:
  221. assert user_request['role'] == user_response['role']