Procházet zdrojové kódy

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 <pingou@pingoured.fr>
Pierre-Yves Chibon před 6 roky
rodič
revize
9c6ee5e3b7
2 změnil soubory, kde provedl 146 přidání a 2 odebrání
  1. 7 2
      pagure/api/user.py
  2. 139 0
      tests/test_pagure_flask_api_issue.py

+ 7 - 2
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),

+ 139 - 0
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)