test_07_api_project.py 10.0 KB

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