From efe7da50af4432f762996b77a449680c236b48ac Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:12:45 +0000 Subject: [PATCH 1/7] Allow specifying the name of the `page` argument Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 4ba980c..f18bd8b 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -5193,7 +5193,8 @@ 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, key_page='page'): """ Returns pagination metadata for an API. The code was inspired by Flask-SQLAlchemy. @@ -5201,6 +5202,7 @@ def get_pagination_metadata(flask_request, page, per_page, total): :param page: int of the current page :param per_page: int of results per page :param total: int of total results + :param key_page: the name of the argument corresponding to the page :return: dictionary of pagination metadata """ pages = int(ceil(total / float(per_page))) @@ -5208,7 +5210,7 @@ def get_pagination_metadata(flask_request, page, per_page, total): # Remove pagination related args because those are handled elsewhere # Also, remove any args that url_for accepts in case the user entered # those in - for key in ['page', 'per_page', 'endpoint']: + for key in [key_page, 'per_page', 'endpoint']: if key in request_args_wo_page: request_args_wo_page.pop(key) for key in flask_request.args: @@ -5219,26 +5221,30 @@ def get_pagination_metadata(flask_request, page, per_page, total): next_page = None if page < pages: + request_args_wo_page.update({key_page: page + 1}) next_page = url_for( - flask_request.endpoint, page=page + 1, per_page=per_page, + flask_request.endpoint, per_page=per_page, _external=True, **request_args_wo_page) prev_page = None if page > 1: + request_args_wo_page.update({key_page: page - 1}) prev_page = url_for( - flask_request.endpoint, page=page - 1, per_page=per_page, + flask_request.endpoint, per_page=per_page, _external=True, **request_args_wo_page) + request_args_wo_page.update({key_page: 1}) first_page = url_for( - flask_request.endpoint, page=1, per_page=per_page, _external=True, + flask_request.endpoint, per_page=per_page, _external=True, **request_args_wo_page) + request_args_wo_page.update({key_page: pages}) last_page = url_for( - flask_request.endpoint, page=pages, per_page=per_page, + flask_request.endpoint, per_page=per_page, _external=True, **request_args_wo_page) return { - 'page': page, + key_page: page, 'pages': pages, 'per_page': per_page, 'prev': prev_page, From c12228af3ccde447225ec495d3929c98387905b7 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:12:45 +0000 Subject: [PATCH 2/7] Add pagination to /api/0//user/ and /api/0//user/{username}/issues Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/api/user.py b/pagure/api/user.py index 103fbae..3b7cbb0 100644 --- a/pagure/api/user.py +++ b/pagure/api/user.py @@ -12,7 +12,6 @@ from __future__ import unicode_literals import collections import datetime -from math import ceil import arrow import flask @@ -21,7 +20,7 @@ import six import pagure import pagure.exceptions import pagure.lib -from pagure.api import API, api_method, APIERROR +from pagure.api import API, api_method, APIERROR, get_page, get_per_page from pagure.utils import is_true @@ -50,6 +49,27 @@ def api_view_user(username): GET /api/0/user/ralph + Parameters + ^^^^^^^^^^ + + +---------------+----------+---------------+--------------------------+ + | Key | Type | Optionality | Description | + +===============+==========+===============+==========================+ + | ``repopage`` | int | Optional | | Specifies which | + | | | | page of the projects | + | | | | to return | + | | | | (defaults to: 1) | + +---------------+----------+---------------+--------------------------+ + | ``forkpage`` | int | Optional | | Specifies which | + | | | | page of the forks | + | | | | to return | + | | | | (defaults to: 1) | + +---------------+----------+---------------+--------------------------+ + | ``per_page`` | int | Optional | | The number of items | + | | | | to return per page. | + | | | | The maximum is 100. | + +---------------+----------+---------------+--------------------------+ + Sample response ^^^^^^^^^^^^^^^ @@ -93,6 +113,7 @@ def api_view_user(username): user = _get_user(username=username) + per_page = get_per_page() repopage = flask.request.args.get('repopage', 1) try: repopage = int(repopage) @@ -105,19 +126,47 @@ def api_view_user(username): except ValueError: forkpage = 1 + repos_cnt = pagure.lib.search_projects( + flask.g.session, + username=username, + fork=False, + count=True) + + pagination_metadata_repo = pagure.lib.get_pagination_metadata( + flask.request, repopage, per_page, repos_cnt, key_page='repopage') + repopage_start = (repopage - 1) * per_page + repopage_limit = per_page + repos = pagure.lib.search_projects( flask.g.session, username=username, - fork=False) + fork=False, + start=repopage_start, + limit=repopage_limit) + + forks_cnt = pagure.lib.search_projects( + flask.g.session, + username=username, + fork=True, + count=True) + + pagination_metadata_fork = pagure.lib.get_pagination_metadata( + flask.request, forkpage, per_page, forks_cnt, key_page='forkpage') + forkpage_start = (forkpage - 1) * per_page + forkpage_limit = per_page forks = pagure.lib.search_projects( flask.g.session, username=username, - fork=True) + fork=True, + start=forkpage_start, + limit=forkpage_limit) output['user'] = user.to_json(public=True) output['repos'] = [repo.to_json(public=True) for repo in repos] output['forks'] = [repo.to_json(public=True) for repo in forks] + output['repos_pagination'] = pagination_metadata_repo + output['forks_pagination'] = pagination_metadata_fork jsonout = flask.jsonify(output) jsonout.status_code = httpcode @@ -145,6 +194,10 @@ def api_view_user_issues(username): | ``page`` | integer | Mandatory | | The page requested. | | | | | Defaults to 1. | +---------------+---------+--------------+---------------------------+ + | ``per_page`` | int | Optional | | The number of items | + | | | | to return per page. | + | | | | The maximum is 100. | + +---------------+---------+--------------+---------------------------+ | ``status`` | string | Optional | | Filters the status of | | | | | issues. Fetches all the | | | | | issues if status is | @@ -284,24 +337,17 @@ def api_view_user_issues(username): status = flask.request.args.get('status', None) tags = flask.request.args.getlist('tags') tags = [tag.strip() for tag in tags if tag.strip()] - page = flask.request.args.get('page', 1) + + page = get_page() + per_page = get_per_page() assignee = flask.request.args.get('assignee', '').lower()\ not in ['false', '0', 'f'] author = flask.request.args.get('author', '').lower() \ not in ['false', '0', 'f'] - try: - page = int(page) - if page <= 0: - raise ValueError() - except ValueError: - raise pagure.exceptions.APIError( - 400, error_code=APIERROR.ENOCODE, - error='Invalid page requested') - - offset = (page - 1) * 50 - limit = page * 50 + offset = (page - 1) * per_page + limit = per_page params = { 'session': flask.g.session, @@ -346,6 +392,8 @@ def api_view_user_issues(username): issues_created = [] issues_created_pages = 1 + issues_created_cnt = 0 + pagination_issues_created = None if author: # Issues authored by this user params_created = params.copy() @@ -353,11 +401,13 @@ def api_view_user_issues(username): issues_created = pagure.lib.search_issues(**params_created) params_created.update({"offset": None, 'limit': None, 'count': True}) issues_created_cnt = pagure.lib.search_issues(**params_created) - issues_created_pages = int( - ceil(issues_created_cnt / float(50))) or 1 + pagination_issues_created = pagure.lib.get_pagination_metadata( + flask.request, page, per_page, issues_created_cnt) issues_assigned = [] issues_assigned_pages = 1 + issues_assigned_cnt = 0 + pagination_issues_assigned = None if assignee: # Issues assigned to this user params_assigned = params.copy() @@ -365,14 +415,16 @@ def api_view_user_issues(username): issues_assigned = pagure.lib.search_issues(**params_assigned) params_assigned.update({"offset": None, 'limit': None, 'count': True}) issues_assigned_cnt = pagure.lib.search_issues(**params_assigned) - issues_assigned_pages = int( - ceil(issues_assigned_cnt / float(50))) or 1 + pagination_issues_assigned = pagure.lib.get_pagination_metadata( + flask.request, page, per_page, issues_assigned_cnt) jsonout = flask.jsonify({ + 'pagination_issues_created': pagination_issues_created, + 'pagination_issues_assigned': pagination_issues_assigned, 'total_issues_created_pages': issues_created_pages, 'total_issues_assigned_pages': issues_assigned_pages, - 'total_issues_created': len(issues_created), - 'total_issues_assigned': len(issues_assigned), + 'total_issues_created': issues_created_cnt, + 'total_issues_assigned': issues_assigned_cnt, 'issues_created': [issue.to_json(public=True, with_project=True) for issue in issues_created], 'issues_assigned': [issue.to_json(public=True, with_project=True) diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 040a2d9..c43db63 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -4124,8 +4124,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): self.assertEqual( data, { - 'error': 'Invalid page requested', - 'error_code': 'ENOCODE' + u'error': u'Invalid or incomplete input submitted', + u'error_code': u'EINVALIDREQ' } ) @@ -4136,8 +4136,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): self.assertEqual( data, { - 'error': 'Invalid page requested', - 'error_code': 'ENOCODE' + u'error': u'Invalid or incomplete input submitted', + u'error_code': u'EINVALIDREQ' } ) diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index 0d08635..faa9be6 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -70,7 +70,23 @@ class PagureFlaskApiUSertests(tests.Modeltests): self.assertEqual(output.status_code, 200) exp = { "forks": [], + 'forks_pagination': { + 'first': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=1', + 'last': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=0', + 'next': None, + 'forkpage': 1, + 'pages': 0, + 'per_page': 20, + 'prev': None}, "repos": [], + 'repos_pagination': { + 'first': u'http://localhost/api/0/user/pingou?per_page=20&repopage=1', + 'last': u'http://localhost/api/0/user/pingou?per_page=20&repopage=0', + 'next': None, + 'repopage': 1, + 'pages': 0, + 'per_page': 20, + 'prev': None}, "user": { "fullname": "PY C", "name": "pingou"}} data = json.loads(output.get_data(as_text=True)) self.assertEqual(data, exp) @@ -93,6 +109,14 @@ class PagureFlaskApiUSertests(tests.Modeltests): data['repos'][2]['date_modified'] = "1490272832" expected_data = { "forks": [], + 'forks_pagination': { + 'first': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=1', + 'last': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=0', + 'next': None, + 'forkpage': 1, + 'pages': 0, + 'per_page': 20, + 'prev': None}, "repos": [ { "access_groups": { @@ -202,6 +226,14 @@ class PagureFlaskApiUSertests(tests.Modeltests): } } ], + 'repos_pagination': { + 'first': u'http://localhost/api/0/user/pingou?per_page=20&repopage=1', + 'last': u'http://localhost/api/0/user/pingou?per_page=20&repopage=1', + 'next': None, + 'repopage': 1, + 'pages': 1, + 'per_page': 20, + 'prev': None}, "user": { "fullname": "PY C", "name": "pingou" @@ -1030,6 +1062,22 @@ class PagureFlaskApiUsertestissues(tests.Modeltests): }, "issues_assigned": [], "issues_created": [], + 'pagination_issues_assigned': { + 'first': u'http://localhost/api/0/user/foo/issues?per_page=20&page=1', + 'last': u'http://localhost/api/0/user/foo/issues?per_page=20&page=0', + 'next': None, + 'page': 1, + 'pages': 0, + 'per_page': 20, + 'prev': None}, + 'pagination_issues_created': { + 'first': u'http://localhost/api/0/user/foo/issues?per_page=20&page=1', + 'last': u'http://localhost/api/0/user/foo/issues?per_page=20&page=0', + 'next': None, + 'page': 1, + 'pages': 0, + 'per_page': 20, + 'prev': None}, "total_issues_assigned": 0, "total_issues_assigned_pages": 1, "total_issues_created": 0, @@ -1130,6 +1178,22 @@ class PagureFlaskApiUsertestissues(tests.Modeltests): } } ], + 'pagination_issues_assigned': { + 'first': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=1', + 'last': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=0', + 'next': None, + 'page': 1, + 'pages': 0, + 'per_page': 20, + 'prev': None}, + 'pagination_issues_created': { + 'first': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=1', + 'last': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=1', + 'next': None, + 'page': 1, + 'pages': 1, + 'per_page': 20, + 'prev': None}, "total_issues_assigned": 0, "total_issues_assigned_pages": 1, "total_issues_created": 1, From b70bb2ee09e6191ffe385031bb446af82c52a29c Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:12:45 +0000 Subject: [PATCH 3/7] Adjust get_pull_request_of_user to be more flexible for the API use-case This basically allows the API to directly return the PRs filed or actionable by the user (actionable being all the user's PRs minus the ones they filed). Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index f18bd8b..fbe4fbf 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -4247,10 +4247,16 @@ def could_be_text(text): def get_pull_request_of_user( - session, username, status=None, offset=None, limit=None): + session, username, status=None, filed=None, actionable=None, + offset=None, limit=None, count=False): '''List the opened pull-requests of an user. These pull-requests have either been opened by that user or against projects that user has commit on. + + If filed: only the PRs opened/filed by the specified username will be + returned. + If actionable: only the PRs not opened/filed by the specified username + will be returned. ''' projects = session.query( sqlalchemy.distinct(model.Project.id) @@ -4344,12 +4350,26 @@ def get_pull_request_of_user( model.PullRequest.status == status ) + if filed: + query = query.filter( + model.PullRequest.user_id == model.User.id, + model.User.user == filed + ) + elif actionable: + query = query.filter( + model.PullRequest.user_id == model.User.id, + model.User.user != actionable + ) + if offset: query = query.offset(offset) if limit: query = query.limit(limit) - return query.all() + if count: + return query.count() + else: + return query.all() def update_watch_status(session, project, user, watch): From c92d9816b0a7c25f3a53b6f7cd02c4fe8adc9fca Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:12:45 +0000 Subject: [PATCH 4/7] Paginate the API endpoints /api/0/user//requests/filed Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/api/user.py b/pagure/api/user.py index 3b7cbb0..4f0f8e0 100644 --- a/pagure/api/user.py +++ b/pagure/api/user.py @@ -713,9 +713,6 @@ def api_view_user_requests_filed(username): | | | | whose activity you are | | | | | interested in. | +---------------+----------+--------------+----------------------------+ - | ``page`` | integer | Mandatory | | The page requested. | - | | | | Defaults to 1. | - +---------------+----------+--------------+----------------------------+ | ``status`` | string | Optional | | Filter the status of | | | | | pull requests. Default: | | | | | ``Open`` (open pull | @@ -728,6 +725,13 @@ def api_view_user_requests_filed(username): | | | | ``All`` returns closed, | | | | | merged and open requests.| +---------------+----------+--------------+----------------------------+ + | ``page`` | integer | Mandatory | | The page requested. | + | | | | Defaults to 1. | + +---------------+----------+--------------+----------------------------+ + | ``per_page`` | int | Optional | | The number of items to | + | | | | return per page. | + | | | | The maximum is 100. | + +---------------+----------+--------------+----------------------------+ Sample response @@ -869,19 +873,11 @@ def api_view_user_requests_filed(username): """ status = flask.request.args.get('status', 'open') - page = flask.request.args.get('page', 1) - try: - page = int(page) - if page <= 0: - raise ValueError() - except ValueError: - raise pagure.exceptions.APIError( - 400, error_code=APIERROR.ENOCODE, - error='Invalid page requested') - - offset = (page - 1) * 50 - limit = page * 50 + page = get_page() + per_page = get_per_page() + offset = (page - 1) * per_page + limit = per_page orig_status = status if status.lower() == 'all': @@ -889,10 +885,20 @@ def api_view_user_requests_filed(username): else: status = status.capitalize() + pullrequests_cnt = pagure.lib.get_pull_request_of_user( + flask.g.session, + username=username, + status=status, + count=True, + ) + pagination = pagure.lib.get_pagination_metadata( + flask.request, page, per_page, pullrequests_cnt) + pullrequests = pagure.lib.get_pull_request_of_user( flask.g.session, username=username, status=status, + filed=username, offset=offset, limit=limit, ) @@ -900,7 +906,6 @@ def api_view_user_requests_filed(username): pullrequestslist = [ pr.to_json(public=True, api=True) for pr in pullrequests - if pr.user.username == username ] return flask.jsonify({ @@ -910,7 +915,8 @@ def api_view_user_requests_filed(username): 'username': username, 'status': orig_status, 'page': page, - } + }, + 'pagination': pagination, }) From cba0992c78f9e7b8140f7aeafe3e22b5f8b9d25b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:12:45 +0000 Subject: [PATCH 5/7] Paginate the API endpoints /api/0/user//requests/actionable Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/api/user.py b/pagure/api/user.py index 4f0f8e0..986a96f 100644 --- a/pagure/api/user.py +++ b/pagure/api/user.py @@ -1103,19 +1103,11 @@ def api_view_user_requests_actionable(username): """ status = flask.request.args.get('status', 'open') - page = flask.request.args.get('page', 1) - try: - page = int(page) - if page <= 0: - raise ValueError() - except ValueError: - raise pagure.exceptions.APIError( - 400, error_code=APIERROR.ENOCODE, - error='Invalid page requested') - - offset = (page - 1) * 50 - limit = page * 50 + page = get_page() + per_page = get_per_page() + offset = (page - 1) * per_page + limit = per_page orig_status = status if status.lower() == 'all': @@ -1123,10 +1115,20 @@ def api_view_user_requests_actionable(username): else: status = status.capitalize() + pullrequests_cnt = pagure.lib.get_pull_request_of_user( + flask.g.session, + username=username, + status=status, + count=True, + ) + pagination = pagure.lib.get_pagination_metadata( + flask.request, page, per_page, pullrequests_cnt) + pullrequests = pagure.lib.get_pull_request_of_user( flask.g.session, username=username, status=status, + actionable=username, offset=offset, limit=limit, ) @@ -1134,7 +1136,6 @@ def api_view_user_requests_actionable(username): pullrequestslist = [ pr.to_json(public=True, api=True) for pr in pullrequests - if pr.user.username != username ] return flask.jsonify({ @@ -1144,5 +1145,6 @@ def api_view_user_requests_actionable(username): 'username': username, 'status': orig_status, 'page': page, - } + }, + 'pagination': pagination, }) From fc03a32c7ce49a1e511bf7830d31013551a37fc9 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:12:45 +0000 Subject: [PATCH 6/7] Test the structure of the data returned Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index faa9be6..e8d0450 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -811,6 +811,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "pingou") self.assertEqual(data['requests'][1]['user']['name'], "pingou") self.assertEqual(data['requests'][0]['status'], "Open") @@ -827,6 +830,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "pingou") self.assertEqual(data['requests'][1]['user']['name'], "pingou") self.assertEqual(data['requests'][0]['status'], "Open") @@ -843,6 +849,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "pingou") self.assertEqual(data['requests'][1]['user']['name'], "pingou") self.assertEqual(data['requests'][0]['status'], "Closed") @@ -859,6 +868,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "pingou") self.assertEqual(data['requests'][1]['user']['name'], "pingou") self.assertEqual(data['requests'][0]['status'], "Merged") @@ -875,6 +887,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 6) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "pingou") self.assertEqual(data['requests'][1]['user']['name'], "pingou") self.assertEqual(data['requests'][2]['user']['name'], "pingou") @@ -903,6 +918,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 0) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['args']['page'], 2) @patch('pagure.lib.notify.send_email') @@ -917,6 +935,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "foo") self.assertEqual(data['requests'][1]['user']['name'], "foo") self.assertEqual(data['requests'][0]['status'], "Open") @@ -933,6 +954,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "foo") self.assertEqual(data['requests'][1]['user']['name'], "foo") self.assertEqual(data['requests'][0]['status'], "Open") @@ -949,6 +973,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "foo") self.assertEqual(data['requests'][1]['user']['name'], "foo") self.assertEqual(data['requests'][0]['status'], "Closed") @@ -965,6 +992,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 2) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "foo") self.assertEqual(data['requests'][1]['user']['name'], "foo") self.assertEqual(data['requests'][0]['status'], "Merged") @@ -981,6 +1011,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 6) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['requests'][0]['user']['name'], "foo") self.assertEqual(data['requests'][1]['user']['name'], "foo") self.assertEqual(data['requests'][2]['user']['name'], "foo") @@ -1009,6 +1042,9 @@ class PagureFlaskApiUsertestrequests(tests.Modeltests): data = json.loads(output.get_data(as_text=True)) self.assertEqual(len(data['requests']), 0) + self.assertEqual( + sorted(data.keys()), + [u'args', u'pagination', u'requests', u'total_requests']) self.assertEqual(data['args']['page'], 2) From 610db7231bc4ff0866a81640051c392dc116843a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 17 2018 08:13:23 +0000 Subject: [PATCH 7/7] Make the pagination links stable accross CI and local tests Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_api_group.py b/tests/test_pagure_flask_api_group.py index e89385c..8efbd66 100644 --- a/tests/test_pagure_flask_api_group.py +++ b/tests/test_pagure_flask_api_group.py @@ -123,6 +123,9 @@ class PagureFlaskApiGroupTests(tests.SimplePagureTest): output = self.app.get('/api/0/groups?extended=1') self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' self.assertEqual( data, { @@ -141,10 +144,8 @@ class PagureFlaskApiGroupTests(tests.SimplePagureTest): } ], u'pagination': { - u'first': u'http://localhost/api/0/groups?' - 'per_page=20&extended=1&page=1', - u'last': u'http://localhost/api/0/groups?' - 'per_page=20&extended=1&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index c43db63..dc1cc70 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -1144,6 +1144,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1160,8 +1164,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1194,6 +1198,9 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' self.assertDictEqual( data, @@ -1211,8 +1218,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1248,6 +1255,9 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' self.assertDictEqual( data, @@ -1265,8 +1275,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1286,6 +1296,9 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' self.assertDictEqual( data, @@ -1303,8 +1316,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1340,6 +1353,9 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' self.assertDictEqual( data, @@ -1357,8 +1373,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1378,6 +1394,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1394,8 +1414,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1412,6 +1432,10 @@ 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' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1428,8 +1452,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[0]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?status=Closed&page=1&per_page=20', - u'last': u'http://localhost/api/0/test/issues?status=Closed&page=1&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1444,6 +1468,10 @@ 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)) + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1460,8 +1488,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?status=Invalid&page=1&per_page=20', - u'last': u'http://localhost/api/0/test/issues?status=Invalid&page=0&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 0, @@ -1479,6 +1507,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['last_updated'] = '1431414800' data['issues'][idx]['date_created'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1495,8 +1527,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[0], FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?status=All&page=1&per_page=20', - u'last': u'http://localhost/api/0/test/issues?status=All&page=1&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1555,6 +1587,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['last_updated'] = '1431414800' data['issues'][idx]['date_created'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + expected = { "args": { "assignee": None, @@ -1569,8 +1605,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [FULL_ISSUE_LIST[8]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1&order=asc', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1&order=asc', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1627,6 +1663,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + lcl_issues = copy.deepcopy(LCL_ISSUES) lcl_issues[0]['milestone'] = 'v1.0' self.assertDictEqual( @@ -1645,8 +1685,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": lcl_issues, u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1664,6 +1704,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1680,8 +1724,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [lcl_issues[0]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&milestones=v1.0&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&milestones=v1.0&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1743,6 +1787,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + lcl_issues = copy.deepcopy(LCL_ISSUES) lcl_issues[0]['priority'] = 1 self.assertDictEqual( @@ -1761,8 +1809,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": lcl_issues, u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1780,6 +1828,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1796,8 +1848,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [lcl_issues[0]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?priority=high&page=1&per_page=20', - u'last': u'http://localhost/api/0/test/issues?priority=high&page=1&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1814,6 +1866,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1830,8 +1886,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [lcl_issues[0]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?priority=1&page=1&per_page=20', - u'last': u'http://localhost/api/0/test/issues?priority=1&page=1&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1910,6 +1966,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + lcl_issues = copy.deepcopy(LCL_ISSUES) lcl_issues[0]['milestone'] = 'v1.0' self.assertDictEqual( @@ -1928,8 +1988,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": lcl_issues, u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1947,6 +2007,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1963,8 +2027,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [lcl_issues[1]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1&no_stones=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1&no_stones=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -1982,6 +2046,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -1998,8 +2066,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [lcl_issues[0]], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1&no_stones=0', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1&no_stones=0', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2086,6 +2154,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2102,8 +2174,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": LCL_ISSUES, u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2124,6 +2196,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2140,8 +2216,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": LCL_ISSUES, u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % start, - u'last': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % start, + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2159,6 +2235,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2175,8 +2255,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": LCL_ISSUES[:1], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % middle, - u'last': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % middle, + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2194,6 +2274,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['date_created'] = '1431414800' data['issues'][idx]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2210,8 +2294,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): }, "issues": [], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % final, - u'last': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=0' % final, + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 0, @@ -2232,6 +2316,10 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): for idx in range(len(data['issues'])): data['issues'][idx]['last_updated'] = '1431414800' data['issues'][idx]['date_created'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2267,8 +2355,8 @@ class PagureFlaskApiIssuetests(tests.SimplePagureTest): 'user': {'fullname': 'PY C', 'name': 'pingou'}} ], u'pagination': { - u'first': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % final, - u'last': u'http://localhost/api/0/test/issues?per_page=20&since=%s&page=1' % final, + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 3fd2b08..3486d7e 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -2342,6 +2342,10 @@ 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' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2384,8 +2388,8 @@ class PagurePrivateRepotest(tests.Modeltests): } ], 'pagination': { - u'first': u'http://localhost/api/0/test4/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test4/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2419,6 +2423,10 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' data['issues'][1]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2482,8 +2490,8 @@ class PagurePrivateRepotest(tests.Modeltests): } ], 'pagination': { - u'first': u'http://localhost/api/0/test4/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test4/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2510,6 +2518,10 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' data['issues'][1]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2573,8 +2585,8 @@ class PagurePrivateRepotest(tests.Modeltests): } ], 'pagination': { - u'first': u'http://localhost/api/0/test4/issues?per_page=20&page=1', - u'last': u'http://localhost/api/0/test4/issues?per_page=20&page=1', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, @@ -2591,6 +2603,10 @@ 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)) + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2607,8 +2623,8 @@ class PagurePrivateRepotest(tests.Modeltests): }, "issues": [], 'pagination': { - u'first': u'http://localhost/api/0/test4/issues?status=Closed&page=1&per_page=20', - u'last': u'http://localhost/api/0/test4/issues?status=Closed&page=0&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 0, @@ -2624,6 +2640,10 @@ 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)) + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2640,8 +2660,8 @@ class PagurePrivateRepotest(tests.Modeltests): }, "issues": [], 'pagination': { - u'first': u'http://localhost/api/0/test4/issues?status=Invalid&page=1&per_page=20', - u'last': u'http://localhost/api/0/test4/issues?status=Invalid&page=0&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 0, @@ -2661,6 +2681,10 @@ class PagurePrivateRepotest(tests.Modeltests): data['issues'][0]['last_updated'] = '1431414800' data['issues'][1]['date_created'] = '1431414800' data['issues'][1]['last_updated'] = '1431414800' + for k in ['first', 'last']: + self.assertIsNotNone(data['pagination'][k]) + data['pagination'][k] = 'http://localhost...' + self.assertDictEqual( data, { @@ -2724,8 +2748,8 @@ class PagurePrivateRepotest(tests.Modeltests): } ], 'pagination': { - u'first': u'http://localhost/api/0/test4/issues?status=All&page=1&per_page=20', - u'last': u'http://localhost/api/0/test4/issues?status=All&page=1&per_page=20', + u'first': u'http://localhost...', + u'last': u'http://localhost...', u'next': None, u'page': 1, u'pages': 1, diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index e8d0450..5c37dc1 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -71,8 +71,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): exp = { "forks": [], 'forks_pagination': { - 'first': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=1', - 'last': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=0', + 'first': 'http://localhost...', + 'last': 'http://localhost...', 'next': None, 'forkpage': 1, 'pages': 0, @@ -80,8 +80,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): 'prev': None}, "repos": [], 'repos_pagination': { - 'first': u'http://localhost/api/0/user/pingou?per_page=20&repopage=1', - 'last': u'http://localhost/api/0/user/pingou?per_page=20&repopage=0', + 'first': 'http://localhost...', + 'last': 'http://localhost...', 'next': None, 'repopage': 1, 'pages': 0, @@ -89,6 +89,10 @@ class PagureFlaskApiUSertests(tests.Modeltests): 'prev': None}, "user": { "fullname": "PY C", "name": "pingou"}} data = json.loads(output.get_data(as_text=True)) + for k in ['forks_pagination', 'repos_pagination']: + for k2 in ['first', 'last']: + self.assertIsNotNone(data[k][k2]) + data[k][k2] = 'http://localhost...' self.assertEqual(data, exp) def test_api_view_user_with_project(self): @@ -107,11 +111,15 @@ class PagureFlaskApiUSertests(tests.Modeltests): data['repos'][1]['date_modified'] = "1490272832" data['repos'][2]['date_created'] = "1490272832" data['repos'][2]['date_modified'] = "1490272832" + for k in ['forks_pagination', 'repos_pagination']: + for k2 in ['first', 'last']: + self.assertIsNotNone(data[k][k2]) + data[k][k2] = 'http://localhost...' expected_data = { "forks": [], 'forks_pagination': { - 'first': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=1', - 'last': u'http://localhost/api/0/user/pingou?per_page=20&forkpage=0', + 'first': 'http://localhost...', + 'last': 'http://localhost...', 'next': None, 'forkpage': 1, 'pages': 0, @@ -227,8 +235,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): } ], 'repos_pagination': { - 'first': u'http://localhost/api/0/user/pingou?per_page=20&repopage=1', - 'last': u'http://localhost/api/0/user/pingou?per_page=20&repopage=1', + 'first': 'http://localhost...', + 'last': 'http://localhost...', 'next': None, 'repopage': 1, 'pages': 1, @@ -1081,6 +1089,10 @@ class PagureFlaskApiUsertestissues(tests.Modeltests): output = self.app.get('/api/0/user/foo/issues') self.assertEqual(output.status_code, 200) data = json.loads(output.get_data(as_text=True)) + for k in ['pagination_issues_assigned', 'pagination_issues_created']: + for k2 in ['first', 'last']: + self.assertIsNotNone(data[k][k2]) + data[k][k2] = None self.assertEqual( data, { @@ -1099,16 +1111,16 @@ class PagureFlaskApiUsertestissues(tests.Modeltests): "issues_assigned": [], "issues_created": [], 'pagination_issues_assigned': { - 'first': u'http://localhost/api/0/user/foo/issues?per_page=20&page=1', - 'last': u'http://localhost/api/0/user/foo/issues?per_page=20&page=0', + 'first': None, + 'last': None, 'next': None, 'page': 1, 'pages': 0, 'per_page': 20, 'prev': None}, 'pagination_issues_created': { - 'first': u'http://localhost/api/0/user/foo/issues?per_page=20&page=1', - 'last': u'http://localhost/api/0/user/foo/issues?per_page=20&page=0', + 'first': None, + 'last': None, 'next': None, 'page': 1, 'pages': 0, @@ -1135,6 +1147,10 @@ class PagureFlaskApiUsertestissues(tests.Modeltests): issue['project']['date_modified'] = '1513111778' issues.append(issue) data['issues_created'] = issues + for k in ['pagination_issues_assigned', 'pagination_issues_created']: + for k2 in ['first', 'last']: + self.assertIsNotNone(data[k][k2]) + data[k][k2] = None self.assertEqual( data, { @@ -1215,16 +1231,16 @@ class PagureFlaskApiUsertestissues(tests.Modeltests): } ], 'pagination_issues_assigned': { - 'first': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=1', - 'last': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=0', + 'first': None, + 'last': None, 'next': None, 'page': 1, 'pages': 0, 'per_page': 20, 'prev': None}, 'pagination_issues_created': { - 'first': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=1', - 'last': u'http://localhost/api/0/user/pingou/issues?per_page=20&page=1', + 'first': None, + 'last': None, 'next': None, 'page': 1, 'pages': 1,