test_pagure_flask_api_group.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2017-2018 - Copyright Red Hat Inc
  4. Authors:
  5. Matt Prahl <mprahl@redhat.com>
  6. Pierre-Yves Chibon <pingou@pingoured.fr>
  7. """
  8. from __future__ import unicode_literals, absolute_import
  9. import unittest
  10. import sys
  11. import os
  12. import json
  13. sys.path.insert(
  14. 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
  15. )
  16. import pagure.api
  17. import pagure.lib.query
  18. import tests
  19. class PagureFlaskApiGroupTests(tests.SimplePagureTest):
  20. """ Tests for the flask API of pagure for issue """
  21. maxDiff = None
  22. def setUp(self):
  23. """ Set up the environnment, ran before every tests. """
  24. super(PagureFlaskApiGroupTests, self).setUp()
  25. pagure.config.config["REQUESTS_FOLDER"] = None
  26. msg = pagure.lib.query.add_group(
  27. self.session,
  28. group_name="some_group",
  29. display_name="Some Group",
  30. description=None,
  31. group_type="bar",
  32. user="pingou",
  33. is_admin=False,
  34. blacklist=[],
  35. )
  36. self.session.commit()
  37. tests.create_projects(self.session)
  38. project = pagure.lib.query._get_project(self.session, "test2")
  39. msg = pagure.lib.query.add_group_to_project(
  40. session=self.session,
  41. project=project,
  42. new_group="some_group",
  43. user="pingou",
  44. )
  45. self.session.commit()
  46. self.assertEqual(msg, "Group added")
  47. def test_api_groups(self):
  48. """ Test the api_groups function. """
  49. # Add a couple of groups so that we can list them
  50. item = pagure.lib.model.PagureGroup(
  51. group_name="group1",
  52. group_type="user",
  53. display_name="User group",
  54. user_id=1, # pingou
  55. )
  56. self.session.add(item)
  57. item = pagure.lib.model.PagureGroup(
  58. group_name="rel-eng",
  59. group_type="user",
  60. display_name="Release engineering group",
  61. user_id=1, # pingou
  62. )
  63. self.session.add(item)
  64. self.session.commit()
  65. output = self.app.get("/api/0/groups")
  66. self.assertEqual(output.status_code, 200)
  67. data = json.loads(output.get_data(as_text=True))
  68. self.assertEqual(data["groups"], ["group1", "rel-eng", "some_group"])
  69. self.assertEqual(
  70. sorted(data.keys()), ["groups", "pagination", "total_groups"]
  71. )
  72. self.assertEqual(data["total_groups"], 3)
  73. output = self.app.get("/api/0/groups?pattern=re")
  74. self.assertEqual(output.status_code, 200)
  75. data = json.loads(output.get_data(as_text=True))
  76. self.assertEqual(data["groups"], ["rel-eng"])
  77. self.assertEqual(
  78. sorted(data.keys()), ["groups", "pagination", "total_groups"]
  79. )
  80. self.assertEqual(data["total_groups"], 1)
  81. def test_api_groups_extended(self):
  82. """ Test the api_groups function. """
  83. # Add a couple of groups so that we can list them
  84. item = pagure.lib.model.PagureGroup(
  85. group_name="group1",
  86. group_type="user",
  87. display_name="User group",
  88. user_id=1, # pingou
  89. )
  90. self.session.add(item)
  91. item = pagure.lib.model.PagureGroup(
  92. group_name="rel-eng",
  93. group_type="user",
  94. display_name="Release engineering group",
  95. user_id=1, # pingou
  96. )
  97. self.session.add(item)
  98. self.session.commit()
  99. output = self.app.get("/api/0/groups?extended=1")
  100. self.assertEqual(output.status_code, 200)
  101. data = json.loads(output.get_data(as_text=True))
  102. for k in ["first", "last"]:
  103. self.assertIsNotNone(data["pagination"][k])
  104. data["pagination"][k] = "http://localhost..."
  105. self.assertEqual(
  106. data,
  107. {
  108. "groups": [
  109. {"description": None, "name": "group1"},
  110. {"description": None, "name": "rel-eng"},
  111. {"description": None, "name": "some_group"},
  112. ],
  113. "pagination": {
  114. "first": "http://localhost...",
  115. "last": "http://localhost...",
  116. "next": None,
  117. "page": 1,
  118. "pages": 1,
  119. "per_page": 20,
  120. "prev": None,
  121. },
  122. "total_groups": 3,
  123. },
  124. )
  125. def test_api_view_group_authenticated(self):
  126. """
  127. Test the api_view_group method of the flask api with an
  128. authenticated user. The tested group has one member.
  129. """
  130. tests.create_tokens(self.session)
  131. headers = {"Authorization": "token aaabbbcccddd"}
  132. output = self.app.get("/api/0/group/some_group", headers=headers)
  133. self.assertEqual(output.status_code, 200)
  134. exp = {
  135. "display_name": "Some Group",
  136. "full_url": "http://localhost.localdomain/group/some_group",
  137. "description": None,
  138. "creator": {
  139. "fullname": "PY C",
  140. "full_url": "http://localhost.localdomain/user/pingou",
  141. "url_path": "user/pingou",
  142. "default_email": "bar@pingou.com",
  143. "emails": ["bar@pingou.com", "foo@pingou.com"],
  144. "name": "pingou",
  145. },
  146. "members": ["pingou"],
  147. "date_created": "1492020239",
  148. "group_type": "user",
  149. "name": "some_group",
  150. }
  151. data = json.loads(output.get_data(as_text=True))
  152. data["date_created"] = "1492020239"
  153. self.assertDictEqual(data, exp)
  154. def test_api_view_group_unauthenticated(self):
  155. """
  156. Test the api_view_group method of the flask api with an
  157. unauthenticated user. The tested group has one member.
  158. """
  159. output = self.app.get("/api/0/group/some_group")
  160. self.assertEqual(output.status_code, 200)
  161. exp = {
  162. "display_name": "Some Group",
  163. "full_url": "http://localhost.localdomain/group/some_group",
  164. "description": None,
  165. "creator": {
  166. "fullname": "PY C",
  167. "full_url": "http://localhost.localdomain/user/pingou",
  168. "name": "pingou",
  169. "url_path": "user/pingou",
  170. },
  171. "members": ["pingou"],
  172. "date_created": "1492020239",
  173. "group_type": "user",
  174. "name": "some_group",
  175. }
  176. data = json.loads(output.get_data(as_text=True))
  177. data["date_created"] = "1492020239"
  178. self.assertDictEqual(data, exp)
  179. def test_api_view_group_two_members_authenticated(self):
  180. """
  181. Test the api_view_group method of the flask api with an
  182. authenticated user. The tested group has two members.
  183. """
  184. user = pagure.lib.model.User(
  185. user="mprahl",
  186. fullname="Matt Prahl",
  187. password="foo",
  188. default_email="mprahl@redhat.com",
  189. )
  190. self.session.add(user)
  191. self.session.commit()
  192. group = pagure.lib.query.search_groups(
  193. self.session, group_name="some_group"
  194. )
  195. result = pagure.lib.query.add_user_to_group(
  196. self.session, user.username, group, user.username, True
  197. )
  198. self.assertEqual(
  199. result, "User `mprahl` added to the group `some_group`."
  200. )
  201. self.session.commit()
  202. tests.create_tokens(self.session)
  203. headers = {"Authorization": "token aaabbbcccddd"}
  204. output = self.app.get("/api/0/group/some_group", headers=headers)
  205. self.assertEqual(output.status_code, 200)
  206. exp = {
  207. "display_name": "Some Group",
  208. "full_url": "http://localhost.localdomain/group/some_group",
  209. "description": None,
  210. "creator": {
  211. "fullname": "PY C",
  212. "full_url": "http://localhost.localdomain/user/pingou",
  213. "default_email": "bar@pingou.com",
  214. "emails": ["bar@pingou.com", "foo@pingou.com"],
  215. "name": "pingou",
  216. "url_path": "user/pingou",
  217. },
  218. "members": ["pingou", "mprahl"],
  219. "date_created": "1492020239",
  220. "group_type": "user",
  221. "name": "some_group",
  222. }
  223. self.maxDiff = None
  224. data = json.loads(output.get_data(as_text=True))
  225. data["date_created"] = "1492020239"
  226. self.assertDictEqual(data, exp)
  227. def test_api_view_group_no_group_error(self):
  228. """
  229. Test the api_view_group method of the flask api
  230. The tested group has one member.
  231. """
  232. output = self.app.get("/api/0/group/some_group3")
  233. self.assertEqual(output.status_code, 404)
  234. data = json.loads(output.get_data(as_text=True))
  235. self.assertEqual(data["error"], "Group not found")
  236. self.assertEqual(data["error_code"], "ENOGROUP")
  237. def test_api_view_group_w_projects_and_acl(self):
  238. """
  239. Test the api_view_group method with project info and restricted
  240. to the admin ACL
  241. """
  242. tests.create_tokens(self.session)
  243. headers = {"Authorization": "token aaabbbcccddd"}
  244. output = self.app.get(
  245. "/api/0/group/some_group?projects=1", headers=headers
  246. )
  247. self.assertEqual(output.status_code, 200)
  248. exp = {
  249. "display_name": "Some Group",
  250. "full_url": "http://localhost.localdomain/group/some_group",
  251. "description": None,
  252. "creator": {
  253. "fullname": "PY C",
  254. "full_url": "http://localhost.localdomain/user/pingou",
  255. "default_email": "bar@pingou.com",
  256. "emails": ["bar@pingou.com", "foo@pingou.com"],
  257. "name": "pingou",
  258. "url_path": "user/pingou",
  259. },
  260. "members": ["pingou"],
  261. "date_created": "1492020239",
  262. "group_type": "user",
  263. "name": "some_group",
  264. "pagination": {
  265. "first": "http://localhost...",
  266. "last": "http://localhost...",
  267. "next": None,
  268. "page": 1,
  269. "pages": 1,
  270. "per_page": 20,
  271. "prev": None,
  272. },
  273. "projects": [
  274. {
  275. "access_groups": {
  276. "admin": ["some_group"],
  277. "collaborator": [],
  278. "commit": [],
  279. "ticket": [],
  280. },
  281. "access_users": {
  282. "admin": [],
  283. "collaborator": [],
  284. "commit": [],
  285. "owner": ["pingou"],
  286. "ticket": [],
  287. },
  288. "close_status": [
  289. "Invalid",
  290. "Insufficient data",
  291. "Fixed",
  292. "Duplicate",
  293. ],
  294. "custom_keys": [],
  295. "date_created": "1492020239",
  296. "date_modified": "1492020239",
  297. "description": "test project #2",
  298. "full_url": "http://localhost.localdomain/test2",
  299. "fullname": "test2",
  300. "id": 2,
  301. "milestones": {},
  302. "name": "test2",
  303. "namespace": None,
  304. "parent": None,
  305. "priorities": {},
  306. "tags": [],
  307. "url_path": "test2",
  308. "user": {
  309. "fullname": "PY C",
  310. "full_url": "http://localhost.localdomain/user/pingou",
  311. "name": "pingou",
  312. "url_path": "user/pingou",
  313. },
  314. }
  315. ],
  316. "total_projects": 1,
  317. }
  318. data = json.loads(output.get_data(as_text=True))
  319. data["date_created"] = "1492020239"
  320. self.assertIsNotNone(data["pagination"]["first"])
  321. data["pagination"]["first"] = "http://localhost..."
  322. self.assertIsNotNone(data["pagination"]["last"])
  323. data["pagination"]["last"] = "http://localhost..."
  324. projects = []
  325. for p in data["projects"]:
  326. p["date_created"] = "1492020239"
  327. p["date_modified"] = "1492020239"
  328. projects.append(p)
  329. data["projects"] = projects
  330. self.assertDictEqual(data, exp)
  331. output = self.app.get(
  332. "/api/0/group/some_group?projects=1&acl=admin", headers=headers
  333. )
  334. data = json.loads(output.get_data(as_text=True))
  335. data["date_created"] = "1492020239"
  336. self.assertIsNotNone(data["pagination"]["first"])
  337. data["pagination"]["first"] = "http://localhost..."
  338. self.assertIsNotNone(data["pagination"]["last"])
  339. data["pagination"]["last"] = "http://localhost..."
  340. projects = []
  341. for p in data["projects"]:
  342. p["date_created"] = "1492020239"
  343. p["date_modified"] = "1492020239"
  344. projects.append(p)
  345. data["projects"] = projects
  346. self.assertDictEqual(data, exp)
  347. def test_api_view_group_w_projects_and_acl_commit(self):
  348. """
  349. Test the api_view_group method with project info and restricted
  350. to the commit ACL
  351. """
  352. output = self.app.get("/api/0/group/some_group?projects=1&acl=commit")
  353. self.assertEqual(output.status_code, 200)
  354. exp = {
  355. "display_name": "Some Group",
  356. "full_url": "http://localhost.localdomain/group/some_group",
  357. "description": None,
  358. "creator": {
  359. "fullname": "PY C",
  360. "full_url": "http://localhost.localdomain/user/pingou",
  361. "name": "pingou",
  362. "url_path": "user/pingou",
  363. },
  364. "members": ["pingou"],
  365. "date_created": "1492020239",
  366. "group_type": "user",
  367. "name": "some_group",
  368. "pagination": {
  369. "first": "http://localhost...",
  370. "last": "http://localhost...",
  371. "next": None,
  372. "page": 1,
  373. "pages": 1,
  374. "per_page": 20,
  375. "prev": None,
  376. },
  377. "projects": [
  378. {
  379. "access_groups": {
  380. "admin": ["some_group"],
  381. "collaborator": [],
  382. "commit": [],
  383. "ticket": [],
  384. },
  385. "access_users": {
  386. "admin": [],
  387. "collaborator": [],
  388. "commit": [],
  389. "owner": ["pingou"],
  390. "ticket": [],
  391. },
  392. "close_status": [
  393. "Invalid",
  394. "Insufficient data",
  395. "Fixed",
  396. "Duplicate",
  397. ],
  398. "custom_keys": [],
  399. "date_created": "1492020239",
  400. "date_modified": "1492020239",
  401. "description": "test project #2",
  402. "full_url": "http://localhost.localdomain/test2",
  403. "fullname": "test2",
  404. "id": 2,
  405. "milestones": {},
  406. "name": "test2",
  407. "namespace": None,
  408. "parent": None,
  409. "priorities": {},
  410. "tags": [],
  411. "url_path": "test2",
  412. "user": {
  413. "fullname": "PY C",
  414. "full_url": "http://localhost.localdomain/user/pingou",
  415. "name": "pingou",
  416. "url_path": "user/pingou",
  417. },
  418. }
  419. ],
  420. "total_projects": 1,
  421. }
  422. data = json.loads(output.get_data(as_text=True))
  423. data["date_created"] = "1492020239"
  424. self.assertIsNotNone(data["pagination"]["first"])
  425. data["pagination"]["first"] = "http://localhost..."
  426. self.assertIsNotNone(data["pagination"]["last"])
  427. data["pagination"]["last"] = "http://localhost..."
  428. projects = []
  429. for p in data["projects"]:
  430. p["date_created"] = "1492020239"
  431. p["date_modified"] = "1492020239"
  432. projects.append(p)
  433. data["projects"] = projects
  434. self.assertDictEqual(data, exp)
  435. def test_api_view_group_w_projects_and_acl_ticket(self):
  436. """
  437. Test the api_view_group method with project info and restricted
  438. to the ticket ACL
  439. """
  440. output = self.app.get("/api/0/group/some_group?projects=1&acl=ticket")
  441. self.assertEqual(output.status_code, 200)
  442. exp = {
  443. "display_name": "Some Group",
  444. "full_url": "http://localhost.localdomain/group/some_group",
  445. "description": None,
  446. "creator": {
  447. "fullname": "PY C",
  448. "full_url": "http://localhost.localdomain/user/pingou",
  449. "name": "pingou",
  450. "url_path": "user/pingou",
  451. },
  452. "members": ["pingou"],
  453. "date_created": "1492020239",
  454. "group_type": "user",
  455. "name": "some_group",
  456. "pagination": {
  457. "first": "http://localhost...",
  458. "last": "http://localhost...",
  459. "next": None,
  460. "page": 1,
  461. "pages": 1,
  462. "per_page": 20,
  463. "prev": None,
  464. },
  465. "projects": [
  466. {
  467. "access_groups": {
  468. "admin": ["some_group"],
  469. "collaborator": [],
  470. "commit": [],
  471. "ticket": [],
  472. },
  473. "access_users": {
  474. "admin": [],
  475. "collaborator": [],
  476. "commit": [],
  477. "owner": ["pingou"],
  478. "ticket": [],
  479. },
  480. "close_status": [
  481. "Invalid",
  482. "Insufficient data",
  483. "Fixed",
  484. "Duplicate",
  485. ],
  486. "custom_keys": [],
  487. "date_created": "1492020239",
  488. "date_modified": "1492020239",
  489. "description": "test project #2",
  490. "full_url": "http://localhost.localdomain/test2",
  491. "fullname": "test2",
  492. "id": 2,
  493. "milestones": {},
  494. "name": "test2",
  495. "namespace": None,
  496. "parent": None,
  497. "priorities": {},
  498. "tags": [],
  499. "url_path": "test2",
  500. "user": {
  501. "fullname": "PY C",
  502. "full_url": "http://localhost.localdomain/user/pingou",
  503. "name": "pingou",
  504. "url_path": "user/pingou",
  505. },
  506. }
  507. ],
  508. "total_projects": 1,
  509. }
  510. data = json.loads(output.get_data(as_text=True))
  511. data["date_created"] = "1492020239"
  512. self.assertIsNotNone(data["pagination"]["first"])
  513. data["pagination"]["first"] = "http://localhost..."
  514. self.assertIsNotNone(data["pagination"]["last"])
  515. data["pagination"]["last"] = "http://localhost..."
  516. projects = []
  517. for p in data["projects"]:
  518. p["date_created"] = "1492020239"
  519. p["date_modified"] = "1492020239"
  520. projects.append(p)
  521. data["projects"] = projects
  522. self.assertDictEqual(data, exp)
  523. def test_api_view_group_w_projects_and_acl_admin_no_project(self):
  524. """
  525. Test the api_view_group method with project info and restricted
  526. to the admin ACL
  527. """
  528. # Make the group having only commit access
  529. project = pagure.lib.query._get_project(self.session, "test2")
  530. msg = pagure.lib.query.add_group_to_project(
  531. session=self.session,
  532. project=project,
  533. new_group="some_group",
  534. user="pingou",
  535. access="commit",
  536. )
  537. self.session.commit()
  538. self.assertEqual(msg, "Group access updated")
  539. output = self.app.get("/api/0/group/some_group?projects=1&acl=admin")
  540. self.assertEqual(output.status_code, 200)
  541. exp = {
  542. "display_name": "Some Group",
  543. "full_url": "http://localhost.localdomain/group/some_group",
  544. "description": None,
  545. "creator": {
  546. "fullname": "PY C",
  547. "full_url": "http://localhost.localdomain/user/pingou",
  548. "name": "pingou",
  549. "url_path": "user/pingou",
  550. },
  551. "members": ["pingou"],
  552. "date_created": "1492020239",
  553. "group_type": "user",
  554. "name": "some_group",
  555. "pagination": {
  556. "first": "http://localhost...",
  557. "last": "http://localhost...",
  558. "next": None,
  559. "page": 1,
  560. "pages": 0,
  561. "per_page": 20,
  562. "prev": None,
  563. },
  564. "projects": [],
  565. "total_projects": 0,
  566. }
  567. data = json.loads(output.get_data(as_text=True))
  568. data["date_created"] = "1492020239"
  569. self.assertIsNotNone(data["pagination"]["first"])
  570. data["pagination"]["first"] = "http://localhost..."
  571. self.assertIsNotNone(data["pagination"]["last"])
  572. data["pagination"]["last"] = "http://localhost..."
  573. self.assertDictEqual(data, exp)
  574. def test_api_view_group_w_projects_and_acl_commit_no_project(self):
  575. """
  576. Test the api_view_group method with project info and restricted
  577. to the commit ACL
  578. """
  579. # Make the group having only ticket access
  580. project = pagure.lib.query._get_project(self.session, "test2")
  581. msg = pagure.lib.query.add_group_to_project(
  582. session=self.session,
  583. project=project,
  584. new_group="some_group",
  585. user="pingou",
  586. access="ticket",
  587. )
  588. self.session.commit()
  589. self.assertEqual(msg, "Group access updated")
  590. output = self.app.get("/api/0/group/some_group?projects=1&acl=commit")
  591. self.assertEqual(output.status_code, 200)
  592. exp = {
  593. "display_name": "Some Group",
  594. "full_url": "http://localhost.localdomain/group/some_group",
  595. "description": None,
  596. "creator": {
  597. "fullname": "PY C",
  598. "full_url": "http://localhost.localdomain/user/pingou",
  599. "name": "pingou",
  600. "url_path": "user/pingou",
  601. },
  602. "members": ["pingou"],
  603. "date_created": "1492020239",
  604. "group_type": "user",
  605. "name": "some_group",
  606. "pagination": {
  607. "first": "http://localhost...",
  608. "last": "http://localhost...",
  609. "next": None,
  610. "page": 1,
  611. "pages": 0,
  612. "per_page": 20,
  613. "prev": None,
  614. },
  615. "projects": [],
  616. "total_projects": 0,
  617. }
  618. data = json.loads(output.get_data(as_text=True))
  619. data["date_created"] = "1492020239"
  620. self.assertIsNotNone(data["pagination"]["first"])
  621. data["pagination"]["first"] = "http://localhost..."
  622. self.assertIsNotNone(data["pagination"]["last"])
  623. data["pagination"]["last"] = "http://localhost..."
  624. self.assertDictEqual(data, exp)
  625. def test_api_view_group_w_projects_and_acl_ticket_no_project(self):
  626. """
  627. Test the api_view_group method with project info and restricted
  628. to the ticket ACL
  629. """
  630. # Create a group not linked to any project
  631. item = pagure.lib.model.PagureGroup(
  632. group_name="rel-eng",
  633. group_type="user",
  634. display_name="Release engineering group",
  635. user_id=1, # pingou
  636. )
  637. self.session.add(item)
  638. self.session.commit()
  639. output = self.app.get("/api/0/group/rel-eng?projects=1&acl=ticket")
  640. self.assertEqual(output.status_code, 200)
  641. exp = {
  642. "display_name": "Release engineering group",
  643. "full_url": "http://localhost.localdomain/group/rel-eng",
  644. "description": None,
  645. "creator": {
  646. "fullname": "PY C",
  647. "full_url": "http://localhost.localdomain/user/pingou",
  648. "name": "pingou",
  649. "url_path": "user/pingou",
  650. },
  651. "members": [],
  652. "date_created": "1492020239",
  653. "group_type": "user",
  654. "name": "rel-eng",
  655. "pagination": {
  656. "first": "http://localhost...",
  657. "last": "http://localhost...",
  658. "next": None,
  659. "page": 1,
  660. "pages": 0,
  661. "per_page": 20,
  662. "prev": None,
  663. },
  664. "projects": [],
  665. "total_projects": 0,
  666. }
  667. data = json.loads(output.get_data(as_text=True))
  668. data["date_created"] = "1492020239"
  669. self.assertIsNotNone(data["pagination"]["first"])
  670. data["pagination"]["first"] = "http://localhost..."
  671. self.assertIsNotNone(data["pagination"]["last"])
  672. data["pagination"]["last"] = "http://localhost..."
  673. self.assertDictEqual(data, exp)
  674. def test_api_view_group_w_projects_and_acl_pagination(self):
  675. """
  676. Tests the pagination for the api_view_group method
  677. """
  678. project = pagure.lib.query._get_project(self.session, "test2")
  679. msg = pagure.lib.query.add_group_to_project(
  680. session=self.session,
  681. project=project,
  682. new_group="some_group",
  683. user="pingou",
  684. access="commit",
  685. )
  686. self.session.commit()
  687. self.assertEqual(msg, "Group access updated")
  688. project_another = pagure.lib.query._get_project(self.session, "test")
  689. msg = pagure.lib.query.add_group_to_project(
  690. session=self.session,
  691. project=project_another,
  692. new_group="some_group",
  693. user="pingou",
  694. access="commit",
  695. )
  696. self.session.commit()
  697. self.assertEqual(msg, "Group added")
  698. tests.create_tokens(self.session)
  699. headers = {"Authorization": "token aaabbbcccddd"}
  700. output = self.app.get(
  701. "/api/0/group/some_group?per_page=1&projects=1", headers=headers
  702. )
  703. self.assertEqual(output.status_code, 200)
  704. data = json.loads(output.get_data(as_text=True))
  705. projects = [project["name"] for project in data["projects"]]
  706. # Test the result we've got from the first page out of two
  707. assert projects == ["test"]
  708. output_last = self.app.get(
  709. data["pagination"]["next"].replace("http://localhost", ""),
  710. headers=headers,
  711. )
  712. self.assertEqual(output_last.status_code, 200)
  713. data_last = json.loads(output_last.get_data(as_text=True))
  714. projects.extend([project["name"] for project in data_last["projects"]])
  715. # Note that pagure sorts projects alphabetically, so we're comparing
  716. # a different order that was the order of requests
  717. assert projects == ["test", "test2"]
  718. if __name__ == "__main__":
  719. unittest.main(verbosity=2)