#2755 Add API endpoints for listing pull requests for a user
Merged 6 years ago by pingou. Opened 6 years ago by ryanlerch.
ryanlerch/pagure userrequests-api  into  master

file modified
+413
@@ -353,3 +353,416 @@ 

          )

      )

      return jsonout

+ 

+ 

+ @API.route('/user/<username>/requests/filed')

+ @api_method

+ def api_view_user_requests_filed(username):

+     """

+     Pull requests that were filed by a user over all projects

+     -------------------

+     Use this endpoint to retrieve a list of open pull requests a user has filed

+     over the entire pagure instance.

+ 

+     ::

+ 

+         GET /api/0/user/<username>/requests/filed

+ 

+     ::

+ 

+         GET /api/0/user/dudemcpants/requests/filed

+ 

+     Parameters

+     ^^^^^^^^^^

+ 

+     +---------------+----------+--------------+----------------------------+

+     | Key           | Type     | Optionality  | Description                |

+     +===============+==========+==============+============================+

+     | ``username``  | string   | Mandatory    | | The username of the user |

+     |               |          |              |   whose activity you are   |

+     |               |          |              |   interested in.           |

+     +---------------+----------+--------------+----------------------------+

+     | ``status``    | string   | Optional     | | Filter the status of     |

+     |               |          |              |   pull requests. Default:  |

+     |               |          |              |   ``Open`` (open pull      |

+     |               |          |              |   requests), can be        |

+     |               |          |              |   ``Closed`` for closed    |

+     |               |          |              |   requests, ``Merged``     |

+     |               |          |              |   for merged requests, or  |

+     |               |          |              |   ``Open`` for open        |

+     |               |          |              |   requests.                |

+     |               |          |              |   ``All`` returns closed,  |

+     |               |          |              |   merged and open requests.|

+     +---------------+----------+--------------+----------------------------+

+ 

+ 

+     Sample response

+     ^^^^^^^^^^^^^^^

+ 

+     ::

+     {

+     "args": {

+         "status": "open",

+         "username": "dudemcpants"

+     },

+     "requests": [

+         {

+         "assignee": null,

+         "branch": "master",

+         "branch_from": "master",

+         "closed_at": null,

+         "closed_by": null,

+         "comments": [],

+         "commit_start": "3973fae98fc485783ca14f5c3612d85832185065",

+         "commit_stop": "3973fae98fc485783ca14f5c3612d85832185065",

+         "date_created": "1510227832",

+         "id": 2,

+         "initial_comment": null,

+         "last_updated": "1510227833",

+         "project": {

+             "access_groups": {

+             "admin": [],

+             "commit": [],

+             "ticket": []

+             },

+             "access_users": {

+             "admin": [],

+             "commit": [],

+             "owner": [

+                 "ryanlerch"

+             ],

+             "ticket": []

+             },

+             "close_status": [],

+             "custom_keys": [],

+             "date_created": "1510227638",

+             "date_modified": "1510227638",

+             "description": "this is a quick project",

+             "fullname": "aquickproject",

+             "id": 1,

+             "milestones": {},

+             "name": "aquickproject",

+             "namespace": null,

+             "parent": null,

+             "priorities": {},

+             "tags": [],

+             "url_path": "aquickproject",

+             "user": {

+             "fullname": "ryanlerch",

+             "name": "ryanlerch"

+             }

+         },

+         "remote_git": null,

+         "repo_from": {

+             "access_groups": {

+             "admin": [],

+             "commit": [],

+             "ticket": []

+             },

+             "access_users": {

+             "admin": [],

+             "commit": [],

+             "owner": [

+                 "dudemcpants"

+             ],

+             "ticket": []

+             },

+             "close_status": [],

+             "custom_keys": [],

+             "date_created": "1510227729",

+             "date_modified": "1510227729",

+             "description": "this is a quick project",

+             "fullname": "forks/dudemcpants/aquickproject",

+             "id": 2,

+             "milestones": {},

+             "name": "aquickproject",

+             "namespace": null,

+             "parent": {

+             "access_groups": {

+                 "admin": [],

+                 "commit": [],

+                 "ticket": []

+             },

+             "access_users": {

+                 "admin": [],

+                 "commit": [],

+                 "owner": [

+                 "ryanlerch"

+                 ],

+                 "ticket": []

+             },

+             "close_status": [],

+             "custom_keys": [],

+             "date_created": "1510227638",

+             "date_modified": "1510227638",

+             "description": "this is a quick project",

+             "fullname": "aquickproject",

+             "id": 1,

+             "milestones": {},

+             "name": "aquickproject",

+             "namespace": null,

+             "parent": null,

+             "priorities": {},

+             "tags": [],

+             "url_path": "aquickproject",

+             "user": {

+                 "fullname": "ryanlerch",

+                 "name": "ryanlerch"

+             }

+             },

+             "priorities": {},

+             "tags": [],

+             "url_path": "fork/dudemcpants/aquickproject",

+             "user": {

+             "fullname": "Dude McPants",

+             "name": "dudemcpants"

+             }

+         },

+         "status": "Open",

+         "title": "Update README.md",

+         "uid": "819e0b1c449e414fa291c914f28d73ec",

+         "updated_on": "1510227832",

+         "user": {

+             "fullname": "Dude McPants",

+             "name": "dudemcpants"

+         }

+         }

+     ],

+     "total_requests": 1

+     }

+ 

+     """

+     status = flask.request.args.get('status', 'open')

+ 

+     pullrequests = pagure.lib.get_pull_request_of_user(

+         SESSION,

+         username=username

+     )

+ 

+     pullrequestslist = []

+ 

+     for pr in pullrequests:

+         if pr.user.username == username:

+             if str(status).lower() == 'all':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+             elif str(status).lower() == 'open' and pr.status == 'Open':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+             elif str(status).lower() == 'closed' and pr.status == 'Closed':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+             elif str(status).lower() == 'merged' and pr.status == 'Merged':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+ 

+     return flask.jsonify({

+         'total_requests': len(pullrequestslist),

+         'requests': pullrequestslist,

+         'args': {

+             'username': username,

+             'status': status,

+         }

+     })

+ 

+ 

+ @API.route('/user/<username>/requests/actionable')

+ @api_method

+ def api_view_user_requests_actionable(username):

+     """

+     Pull requests that are actionable by a user over all projects

+     -------------------

+     Use this endpoint to retrieve a list of open pull requests a user is able

+     to action (e.g. merge) over the entire pagure instance.

+ 

+     ::

+ 

+         GET /api/0/user/<username>/requests/actionable

+ 

+     ::

+ 

+         GET /api/0/user/dudemcpants/requests/actionable

+ 

+     Parameters

+     ^^^^^^^^^^

+ 

+     +---------------+----------+--------------+----------------------------+

+     | Key           | Type     | Optionality  | Description                |

+     +===============+==========+==============+============================+

+     | ``username``  | string   | Mandatory    | | The username of the user |

+     |               |          |              |   whose activity you are   |

+     |               |          |              |   interested in.           |

+     +---------------+----------+--------------+----------------------------+

+     | ``status``    | string   | Optional     | | Filter the status of     |

+     |               |          |              |   pull requests. Default:  |

+     |               |          |              |   ``Open`` (open pull      |

+     |               |          |              |   requests), can be        |

+     |               |          |              |   ``Closed`` for closed    |

+     |               |          |              |   requests, ``Merged``     |

+     |               |          |              |   for merged requests, or  |

+     |               |          |              |   ``Open`` for open        |

+     |               |          |              |   requests.                |

+     |               |          |              |   ``All`` returns closed,  |

+     |               |          |              |   merged and open requests.|

+     +---------------+----------+--------------+----------------------------+

+ 

+     Sample response

+     ^^^^^^^^^^^^^^^

+ 

+     ::

+     {

+     "args": {

+         "status": "open",

+         "username": "ryanlerch"

+     },

+     "requests": [

+         {

+         "assignee": null,

+         "branch": "master",

+         "branch_from": "master",

+         "closed_at": null,

+         "closed_by": null,

+         "comments": [],

+         "commit_start": "3973fae98fc485783ca14f5c3612d85832185065",

+         "commit_stop": "3973fae98fc485783ca14f5c3612d85832185065",

+         "date_created": "1510227832",

+         "id": 2,

+         "initial_comment": null,

+         "last_updated": "1510227833",

+         "project": {

+             "access_groups": {

+             "admin": [],

+             "commit": [],

+             "ticket": []

+             },

+             "access_users": {

+             "admin": [],

+             "commit": [],

+             "owner": [

+                 "ryanlerch"

+             ],

+             "ticket": []

+             },

+             "close_status": [],

+             "custom_keys": [],

+             "date_created": "1510227638",

+             "date_modified": "1510227638",

+             "description": "this is a quick project",

+             "fullname": "aquickproject",

+             "id": 1,

+             "milestones": {},

+             "name": "aquickproject",

+             "namespace": null,

+             "parent": null,

+             "priorities": {},

+             "tags": [],

+             "url_path": "aquickproject",

+             "user": {

+             "fullname": "ryanlerch",

+             "name": "ryanlerch"

+             }

+         },

+         "remote_git": null,

+         "repo_from": {

+             "access_groups": {

+             "admin": [],

+             "commit": [],

+             "ticket": []

+             },

+             "access_users": {

+             "admin": [],

+             "commit": [],

+             "owner": [

+                 "dudemcpants"

+             ],

+             "ticket": []

+             },

+             "close_status": [],

+             "custom_keys": [],

+             "date_created": "1510227729",

+             "date_modified": "1510227729",

+             "description": "this is a quick project",

+             "fullname": "forks/dudemcpants/aquickproject",

+             "id": 2,

+             "milestones": {},

+             "name": "aquickproject",

+             "namespace": null,

+             "parent": {

+             "access_groups": {

+                 "admin": [],

+                 "commit": [],

+                 "ticket": []

+             },

+             "access_users": {

+                 "admin": [],

+                 "commit": [],

+                 "owner": [

+                 "ryanlerch"

+                 ],

+                 "ticket": []

+             },

+             "close_status": [],

+             "custom_keys": [],

+             "date_created": "1510227638",

+             "date_modified": "1510227638",

+             "description": "this is a quick project",

+             "fullname": "aquickproject",

+             "id": 1,

+             "milestones": {},

+             "name": "aquickproject",

+             "namespace": null,

+             "parent": null,

+             "priorities": {},

+             "tags": [],

+             "url_path": "aquickproject",

+             "user": {

+                 "fullname": "ryanlerch",

+                 "name": "ryanlerch"

+             }

+             },

+             "priorities": {},

+             "tags": [],

+             "url_path": "fork/dudemcpants/aquickproject",

+             "user": {

+             "fullname": "Dude McPants",

+             "name": "dudemcpants"

+             }

+         },

+         "status": "Open",

+         "title": "Update README.md",

+         "uid": "819e0b1c449e414fa291c914f28d73ec",

+         "updated_on": "1510227832",

+         "user": {

+             "fullname": "Dude McPants",

+             "name": "dudemcpants"

+         }

+         }

+     ],

+     "total_requests": 1

+     }

+ 

+     """

+     status = flask.request.args.get('status', 'open')

+ 

+     pullrequests = pagure.lib.get_pull_request_of_user(

+         SESSION,

+         username=username

+     )

+ 

+     pullrequestslist = []

+ 

+     for pr in pullrequests:

+         if pr.user.username != username:

+             if str(status).lower() == 'all':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+             elif str(status).lower() == 'open' and pr.status == 'Open':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+             elif str(status).lower() == 'closed' and pr.status == 'Closed':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+             elif str(status).lower() == 'merged' and pr.status == 'Merged':

+                 pullrequestslist.append(pr.to_json(public=True, api=True))

+ 

+     return flask.jsonify({

+         'total_requests': len(pullrequestslist),

+         'requests': pullrequestslist,

+         'args': {

+             'username': username,

+             'status': status,

+         }

+     })

@@ -463,5 +463,386 @@ 

          self.assertEqual(data, exp)

  

  

+ class PagureFlaskApiUsertestrequests(tests.Modeltests):

+     """ Tests for the user requests endpoints """

+ 

+     maxDiff = None

+ 

+     def setUp(self):

+         """ Set up the environnment, ran before every tests. """

+         super(PagureFlaskApiUsertestrequests, self).setUp()

+ 

+         pagure.APP.config['TESTING'] = True

+         pagure.SESSION = self.session

+         pagure.api.SESSION = self.session

+         pagure.api.fork.SESSION = self.session

+         pagure.api.user.SESSION = self.session

+         pagure.lib.SESSION = self.session

+ 

+         pagure.APP.config['REQUESTS_FOLDER'] = None

+ 

+         tests.create_projects(self.session)

+ 

+         # Create few pull-requests

+         repo = pagure.get_authorized_project(self.session, 'test')

+         forked_repo = pagure.get_authorized_project(self.session, 'test')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='open pullrequest by user foo on repo test',

+             user='foo',

+             requestfolder=None,

+         )

+         

+         repo = pagure.get_authorized_project(self.session, 'test2')

+         forked_repo = pagure.get_authorized_project(self.session, 'test2')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='open pullrequest by user foo on repo test2',

+             user='foo',

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test')

+         forked_repo = pagure.get_authorized_project(self.session, 'test')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='closed pullrequest by user foo on repo test',

+             user='foo',

+             status='Closed',

+             requestfolder=None,

+         )

+         

+         repo = pagure.get_authorized_project(self.session, 'test2')

+         forked_repo = pagure.get_authorized_project(self.session, 'test2')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='closed pullrequest by user foo on repo test2',

+             user='foo',

+             status='Closed',

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test')

+         forked_repo = pagure.get_authorized_project(self.session, 'test')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='merged pullrequest by user foo on repo test',

+             user='foo',

+             status='Merged',

+             requestfolder=None,

+         )

+         

+         repo = pagure.get_authorized_project(self.session, 'test2')

+         forked_repo = pagure.get_authorized_project(self.session, 'test2')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='merged pullrequest by user foo on repo test2',

+             user='foo',

+             status='Merged',

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test')

+         forked_repo = pagure.get_authorized_project(self.session, 'test')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='open pullrequest by user pingou on repo test',

+             user='pingou',

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test2')

+         forked_repo = pagure.get_authorized_project(self.session, 'test2')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='open pullrequest by user pingou on repo test2',

+             user='pingou',

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test')

+         forked_repo = pagure.get_authorized_project(self.session, 'test')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='closed pullrequest by user pingou on repo test',

+             user='pingou',

+             status="Closed",

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test2')

+         forked_repo = pagure.get_authorized_project(self.session, 'test2')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='closed pullrequest by user pingou on repo test2',

+             user='pingou',

+             status="Closed",

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test')

+         forked_repo = pagure.get_authorized_project(self.session, 'test')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='merged pullrequest by user pingou on repo test',

+             user='pingou',

+             status="Merged",

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+         repo = pagure.get_authorized_project(self.session, 'test2')

+         forked_repo = pagure.get_authorized_project(self.session, 'test2')

+         pagure.lib.new_pull_request(

+             session=self.session,

+             repo_from=forked_repo,

+             branch_from='master',

+             repo_to=repo,

+             branch_to='master',

+             title='merged pullrequest by user pingou on repo test2',

+             user='pingou',

+             status="Merged",

+             requestfolder=None,

+         )

+         self.session.commit()

+ 

+     @patch('pagure.lib.notify.send_email')

+     def test_api_view_user_requests_filed(self, mockemail):

+         """ Test the api_view_user_requests_filed method of the flask user

+         api """

+ 

+         # First we test without the status parameter. It should default to `open`

+         output = self.app.get(

+             '/api/0/user/pingou/requests/filed')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][1]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][0]['status'], "Open")

+         self.assertEqual(data['requests'][1]['status'], "Open")

+         self.assertEqual(data['requests'][0]['title'], "open pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "open pullrequest by user pingou on repo test")

+         self.assertEqual(data['args']['status'], "open")

+ 

+         # Next test with the status parameter set to `open`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/filed?status=open')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][1]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][0]['status'], "Open")

+         self.assertEqual(data['requests'][1]['status'], "Open")

+         self.assertEqual(data['requests'][0]['title'], "open pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "open pullrequest by user pingou on repo test")

+         self.assertEqual(data['args']['status'], "open")

+ 

+         # Next test with the status parameter set to `closed`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/filed?status=closed')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][1]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][0]['status'], "Closed")

+         self.assertEqual(data['requests'][1]['status'], "Closed")

+         self.assertEqual(data['requests'][0]['title'], "closed pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "closed pullrequest by user pingou on repo test")

+         self.assertEqual(data['args']['status'], "closed")

+ 

+         # Next test with the status parameter set to `merged`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/filed?status=merged')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][1]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][0]['status'], "Merged")

+         self.assertEqual(data['requests'][1]['status'], "Merged")

+         self.assertEqual(data['requests'][0]['title'], "merged pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "merged pullrequest by user pingou on repo test")

+         self.assertEqual(data['args']['status'], "merged")

+ 

+         # Finally, test with the status parameter set to `all`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/filed?status=all')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 6)

+         self.assertEqual(data['requests'][0]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][1]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][2]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][3]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][4]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][5]['user']['name'], "pingou")

+         self.assertEqual(data['requests'][0]['status'], "Merged")

+         self.assertEqual(data['requests'][1]['status'], "Merged")

+         self.assertEqual(data['requests'][2]['status'], "Closed")

+         self.assertEqual(data['requests'][3]['status'], "Closed")

+         self.assertEqual(data['requests'][4]['status'], "Open")

+         self.assertEqual(data['requests'][5]['status'], "Open")

+         self.assertEqual(data['requests'][0]['title'], "merged pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "merged pullrequest by user pingou on repo test")        

+         self.assertEqual(data['requests'][2]['title'], "closed pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][3]['title'], "closed pullrequest by user pingou on repo test")

+         self.assertEqual(data['requests'][4]['title'], "open pullrequest by user pingou on repo test2")

+         self.assertEqual(data['requests'][5]['title'], "open pullrequest by user pingou on repo test")

+         self.assertEqual(data['args']['status'], "all")

+ 

+     @patch('pagure.lib.notify.send_email')

+     def test_api_view_user_requests_actionable(self, mockemail):

+         """ Test the api_view_user_requests_actionable method of the flask user

+         api """

+ 

+         # First we test without the status parameter. It should default to `open`

+         output = self.app.get(

+             '/api/0/user/pingou/requests/actionable')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "foo")

+         self.assertEqual(data['requests'][1]['user']['name'], "foo")

+         self.assertEqual(data['requests'][0]['status'], "Open")

+         self.assertEqual(data['requests'][1]['status'], "Open")

+         self.assertEqual(data['requests'][0]['title'], "open pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "open pullrequest by user foo on repo test")

+         self.assertEqual(data['args']['status'], "open")

+ 

+         # Next test with the status parameter set to `open`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/actionable?status=open')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "foo")

+         self.assertEqual(data['requests'][1]['user']['name'], "foo")

+         self.assertEqual(data['requests'][0]['status'], "Open")

+         self.assertEqual(data['requests'][1]['status'], "Open")

+         self.assertEqual(data['requests'][0]['title'], "open pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "open pullrequest by user foo on repo test")

+         self.assertEqual(data['args']['status'], "open")

+ 

+         # Next test with the status parameter set to `closed`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/actionable?status=closed')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "foo")

+         self.assertEqual(data['requests'][1]['user']['name'], "foo")

+         self.assertEqual(data['requests'][0]['status'], "Closed")

+         self.assertEqual(data['requests'][1]['status'], "Closed")

+         self.assertEqual(data['requests'][0]['title'], "closed pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "closed pullrequest by user foo on repo test")

+         self.assertEqual(data['args']['status'], "closed")

+ 

+         # Next test with the status parameter set to `merged`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/actionable?status=merged')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 2)

+         self.assertEqual(data['requests'][0]['user']['name'], "foo")

+         self.assertEqual(data['requests'][1]['user']['name'], "foo")

+         self.assertEqual(data['requests'][0]['status'], "Merged")

+         self.assertEqual(data['requests'][1]['status'], "Merged")

+         self.assertEqual(data['requests'][0]['title'], "merged pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "merged pullrequest by user foo on repo test")

+         self.assertEqual(data['args']['status'], "merged")

+ 

+         # Finally, test with the status parameter set to `all`.

+         output = self.app.get(

+             '/api/0/user/pingou/requests/actionable?status=all')

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+ 

+         self.assertEqual(len(data['requests']), 6)

+         self.assertEqual(data['requests'][0]['user']['name'], "foo")

+         self.assertEqual(data['requests'][1]['user']['name'], "foo")

+         self.assertEqual(data['requests'][2]['user']['name'], "foo")

+         self.assertEqual(data['requests'][3]['user']['name'], "foo")

+         self.assertEqual(data['requests'][4]['user']['name'], "foo")

+         self.assertEqual(data['requests'][5]['user']['name'], "foo")

+         self.assertEqual(data['requests'][0]['status'], "Merged")

+         self.assertEqual(data['requests'][1]['status'], "Merged")

+         self.assertEqual(data['requests'][2]['status'], "Closed")

+         self.assertEqual(data['requests'][3]['status'], "Closed")

+         self.assertEqual(data['requests'][4]['status'], "Open")

+         self.assertEqual(data['requests'][5]['status'], "Open")

+         self.assertEqual(data['requests'][0]['title'], "merged pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][1]['title'], "merged pullrequest by user foo on repo test")        

+         self.assertEqual(data['requests'][2]['title'], "closed pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][3]['title'], "closed pullrequest by user foo on repo test")

+         self.assertEqual(data['requests'][4]['title'], "open pullrequest by user foo on repo test2")

+         self.assertEqual(data['requests'][5]['title'], "open pullrequest by user foo on repo test")

+         self.assertEqual(data['args']['status'], "all")

+ 

+ 

+         

+ 

Quite a few empty lines there :)

  if __name__ == '__main__':

      unittest.main(verbosity=2)

There is the requests page for a user that is currently available in the web UI and it lists all the pull requests for a user (across all projects in a pagure instance) that are either filed by the user, or actionable by the user. e.g:

https://pagure.io/user/pingou/requests

This commit adds API endpoints for the information in both of the tables that are included in the requests HTML view:

api/0/user/<user>/requests/actionable
api/0/user/<user>/requests/filed

Signed-off-by: Ryan Lerch rlerch@redhat.com

Why not using the to_json() method?

For these two endpoints (esp the filled one) I was wondering if we should add an option to filter by status (ie: open PR vs closed vs merged vs all). What do you think?

rebased onto 9d466c5ec3a5ab538e08c7879893ae480502c767

6 years ago

For these two endpoints (esp the filled one) I was wondering if we should add an option to filter by status (ie: open PR vs closed vs merged vs all). What do you think?

Good idea! Actually, after you pointing this out, i realised that pagure.lib.get_pull_request_of_user actually returns all statuses (merged, open, and closed) -- i thought it only returned opened ones.

Long story short, i have updated the PR so it returns open requests by default, and added a param to be able to specify open, merged, closed or all.

Also updated the commit to use the to_json() method -- which i didnt use previously because i didnt know it existed :) thanks!

rebased onto 397681d

6 years ago

I'm going to merge but we'll need to add these endpoints to the API doc.

Thanks!

Pull-Request has been merged by pingou

6 years ago

@pingou oh -- i did try to check if this was manually put somewhere, but i couldn't find it in the source. I assumed that it was generated from the comments in the code.

Check the api method in pagure/api/__init__.py :)