test_07_api_project.py 10 KB

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