From 042c41bda71840925d446e0499431712d5168c4e Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Aug 15 2018 13:29:13 +0000 Subject: [PATCH 1/2] paginate /api/0//issues and /api/0//pull-requests Fixes part of https://pagure.io/pagure/issue/3403 It was requested in one of the comments in this issue to also add paginating to the issues and pull-requests API endpoints. This PR adds these features. Signed-off-by: Karsten Hopp --- diff --git a/pagure/api/fork.py b/pagure/api/fork.py index ad28e5a..518f413 100644 --- a/pagure/api/fork.py +++ b/pagure/api/fork.py @@ -148,6 +148,32 @@ def api_pull_request_views(repo, username=None, namespace=None): status = flask.request.args.get('status', True) assignee = flask.request.args.get('assignee', None) author = flask.request.args.get('author', None) + page = flask.request.args.get('page', None) + per_page = flask.request.args.get('per_page', None) + if not page: + page = 1 + else: + try: + page = int(page) + except (TypeError, ValueError): + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDREQ) + + if page < 1: + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDREQ) + if per_page: + try: + per_page = int(per_page) + except (TypeError, ValueError): + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDREQ) + + if per_page < 1 or per_page > 100: + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDPERPAGEVALUE) + else: + per_page = 20 status_text = ("%s" % status).lower() requests = [] @@ -175,18 +201,29 @@ def api_pull_request_views(repo, username=None, namespace=None): author=author, status=status) - jsonout = flask.jsonify({ + pagination_metadata = pagure.lib.get_pagination_metadata( + flask.request, page, per_page, len(requests), repo) + start = (page - 1) * per_page + if start + per_page > len(requests): + requests_page = requests[start:] + else: + requests_page = requests[start:(start + per_page)] + jsonout = { 'total_requests': len(requests), 'requests': [ request.to_json(public=True, api=True) - for request in requests], + for request in requests_page], 'args': { 'status': status, 'assignee': assignee, 'author': author, } - }) - return jsonout + } + if pagination_metadata: + jsonout['args']['page'] = page + jsonout['args']['per_page'] = per_page + jsonout['pagination'] = pagination_metadata + return flask.jsonify(jsonout) @API.route('//pull-request/') diff --git a/pagure/api/issue.py b/pagure/api/issue.py index 66f6b1c..d58dfaa 100644 --- a/pagure/api/issue.py +++ b/pagure/api/issue.py @@ -462,11 +462,37 @@ def api_view_issues(repo, username=None, namespace=None): if no_stones is not None: no_stones = is_true(no_stones) priority = flask.request.args.get('priority', None) + page = flask.request.args.get('page', None) + per_page = flask.request.args.get('per_page', None) since = flask.request.args.get('since', None) order = flask.request.args.get('order', None) status = flask.request.args.get('status', None) tags = flask.request.args.getlist('tags') tags = [tag.strip() for tag in tags if tag.strip()] + if not page: + page = 1 + else: + try: + page = int(page) + except (TypeError, ValueError): + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDREQ) + + if page < 1: + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDREQ) + if per_page: + try: + per_page = int(per_page) + except (TypeError, ValueError): + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDREQ) + + if per_page < 1 or per_page > 100: + raise pagure.exceptions.APIError( + 400, error_code=APIERROR.EINVALIDPERPAGEVALUE) + else: + per_page = 20 priority_key = None if priority: @@ -536,9 +562,17 @@ def api_view_issues(repo, username=None, namespace=None): 400, error_code=APIERROR.EDATETIME) params.update({'updated_after': updated_after}) + issue_count = pagure.lib.search_issues(count=True, **params) + + pagination_metadata = pagure.lib.get_pagination_metadata( + flask.request, page, per_page, issue_count, repo) + query_start = (page - 1) * per_page + query_limit = per_page + params.update({'offset': query_start}) + params.update({'limit': query_limit}) issues = pagure.lib.search_issues(**params) - jsonout = flask.jsonify({ - 'total_issues': len(issues), + jsonout = { + 'total_issues': issue_count, 'issues': [issue.to_json(public=True) for issue in issues], 'args': { 'assignee': assignee, @@ -551,8 +585,12 @@ def api_view_issues(repo, username=None, namespace=None): 'status': status, 'tags': tags, } - }) - return jsonout + } + if pagination_metadata: + jsonout['args']['page'] = page + jsonout['args']['per_page'] = per_page + jsonout['pagination'] = pagination_metadata + return flask.jsonify(jsonout) @API.route('//issue/') diff --git a/pagure/api/project.py b/pagure/api/project.py index 59afe5a..be4083a 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -500,7 +500,7 @@ def api_projects(): per_page = 20 pagination_metadata = pagure.lib.get_pagination_metadata( - flask.request, page, per_page, project_count) + flask.request, page, per_page, project_count, repo=None) query_start = (page - 1) * per_page query_limit = per_page diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 22d974b..be68413 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -4937,7 +4937,7 @@ def set_project_owner(session, project, user, required_groups=None): session.add(project) -def get_pagination_metadata(flask_request, page, per_page, total): +def get_pagination_metadata(flask_request, page, per_page, total, repo): """ Returns pagination metadata for an API. The code was inspired by Flask-SQLAlchemy. @@ -4963,21 +4963,21 @@ def get_pagination_metadata(flask_request, page, per_page, total): if page < pages: next_page = url_for( flask_request.endpoint, page=page + 1, per_page=per_page, - _external=True, **request_args_wo_page) + _external=True, repo=repo, **request_args_wo_page) prev_page = None if page > 1: prev_page = url_for( flask_request.endpoint, page=page - 1, per_page=per_page, - _external=True, **request_args_wo_page) + _external=True, repo=repo, **request_args_wo_page) first_page = url_for( flask_request.endpoint, page=1, per_page=per_page, _external=True, - **request_args_wo_page) + repo=repo, **request_args_wo_page) last_page = url_for( flask_request.endpoint, page=pages, per_page=per_page, - _external=True, **request_args_wo_page) + repo=repo, _external=True, **request_args_wo_page) return { 'page': page, diff --git a/tests/test_pagure_flask_api_fork.py b/tests/test_pagure_flask_api_fork.py index ac1f827..c6a9ab9 100644 --- a/tests/test_pagure_flask_api_fork.py +++ b/tests/test_pagure_flask_api_fork.py @@ -116,10 +116,11 @@ class PagureFlaskApiForktests(tests.Modeltests): output = self.app.get('/api/0/test/pull-requests?status=closed') self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) + del data['pagination'] self.assertDictEqual( data, { - u'args': {u'assignee': None, u'author': None, u'status': u'closed'}, + u'args': {u'assignee': None, u'author': None, u'page': 1, u'per_page': 20, u'status': u'closed'}, u'requests': [], u'total_requests': 0 } @@ -134,7 +135,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) self.assertEqual( - sorted(data.keys()), ['args', 'requests', 'total_requests']) + sorted(data.keys()), ['args', 'pagination', 'requests', 'total_requests']) self.assertDictEqual( data['args'], {u'assignee': None, u'author': None, u'status': u'closed'} @@ -175,7 +176,7 @@ class PagureFlaskApiForktests(tests.Modeltests): sorted(data.keys()), ['args', 'requests', 'total_requests']) self.assertDictEqual( data['args'], - {u'assignee': None, u'author': None, u'status': u'all'} + {u'assignee': None, u'author': None, u'page': 1, u'per_page': 20, u'status': u'all'} ) self.assertEqual(data['total_requests'], 1) @@ -246,10 +247,13 @@ class PagureFlaskApiForktests(tests.Modeltests): data['requests'][0]['repo_from']['date_modified'] = '1431414800' data['requests'][0]['uid'] = '1431414800' data['requests'][0]['last_updated'] = '1431414800' + del data['pagination'] expected_data = { "args": { "assignee": None, "author": None, + "page": 1, + "per_page": 20, "status": True }, "requests": [{ diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index e21e56a..ecadf70 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -1144,6 +1144,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1153,6 +1154,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1186,6 +1189,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1195,6 +1199,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1231,6 +1237,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1240,6 +1247,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1260,6 +1269,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1269,6 +1279,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1305,6 +1317,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1314,6 +1327,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1333,6 +1348,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1342,6 +1358,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1358,6 +1376,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data = json.loads(output.get_data(as_text=True)) data['issues'][0]['date_created'] = '1431414800' data['issues'][0]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1367,6 +1386,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): "milestones": [], "no_stones": None, 'order': None, + 'page': 1, + 'per_page': 20, "priority": None, "since": None, "status": "Closed", @@ -1381,6 +1402,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): output = self.app.get('/api/0/test/issues?status=Invalid', headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) + del data['pagination'] self.assertDictEqual( data, { @@ -1390,6 +1412,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": "Invalid", @@ -1407,6 +1431,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['last_updated'] = '1431414800' data['issues'][idx]['date_created'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1416,6 +1441,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": "All", @@ -1481,6 +1508,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': 'asc', + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1489,6 +1518,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): "issues": [FULL_ISSUE_LIST[8]], "total_issues": 1 } + del data['pagination'] self.assertDictEqual(data, expected) def test_api_view_issues_milestone(self): @@ -1539,6 +1569,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['last_updated'] = '1431414800' lcl_issues = copy.deepcopy(LCL_ISSUES) lcl_issues[0]['milestone'] = 'v1.0' + del data['pagination'] self.assertDictEqual( data, { @@ -1548,6 +1579,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1565,6 +1598,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1574,6 +1608,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': ['v1.0'], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1637,6 +1673,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['last_updated'] = '1431414800' lcl_issues = copy.deepcopy(LCL_ISSUES) lcl_issues[0]['priority'] = 1 + del data['pagination'] self.assertDictEqual( data, { @@ -1646,6 +1683,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1663,6 +1702,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1672,6 +1712,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': 'high', "since": None, "status": None, @@ -1688,6 +1730,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1697,6 +1740,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': '1', "since": None, "status": None, @@ -1777,6 +1822,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): data['issues'][idx]['last_updated'] = '1431414800' lcl_issues = copy.deepcopy(LCL_ISSUES) lcl_issues[0]['milestone'] = 'v1.0' + del data['pagination'] self.assertDictEqual( data, { @@ -1786,6 +1832,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1803,6 +1851,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1812,6 +1861,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': True, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1829,6 +1880,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1838,6 +1890,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': False, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1924,6 +1978,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1933,6 +1988,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": None, "status": None, @@ -1953,6 +2010,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1962,6 +2020,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": str(start), "status": None, @@ -1979,6 +2039,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -1988,6 +2049,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": str(middle), "status": None, @@ -2005,6 +2068,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -2014,6 +2078,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": str(final), "status": None, @@ -2034,6 +2100,7 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['last_updated'] = '1431414800' data['issues'][idx]['date_created'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -2043,6 +2110,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'milestones': [], 'no_stones': None, 'order': None, + 'page': 1, + 'per_page': 20, 'priority': None, "since": str(final), "status": None, @@ -3992,6 +4061,231 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): self.assertEqual(data['total_issues_assigned_pages'], 1) self.assertEqual(data['total_issues_created_pages'], 1) + def test_api_issues_pagination(self): + """ Test the api_view_issues method of the flask api + with pagination. + """ + self.test_api_new_issue() + output = self.app.get('/api/0/test/issues?page=10') + self.assertEqual(output.status_code, 200) + data = json.loads(output.get_data(as_text=True)) + data["pagination"].pop("first") + data["pagination"].pop("prev") + data["pagination"].pop("last") + data["pagination"].pop("next") + self.assertEqual( + data, + { + 'args': { + 'assignee': None, + 'author': None, + 'milestones': [], + 'no_stones': None, + 'order': None, + 'page': 10, + 'per_page': 20, + 'priority': None, + 'since': None, + 'status': None, + 'tags': [] + }, + 'issues': [], + 'pagination': { + 'page': 10, + 'pages': 1, + 'per_page': 20, + }, + 'total_issues': 1 + } + ) + output = self.app.get('/api/0/test/issues') + data = json.loads(output.get_data(as_text=True)) + data["pagination"].pop("first") + self.assertEqual(data["pagination"]["prev"], None) + data["pagination"].pop("prev") + data["pagination"].pop("last") + self.assertEqual(data["pagination"]["next"], None) + data["pagination"].pop("next") + for i in data['issues']: + i['date_created'] = '1431414800' + i['last_updated'] = '1431414800' + self.assertDictEqual( + data, + { + 'args': + { + 'assignee': None, + 'author': None, + 'milestones': [], + 'no_stones': None, + 'order': None, + 'page': 1, + 'per_page': 20, + 'priority': None, + 'since': None, + 'status': None, + 'tags': [] + }, + 'issues': + [ + { + 'assignee': None, + 'blocks': [], + 'close_status': None, + 'closed_at': None, + 'comments': [], + 'content': 'This issue needs attention', + 'custom_fields': [], + 'date_created': '1431414800', + 'depends': [], + 'id': 1, + 'last_updated': '1431414800', + 'milestone': None, + 'priority': None, + 'private': False, + 'status': 'Open', + 'tags': [], + 'title': 'test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'} + } + ], + 'pagination': { + 'page': 1, + 'pages': 1, + 'per_page': 20, + }, + 'total_issues': 1 + } + ) + repo = pagure.lib.get_authorized_project(self.session, 'test') + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None, + private=False, + status="Open" + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + output = self.app.get( + '/api/0/test/issues?status=All&page=1&per_page=1') + data = json.loads(output.get_data(as_text=True)) + data["pagination"].pop("first") + self.assertEqual(data["pagination"]["prev"], None) + data["pagination"].pop("prev") + data["pagination"].pop("last") + self.assertNotEqual(data["pagination"]["next"], None) + data["pagination"].pop("next") + for i in data['issues']: + i['date_created'] = '1431414800' + i['last_updated'] = '1431414800' + self.assertDictEqual( + data, + { + 'args': { + 'assignee': None, + 'author': None, + 'milestones': [], + 'no_stones': None, + 'order': None, + 'page': 1, + 'per_page': 1, + 'priority': None, + 'since': None, + 'status': 'All', + 'tags': [] + }, + 'issues': + [ + { + 'assignee': None, + 'blocks': [], + 'close_status': None, + 'closed_at': None, + 'comments': [], + 'content': 'We should work on this', + 'custom_fields': [], + 'date_created': '1431414800', + 'depends': [], + 'id': 2, + 'last_updated': '1431414800', + 'milestone': None, + 'priority': None, + 'private': False, + 'status': 'Open', + 'tags': [], + 'title': 'Test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'} + } + ], + 'pagination': { + 'page': 1, + 'pages': 2, + 'per_page': 1 + }, + 'total_issues': 2 + } + ) + output = self.app.get( + '/api/0/test/issues?status=All&page=2&per_page=1') + data = json.loads(output.get_data(as_text=True)) + data["pagination"].pop("first") + self.assertNotEqual(data["pagination"]["prev"], None) + data["pagination"].pop("prev") + data["pagination"].pop("last") + self.assertEqual(data["pagination"]["next"], None) + data["pagination"].pop("next") + for i in data['issues']: + i['date_created'] = '1431414800' + i['last_updated'] = '1431414800' + self.assertDictEqual( + data, + { + 'args': { + 'assignee': None, + 'author': None, + 'milestones': [], + 'no_stones': None, + 'order': None, + 'page': 2, + 'per_page': 1, + 'priority': None, + 'since': None, + 'status': 'All', + 'tags': [] + }, + 'issues': [{ + 'assignee': None, + 'blocks': [], + 'close_status': None, + 'closed_at': None, + 'comments': [], + 'content': 'This issue needs attention', + 'custom_fields': [], + 'date_created': '1431414800', + 'depends': [], + 'id': 1, + 'last_updated': '1431414800', + 'milestone': None, + 'priority': None, + 'private': False, + 'status': 'Open', + 'tags': [], + 'title': 'test issue', + 'user': {'fullname': 'PY C', 'name': 'pingou'} + }], + 'pagination': { + 'page': 2, + 'pages': 2, + 'per_page': 1 + }, + 'total_issues': 2 + } + ) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase( diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index f950cfc..5461f4d 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -1373,12 +1373,15 @@ class PagurePrivateRepotest(tests.Modeltests): data['requests'][0]['repo_from']['date_modified'] = '1431414800' data['requests'][0]['uid'] = '1431414800' data['requests'][0]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { "args": { "assignee": None, "author": None, + "page": 1, + "per_page": 20, "status": True }, "requests": [ @@ -1491,6 +1494,7 @@ class PagurePrivateRepotest(tests.Modeltests): data2['requests'][0]['repo_from']['date_modified'] = '1431414800' data2['requests'][0]['uid'] = '1431414800' data2['requests'][0]['last_updated'] = '1431414800' + del data2['pagination'] self.assertDictEqual(data, data2) # For single PR @@ -2338,6 +2342,7 @@ class PagurePrivateRepotest(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) data['issues'][0]['date_created'] = '1431414800' data['issues'][0]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -2347,6 +2352,8 @@ class PagurePrivateRepotest(tests.Modeltests): "milestones": [], "no_stones": None, "order": None, + "page": 1, + "per_page": 20, "priority": None, "since": None, "status": None, @@ -2406,6 +2413,7 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' data['issues'][1]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -2415,6 +2423,8 @@ class PagurePrivateRepotest(tests.Modeltests): "milestones": [], "no_stones": None, "order": None, + "page": 1, + "per_page": 20, "priority": None, "status": None, "since": None, @@ -2488,6 +2498,7 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' data['issues'][1]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -2497,6 +2508,8 @@ class PagurePrivateRepotest(tests.Modeltests): "milestones": [], "no_stones": None, "order": None, + "page": 1, + "per_page": 20, "priority": None, "status": None, "since": None, @@ -2560,6 +2573,7 @@ class PagurePrivateRepotest(tests.Modeltests): '/api/0/test4/issues?status=Closed', headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) + del data['pagination'] self.assertDictEqual( data, { @@ -2569,6 +2583,8 @@ class PagurePrivateRepotest(tests.Modeltests): "milestones": [], "no_stones": None, "order": None, + "page": 1, + "per_page": 20, "priority": None, "status": "Closed", "since": None, @@ -2584,6 +2600,7 @@ class PagurePrivateRepotest(tests.Modeltests): '/api/0/test4/issues?status=Invalid', headers=headers) self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) + del data['pagination'] self.assertDictEqual( data, { @@ -2593,6 +2610,8 @@ class PagurePrivateRepotest(tests.Modeltests): "milestones": [], "no_stones": None, "order": None, + "page": 1, + "per_page": 20, "priority": None, "status": "Invalid", "since": None, @@ -2612,6 +2631,7 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' data['issues'][1]['last_updated'] = '1431414800' + del data['pagination'] self.assertDictEqual( data, { @@ -2621,6 +2641,8 @@ class PagurePrivateRepotest(tests.Modeltests): "milestones": [], "no_stones": None, "order": None, + "page": 1, + "per_page": 20, "priority": None, "since": None, "status": "All", From 04a0217e37ace151dbec47ecee359145eb3f7c32 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Aug 16 2018 09:03:38 +0000 Subject: [PATCH 2/2] update tests with new output --- diff --git a/tests/test_pagure_flask_api_fork.py b/tests/test_pagure_flask_api_fork.py index c6a9ab9..f7f7246 100644 --- a/tests/test_pagure_flask_api_fork.py +++ b/tests/test_pagure_flask_api_fork.py @@ -138,7 +138,13 @@ class PagureFlaskApiForktests(tests.Modeltests): sorted(data.keys()), ['args', 'pagination', 'requests', 'total_requests']) self.assertDictEqual( data['args'], - {u'assignee': None, u'author': None, u'status': u'closed'} + { + u'assignee': None, + u'author': None, + u'page': 1, + u'per_page': 20, + u'status': u'closed' + } ) self.assertEqual(data['total_requests'], 1) @@ -173,7 +179,7 @@ class PagureFlaskApiForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) self.assertEqual( - sorted(data.keys()), ['args', 'requests', 'total_requests']) + sorted(data.keys()), ['args', 'pagination', 'requests', 'total_requests']) self.assertDictEqual( data['args'], {u'assignee': None, u'author': None, u'page': 1, u'per_page': 20, u'status': u'all'} @@ -369,6 +375,7 @@ class PagureFlaskApiForktests(tests.Modeltests): data2['requests'][0]['repo_from']['date_modified'] = '1431414800' data2['requests'][0]['uid'] = '1431414800' data2['requests'][0]['last_updated'] = '1431414800' + del data2['pagination'] self.assertDictEqual(data, data2) @patch('pagure.lib.notify.send_email')