From 9c6ee5e3b746baeefb623e3bbef227f690361628 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 23 2017 09:50:41 +0000 Subject: Small bug fix and test for the API endpoint listing user's issues We were adding the `author` filter after we had copied the dict of parameters which meant that filter wasn't being applied. This is now fixed. This commit also adds some tests for this API endpoint (which lead to the discovery of the above mentioned bug). Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/api/user.py b/pagure/api/user.py index 6416a9b..d3fce1e 100644 --- a/pagure/api/user.py +++ b/pagure/api/user.py @@ -322,12 +322,17 @@ def api_view_user_issues(username): 400, error_code=APIERROR.EDATETIME) params.update({'updated_after': updated_after}) + + # Issues authored by this user params_created = params.copy() - params_assigned = params - params.update({"author": username}) + params_created.update({"author": username}) issues_created = pagure.lib.search_issues(**params_created) + + # Issues assigned to this user + params_assigned = params.copy() params_assigned.update({"assignee": username}) issues_assigned = pagure.lib.search_issues(**params_assigned) + jsonout = flask.jsonify({ 'total_issues_created': len(issues_created), 'total_issues_assigned': len(issues_assigned), diff --git a/tests/test_pagure_flask_api_issue.py b/tests/test_pagure_flask_api_issue.py index 1a71fe1..9142544 100644 --- a/tests/test_pagure_flask_api_issue.py +++ b/tests/test_pagure_flask_api_issue.py @@ -297,6 +297,7 @@ class PagureFlaskApiIssuetests(tests.Modeltests): pagure.SESSION = self.session pagure.api.SESSION = self.session pagure.api.issue.SESSION = self.session + pagure.api.user.SESSION = self.session pagure.lib.SESSION = self.session pagure.APP.config['TICKETS_FOLDER'] = None @@ -3057,6 +3058,144 @@ class PagureFlaskApiIssuetests(tests.Modeltests): for k in sorted(data['stats'].keys())[:-1]: self.assertEqual(data['stats'][k], 0) + def test_api_view_user_issues_pingou(self): + """ Test the api_view_user_issues method of the flask api for pingou. + """ + self.test_api_new_issue() + + # Create private issue + repo = pagure.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=True, + status="Closed" + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + output = self.app.get('/api/0/user/pingou/issues') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + args = { + "milestones": [], + "no_stones": None, + "order": None, + "order_key": None, + "since": None, + "status": None, + "tags": [] + } + + self.assertEqual(data['args'], args) + self.assertEqual(data['issues_assigned'], []) + self.assertEqual(len(data['issues_created']), 8) + self.assertEqual(data['total_issues_assigned'], 0) + self.assertEqual(data['total_issues_created'], 8) + + # Restrict to a certain, fake milestone + output = self.app.get('/api/0/user/pingou/issues?milestones=v1.0') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + args = { + "milestones": ['v1.0'], + "no_stones": None, + "order": None, + "order_key": None, + "since": None, + "status": None, + "tags": [] + } + + self.assertEqual(data['args'], args) + self.assertEqual(data['issues_assigned'], []) + self.assertEqual(data['issues_created'], []) + self.assertEqual(data['total_issues_assigned'], 0) + self.assertEqual(data['total_issues_created'], 0) + + # Restrict to a certain status + output = self.app.get('/api/0/user/pingou/issues?status=closed') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + args = { + "milestones": [], + "no_stones": None, + "order": None, + "order_key": None, + "since": None, + "status": 'closed', + "tags": [] + } + + self.assertEqual(data['args'], args) + self.assertEqual(data['issues_assigned'], []) + self.assertEqual(len(data['issues_created']), 1) + self.assertEqual(data['total_issues_assigned'], 0) + self.assertEqual(data['total_issues_created'], 1) + + # Restrict to a certain status + output = self.app.get('/api/0/user/pingou/issues?status=all') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + args = { + "milestones": [], + "no_stones": None, + "order": None, + "order_key": None, + "since": None, + "status": 'all', + "tags": [] + } + + self.assertEqual(data['args'], args) + self.assertEqual(data['issues_assigned'], []) + self.assertEqual(len(data['issues_created']), 9) + self.assertEqual(data['total_issues_assigned'], 0) + self.assertEqual(data['total_issues_created'], 9) + + def test_api_view_user_issues_foo(self): + """ Test the api_view_user_issues method of the flask api for foo. + """ + self.test_api_new_issue() + + # Create private issue + repo = pagure.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=True, + status="Closed" + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + + output = self.app.get('/api/0/user/foo/issues') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + args = { + "milestones": [], + "no_stones": None, + "order": None, + "order_key": None, + "since": None, + "status": None, + "tags": [] + } + + self.assertEqual(data['args'], args) + self.assertEqual(len(data['issues_assigned']), 1) + self.assertEqual(data['issues_created'], []) + self.assertEqual(data['total_issues_assigned'], 1) + self.assertEqual(data['total_issues_created'], 0) + if __name__ == '__main__': unittest.main(verbosity=2)