test_00_base.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. # -*- coding: utf-8 -*-
  2. """Model unit tests."""
  3. from copy import deepcopy
  4. import pytest
  5. from flask import current_app
  6. from walle.model.menu import MenuModel
  7. from walle.model.user import UserModel
  8. from walle.service.rbac.role import *
  9. from werkzeug.security import generate_password_hash
  10. from .utils import *
  11. #: 1 创建 super, owner
  12. #: 2 登录 super
  13. #: 3 创建 space, users
  14. #: 4 登录 owner
  15. user_super = {
  16. 'username': u'super',
  17. 'email': u'Super@walle-web.io',
  18. 'password': u'WU123shuiyong',
  19. }
  20. user_owner = {
  21. 'username': u'owner',
  22. 'email': u'Owner@walle-web.io',
  23. 'password': u'WU123shuiyong',
  24. }
  25. user_data_login = user_owner
  26. space_base = {
  27. 'name': u'walle-2.0',
  28. 'user_id': 1,
  29. }
  30. @pytest.mark.usefixtures('db')
  31. class TestFoo:
  32. """User tests."""
  33. def test_get_by_id(self):
  34. """Get user by ID."""
  35. pass
  36. # user = Foo(username='testuser', email='wushuiyong@mail.com')
  37. # user.save()
  38. # print(user.id)
  39. #
  40. # retrieved = Foo.get_by_id(user.id)
  41. # assert retrieved == user
  42. class TestAccess:
  43. def from_data(self):
  44. return []
  45. def test_add(self):
  46. access_list = [
  47. {
  48. "archive": 0,
  49. "created_at": u"2017-06-11 23:11:38",
  50. "url": u"xx.yy.zz",
  51. "visible": 1,
  52. "icon": u"leaf",
  53. "id": 1,
  54. "name_cn": u"用户中心",
  55. "name_en": u"",
  56. "pid": 0,
  57. "sequence": 10001,
  58. "type": u"module",
  59. "updated_at": u"2017-06-12 00:15:29"
  60. },
  61. {
  62. "archive": 0,
  63. "created_at": u"2017-06-11 23:11:52",
  64. "url": u"xx.yy.zz",
  65. "visible": 1,
  66. "icon": u"leaf",
  67. "id": 2,
  68. "name_cn": u"配置中心",
  69. "name_en": u"",
  70. "pid": 0,
  71. "sequence": 10002,
  72. "type": u"module",
  73. "updated_at": u"2017-06-12 00:15:29"
  74. },
  75. {
  76. "archive": 0,
  77. "created_at": u"2017-06-11 23:12:45",
  78. "url": u"xx.yy.zz",
  79. "visible": 1,
  80. "icon": u"leaf",
  81. "id": 3,
  82. "name_cn": u"上线单",
  83. "name_en": u"",
  84. "pid": 0,
  85. "sequence": 10003,
  86. "type": u"module",
  87. "updated_at": u"2017-06-12 00:15:29"
  88. },
  89. {
  90. "archive": 0,
  91. "created_at": u"2017-06-11 23:13:51",
  92. "url": u"xx.yy.zz",
  93. "visible": 1,
  94. "icon": u"leaf",
  95. "id": 11,
  96. "name_cn": u"用户管理",
  97. "name_en": u"user",
  98. "pid": 1,
  99. "sequence": 10101,
  100. "type": u"controller",
  101. "updated_at": u"2017-06-14 10:42:45"
  102. },
  103. {
  104. "archive": 0,
  105. "created_at": u"2017-06-11 23:14:11",
  106. "url": u"xx.yy.zz",
  107. "visible": 1,
  108. "icon": u"leaf",
  109. "id": 12,
  110. "name_cn": u"用户组",
  111. "name_en": u"group",
  112. "pid": 1,
  113. "sequence": 10102,
  114. "type": u"controller",
  115. "updated_at": u"2017-06-14 10:42:48"
  116. },
  117. {
  118. "archive": 0,
  119. "created_at": u"2017-06-11 23:14:44",
  120. "url": u"xx.yy.zz",
  121. "visible": 1,
  122. "icon": u"leaf",
  123. "id": 13,
  124. "name_cn": u"角色",
  125. "name_en": u"role",
  126. "pid": 1,
  127. "sequence": 10103,
  128. "type": u"controller",
  129. "updated_at": u"2017-06-14 10:42:52"
  130. },
  131. {
  132. "archive": 0,
  133. "created_at": u"2017-06-11 23:15:30",
  134. "url": u"xx.yy.zz",
  135. "visible": 1,
  136. "icon": u"leaf",
  137. "id": 14,
  138. "name_cn": u"环境管理",
  139. "name_en": u"environment",
  140. "pid": 2,
  141. "sequence": 10201,
  142. "type": u"controller",
  143. "updated_at": u"2017-06-14 10:42:58"
  144. },
  145. {
  146. "archive": 0,
  147. "created_at": u"2017-06-11 23:15:51",
  148. "url": u"xx.yy.zz",
  149. "visible": 1,
  150. "icon": u"leaf",
  151. "id": 15,
  152. "name_cn": u"服务器管理",
  153. "name_en": u"server",
  154. "pid": 2,
  155. "sequence": 10202,
  156. "type": u"controller",
  157. "updated_at": u"2017-06-14 10:43:01"
  158. },
  159. {
  160. "archive": 0,
  161. "created_at": u"2017-06-11 23:16:18",
  162. "url": u"xx.yy.zz",
  163. "visible": 1,
  164. "icon": u"leaf",
  165. "id": 16,
  166. "name_cn": u"项目管理",
  167. "name_en": u"project",
  168. "pid": 2,
  169. "sequence": 10203,
  170. "type": u"controller",
  171. "updated_at": u"2017-06-14 10:43:07"
  172. },
  173. {
  174. "archive": 0,
  175. "created_at": u"2017-06-11 23:17:12",
  176. "url": u"xx.yy.zz",
  177. "visible": 1,
  178. "icon": u"leaf",
  179. "id": 101,
  180. "name_cn": u"查看",
  181. "name_en": u"get",
  182. "pid": 11,
  183. "sequence": 11101,
  184. "type": u"action",
  185. "updated_at": u"2017-06-14 10:43:09"
  186. },
  187. {
  188. "archive": 0,
  189. "created_at": u"2017-06-11 23:17:26",
  190. "url": u"xx.yy.zz",
  191. "visible": 1,
  192. "icon": u"leaf",
  193. "id": 102,
  194. "name_cn": u"修改",
  195. "name_en": u"put",
  196. "pid": 11,
  197. "sequence": 11102,
  198. "type": u"action",
  199. "updated_at": u"2017-06-14 10:43:17"
  200. },
  201. {
  202. "archive": 0,
  203. "created_at": u"2017-06-11 23:17:59",
  204. "url": u"xx.yy.zz",
  205. "visible": 1,
  206. "icon": u"leaf",
  207. "id": 103,
  208. "name_cn": u"新增",
  209. "name_en": u"post",
  210. "pid": 11,
  211. "sequence": 11103,
  212. "type": u"action",
  213. "updated_at": u"2017-06-14 10:43:19"
  214. },
  215. {
  216. "archive": 0,
  217. "created_at": u"2017-06-11 23:18:16",
  218. "url": u"xx.yy.zz",
  219. "visible": 1,
  220. "icon": u"leaf",
  221. "id": 104,
  222. "name_cn": u"删除",
  223. "name_en": u"delete",
  224. "pid": 11,
  225. "sequence": 11104,
  226. "type": u"action",
  227. "updated_at": u"2017-06-14 10:43:35"
  228. },
  229. {
  230. "archive": 0,
  231. "created_at": u"2017-06-19 08:14:56",
  232. "url": u"xx.yy.zz",
  233. "visible": 1,
  234. "icon": u"leaf",
  235. "id": 105,
  236. "name_cn": u"查看",
  237. "name_en": u"get",
  238. "pid": 12,
  239. "sequence": 11201,
  240. "type": u"action",
  241. "updated_at": u"2017-06-19 08:14:56"
  242. },
  243. {
  244. "archive": 0,
  245. "created_at": u"2017-06-19 08:14:56",
  246. "url": u"xx.yy.zz",
  247. "visible": 1,
  248. "icon": u"leaf",
  249. "id": 106,
  250. "name_cn": u"修改",
  251. "name_en": u"put",
  252. "pid": 12,
  253. "sequence": 11202,
  254. "type": u"action",
  255. "updated_at": u"2017-06-19 08:14:56"
  256. },
  257. {
  258. "archive": 0,
  259. "created_at": u"2017-06-19 08:14:56",
  260. "url": u"xx.yy.zz",
  261. "visible": 1,
  262. "icon": u"leaf",
  263. "id": 107,
  264. "name_cn": u"新增",
  265. "name_en": u"post",
  266. "pid": 12,
  267. "sequence": 11203,
  268. "type": u"action",
  269. "updated_at": u"2017-06-19 08:14:56"
  270. },
  271. {
  272. "archive": 0,
  273. "created_at": u"2017-06-19 08:14:56",
  274. "url": u"xx.yy.zz",
  275. "visible": 1,
  276. "icon": u"leaf",
  277. "id": 108,
  278. "name_cn": u"删除",
  279. "name_en": u"delete",
  280. "pid": 12,
  281. "sequence": 11204,
  282. "type": u"action",
  283. "updated_at": u"2017-06-19 08:14:56"
  284. },
  285. {
  286. "archive": 0,
  287. "created_at": u"2017-06-19 08:15:22",
  288. "url": u"xx.yy.zz",
  289. "visible": 1,
  290. "icon": u"leaf",
  291. "id": 109,
  292. "name_cn": u"查看",
  293. "name_en": u"get",
  294. "pid": 13,
  295. "sequence": 11301,
  296. "type": u"action",
  297. "updated_at": u"2017-06-19 08:15:22"
  298. },
  299. {
  300. "archive": 0,
  301. "created_at": u"2017-06-19 08:15:22",
  302. "url": u"xx.yy.zz",
  303. "visible": 1,
  304. "icon": u"leaf",
  305. "id": 110,
  306. "name_cn": u"修改",
  307. "name_en": u"put",
  308. "pid": 13,
  309. "sequence": 11302,
  310. "type": u"action",
  311. "updated_at": u"2017-06-19 08:15:22"
  312. },
  313. {
  314. "archive": 0,
  315. "created_at": u"2017-06-19 08:15:22",
  316. "url": u"xx.yy.zz",
  317. "visible": 1,
  318. "icon": u"leaf",
  319. "id": 111,
  320. "name_cn": u"新增",
  321. "name_en": u"post",
  322. "pid": 13,
  323. "sequence": 11303,
  324. "type": u"action",
  325. "updated_at": u"2017-06-19 08:15:22"
  326. },
  327. {
  328. "archive": 0,
  329. "created_at": u"2017-06-19 08:15:22",
  330. "url": u"xx.yy.zz",
  331. "visible": 1,
  332. "icon": u"leaf",
  333. "id": 112,
  334. "name_cn": u"删除",
  335. "name_en": u"delete",
  336. "pid": 13,
  337. "sequence": 11304,
  338. "type": u"action",
  339. "updated_at": u"2017-06-19 08:15:22"
  340. },
  341. {
  342. "archive": 0,
  343. "created_at": u"2017-06-19 08:15:40",
  344. "url": u"xx.yy.zz",
  345. "visible": 1,
  346. "icon": u"leaf",
  347. "id": 113,
  348. "name_cn": u"查看",
  349. "name_en": u"get",
  350. "pid": 14,
  351. "sequence": 11401,
  352. "type": u"action",
  353. "updated_at": u"2017-06-19 08:15:40"
  354. },
  355. {
  356. "archive": 0,
  357. "created_at": u"2017-06-19 08:15:40",
  358. "url": u"xx.yy.zz",
  359. "visible": 1,
  360. "icon": u"leaf",
  361. "id": 114,
  362. "name_cn": u"修改",
  363. "name_en": u"put",
  364. "pid": 14,
  365. "sequence": 11402,
  366. "type": u"action",
  367. "updated_at": u"2017-06-19 08:15:40"
  368. },
  369. {
  370. "archive": 0,
  371. "created_at": u"2017-06-19 08:15:40",
  372. "url": u"xx.yy.zz",
  373. "visible": 1,
  374. "icon": u"leaf",
  375. "id": 115,
  376. "name_cn": u"新增",
  377. "name_en": u"post",
  378. "pid": 14,
  379. "sequence": 11403,
  380. "type": u"action",
  381. "updated_at": u"2017-06-19 08:15:40"
  382. },
  383. {
  384. "archive": 0,
  385. "created_at": u"2017-06-19 08:15:40",
  386. "url": u"xx.yy.zz",
  387. "visible": 1,
  388. "icon": u"leaf",
  389. "id": 116,
  390. "name_cn": u"删除",
  391. "name_en": u"delete",
  392. "pid": 14,
  393. "sequence": 11404,
  394. "type": u"action",
  395. "updated_at": u"2017-06-19 08:15:40"
  396. },
  397. {
  398. "archive": 0,
  399. "created_at": u"2017-06-19 08:16:21",
  400. "url": u"xx.yy.zz",
  401. "visible": 1,
  402. "icon": u"leaf",
  403. "id": 117,
  404. "name_cn": u"查看",
  405. "name_en": u"get",
  406. "pid": 15,
  407. "sequence": 11501,
  408. "type": u"action",
  409. "updated_at": u"2017-06-19 08:16:21"
  410. },
  411. {
  412. "archive": 0,
  413. "created_at": u"2017-06-19 08:16:21",
  414. "url": u"xx.yy.zz",
  415. "visible": 1,
  416. "icon": u"leaf",
  417. "id": 118,
  418. "name_cn": u"修改",
  419. "name_en": u"put",
  420. "pid": 15,
  421. "sequence": 11502,
  422. "type": u"action",
  423. "updated_at": u"2017-06-19 08:16:21"
  424. },
  425. {
  426. "archive": 0,
  427. "created_at": u"2017-06-19 08:16:21",
  428. "url": u"xx.yy.zz",
  429. "visible": 1,
  430. "icon": u"leaf",
  431. "id": 119,
  432. "name_cn": u"新增",
  433. "name_en": u"post",
  434. "pid": 15,
  435. "sequence": 11503,
  436. "type": u"action",
  437. "updated_at": u"2017-06-19 08:16:21"
  438. },
  439. {
  440. "archive": 0,
  441. "created_at": u"2017-06-19 08:16:21",
  442. "url": u"xx.yy.zz",
  443. "visible": 1,
  444. "icon": u"leaf",
  445. "id": 120,
  446. "name_cn": u"删除",
  447. "name_en": u"delete",
  448. "pid": 15,
  449. "sequence": 11504,
  450. "type": u"action",
  451. "updated_at": u"2017-06-19 08:16:21"
  452. },
  453. {
  454. "archive": 0,
  455. "created_at": u"2017-06-19 08:16:42",
  456. "url": u"xx.yy.zz",
  457. "visible": 1,
  458. "icon": u"leaf",
  459. "id": 121,
  460. "name_cn": u"查看",
  461. "name_en": u"get",
  462. "pid": 16,
  463. "sequence": 11601,
  464. "type": u"action",
  465. "updated_at": u"2017-06-19 08:16:42"
  466. },
  467. {
  468. "archive": 0,
  469. "created_at": u"2017-06-19 08:16:42",
  470. "url": u"xx.yy.zz",
  471. "visible": 1,
  472. "icon": u"leaf",
  473. "id": 122,
  474. "name_cn": u"修改",
  475. "name_en": u"put",
  476. "pid": 16,
  477. "sequence": 11602,
  478. "type": u"action",
  479. "updated_at": u"2017-06-19 08:16:42"
  480. },
  481. {
  482. "archive": 0,
  483. "created_at": u"2017-06-19 08:16:42",
  484. "url": u"xx.yy.zz",
  485. "visible": 1,
  486. "icon": u"leaf",
  487. "id": 123,
  488. "name_cn": u"新增",
  489. "name_en": u"post",
  490. "pid": 16,
  491. "sequence": 11603,
  492. "type": u"action",
  493. "updated_at": u"2017-06-19 08:16:42"
  494. },
  495. {
  496. "archive": 0,
  497. "created_at": u"2017-06-19 08:16:42",
  498. "url": u"xx.yy.zz",
  499. "visible": 1,
  500. "icon": u"leaf",
  501. "id": 124,
  502. "name_cn": u"删除",
  503. "name_en": u"delete",
  504. "pid": 16,
  505. "sequence": 11604,
  506. "type": u"action",
  507. "updated_at": u"2017-06-19 08:16:42"
  508. }
  509. ]
  510. for asscess_data in access_list:
  511. access = MenuModel(
  512. id=asscess_data['id'],
  513. name_cn=asscess_data['name_cn'],
  514. name_en=asscess_data['name_en'],
  515. pid=asscess_data['pid'],
  516. type=asscess_data['type'],
  517. sequence=asscess_data['sequence'],
  518. archive=asscess_data['archive'],
  519. icon=asscess_data['icon'],
  520. url=asscess_data['url'],
  521. visible=asscess_data['visible']
  522. )
  523. access.save()
  524. #: 1 创建 super, owner
  525. class TestUser:
  526. user_super_login = deepcopy(user_super)
  527. user_owner_login = deepcopy(user_owner)
  528. def test_add_super(self):
  529. self.user_super_login['role'] = SUPER
  530. self.user_super_login['password'] = generate_password_hash(self.user_super_login['password'])
  531. user = UserModel(**self.user_super_login)
  532. user.save()
  533. def test_add_owner(self):
  534. self.user_owner_login['role'] = OWNER
  535. self.user_owner_login['password'] = generate_password_hash(self.user_owner_login['password'])
  536. user = UserModel(**self.user_owner_login)
  537. user.save()
  538. #: 2 登录 super
  539. @pytest.mark.usefixtures('db')
  540. class TestApiPassport:
  541. """api role testing"""
  542. uri_prefix = '/api/passport'
  543. user_id = {}
  544. user_data = deepcopy(user_super)
  545. def test_base_fetch(self):
  546. u = UserModel.get_by_id(1)
  547. def test_login_super(self, user, testapp, client, db):
  548. """create successful."""
  549. resp = client.post('%s/login' % (self.uri_prefix), data=self.user_data)
  550. response_success(resp)
  551. del self.user_data['password']
  552. compare_req_resp(self.user_data, resp)
  553. #: 3 创建 space, users
  554. @pytest.mark.usefixtures('db')
  555. class TestApiSpaceInit:
  556. """api role testing"""
  557. uri_prefix = '/api/space'
  558. user_id = {}
  559. #: user list (1, 2, 3)
  560. space_data = {
  561. 'name': u'walle-web 2.0',
  562. 'user_id': 2,
  563. }
  564. def test_base_create_space(self, user, testapp, client, db):
  565. """create successful."""
  566. # 1.create project
  567. resp = client.post('%s/' % (self.uri_prefix), data=self.space_data)
  568. response_success(resp)
  569. # compare_req_resp(self.space_data, resp)
  570. current_app.logger.info(resp_json(resp)['data'])
  571. self.space_data['space_id'] = resp_json(resp)['data']['id']