changeset 5588:6b3a9655a7d9 REST-rebased

Move decorator to outside of the class Change unittest to test the new format using the decorator committer: Ralf Schlatterbeck <rsc@runtux.com>
author Chau Nguyen <dangchau1991@yahoo.com>
date Wed, 30 Jan 2019 10:26:35 +0100
parents cb2b320fde16
children 5a2de4c19109
files roundup/rest.py test/test_rest.py
diffstat 2 files changed, 114 insertions(+), 117 deletions(-) [+]
line wrap: on
line diff
--- a/roundup/rest.py	Wed Jan 30 10:26:35 2019 +0100
+++ b/roundup/rest.py	Wed Jan 30 10:26:35 2019 +0100
@@ -14,7 +14,58 @@
 import traceback
 from roundup import hyperdb
 from roundup.exceptions import *
-from roundup import xmlrpc
+
+
+def _data_decorator(func):
+    """Wrap the returned data into an object."""
+    def format_object(self, *args, **kwargs):
+        # get the data / error from function
+        try:
+            code, data = func(self, *args, **kwargs)
+        except IndexError, msg:
+            code = 404
+            data = msg
+        except Unauthorised, msg:
+            code = 403
+            data = msg
+        except (hyperdb.DesignatorError, UsageError), msg:
+            code = 400
+            data = msg
+        except (AttributeError, Reject), msg:
+            code = 405
+            data = msg
+        except ValueError, msg:
+            code = 409
+            data = msg
+        except NotImplementedError:
+            code = 402  # nothing to pay, just a mark for debugging purpose
+            data = 'Method under development'
+        except:
+            exc, val, tb = sys.exc_info()
+            code = 400
+            # if self.DEBUG_MODE in roundup_server
+            # else data = 'An error occurred. Please check...',
+            data = val
+
+            # out to the logfile
+            print 'EXCEPTION AT', time.ctime()
+            traceback.print_exc()
+
+        # decorate it
+        self.client.response_code = code
+        if code >= 400:  # any error require error format
+            result = {
+                'error': {
+                    'status': code,
+                    'msg': data
+                }
+            }
+        else:
+            result = {
+                'data': data
+            }
+        return result
+    return format_object
 
 
 class RestfulInstance(object):
@@ -89,55 +140,6 @@
 
         return prop
 
-    def _data_decorator(func):
-        """Wrap the returned data into an object.."""
-        def format_object(self, *args, **kwargs):
-            try:
-                code, data = func(self, *args, **kwargs)
-            except IndexError, msg:
-                code = 404
-                data = msg
-            except Unauthorised, msg:
-                code = 403
-                data = msg
-            except (hyperdb.DesignatorError, UsageError), msg:
-                code = 400
-                data = msg
-            except (AttributeError, Reject), msg:
-                code = 405
-                data = msg
-            except ValueError, msg:
-                code = 409
-                data = msg
-            except NotImplementedError:
-                code = 402  # nothing to pay, just a mark for debugging purpose
-                data = 'Method under development'
-            except:
-                exc, val, tb = sys.exc_info()
-                code = 400
-                # if self.DEBUG_MODE in roundup_server
-                # else data = 'An error occurred. Please check...',
-                data = val
-
-                # out to the logfile
-                print 'EXCEPTION AT', time.ctime()
-                traceback.print_exc()
-
-            self.client.response_code = code
-            if code >= 400:  # any error require error format
-                result = {
-                    'error': {
-                        'status': code,
-                        'msg': data
-                    }
-                }
-            else:
-                result = {
-                    'data': data
-                }
-            return result
-        return format_object
-
     @_data_decorator
     def get_collection(self, class_name, input):
         """GET resource from class URI.
--- a/test/test_rest.py	Wed Jan 30 10:26:35 2019 +0100
+++ b/test/test_rest.py	Wed Jan 30 10:26:35 2019 +0100
@@ -56,9 +56,9 @@
             'HTTP_HOST': 'localhost',
             'TRACKER_NAME': 'rounduptest'
         }
-        dummy_client = client.Client(self.instance, None, env, [], None)
+        self.dummy_client = client.Client(self.instance, None, env, [], None)
 
-        self.server = RestfulInstance(dummy_client, self.db)
+        self.server = RestfulInstance(self.dummy_client, self.db)
 
     def tearDown(self):
         self.db.close()
@@ -74,22 +74,22 @@
         obtain data for 'joe'
         """
         # Retrieve all three users.
-        code, results = self.server.get_collection('user', {})
-        self.assertEqual(code, 200)
-        self.assertEqual(len(results), 3)
+        results = self.server.get_collection('user', {})
+        self.assertEqual(self.dummy_client.response_code, 200)
+        self.assertEqual(len(results['data']), 3)
 
         # Obtain data for 'joe'.
-        code, results = self.server.get_element('user', self.joeid, {})
-        self.assertEqual(code, 200)
+        results = self.server.get_element('user', self.joeid, {})['data']
+        self.assertEqual(self.dummy_client.response_code, 200)
         self.assertEqual(results['attributes']['username'], 'joe')
         self.assertEqual(results['attributes']['realname'], 'Joe Random')
 
         # Obtain data for 'joe'.
-        code, results = self.server.get_attribute(
+        results = self.server.get_attribute(
             'user', self.joeid, 'username', {}
         )
-        self.assertEqual(code, 200)
-        self.assertEqual(results['data'], 'joe')
+        self.assertEqual(self.dummy_client.response_code, 200)
+        self.assertEqual(results['data']['data'], 'joe')
 
     def testPut(self):
         """
@@ -101,30 +101,29 @@
         form.list = [
             cgi.MiniFieldStorage('data', 'Joe Doe Doe')
         ]
-        code, results = self.server.put_attribute(
+        results = self.server.put_attribute(
             'user', self.joeid, 'realname', form
         )
-        code, results = self.server.get_attribute(
+        results = self.server.get_attribute(
             'user', self.joeid, 'realname', {}
         )
-        self.assertEqual(code, 200)
-        self.assertEqual(results['data'], 'Joe Doe Doe')
+        self.assertEqual(self.dummy_client.response_code, 200)
+        self.assertEqual(results['data']['data'], 'Joe Doe Doe')
 
         # Reset joe's 'realname'.
         form = cgi.FieldStorage()
         form.list = [
             cgi.MiniFieldStorage('realname', 'Joe Doe')
         ]
-        code, results = self.server.put_element('user', self.joeid, form)
-        code, results = self.server.get_element('user', self.joeid, {})
-        self.assertEqual(code, 200)
-        self.assertEqual(results['attributes']['realname'], 'Joe Doe')
+        results = self.server.put_element('user', self.joeid, form)
+        results = self.server.get_element('user', self.joeid, {})
+        self.assertEqual(self.dummy_client.response_code, 200)
+        self.assertEqual(results['data']['attributes']['realname'], 'Joe Doe')
 
         # check we can't change admin's details
-        self.assertRaises(
-            Unauthorised,
-            self.server.put_element, 'user', '1', form
-        )
+        results = self.server.put_element('user', '1', form)
+        self.assertEqual(self.dummy_client.response_code, 403)
+        self.assertEqual(results['error']['status'], 403)
 
     def testPost(self):
         """
@@ -135,12 +134,12 @@
         form.list = [
             cgi.MiniFieldStorage('title', 'foo')
         ]
-        code, results = self.server.post_collection('issue', form)
-        self.assertEqual(code, 201)
-        issueid = results['id']
-        code, results = self.server.get_element('issue', issueid, {})
-        self.assertEqual(code, 200)
-        self.assertEqual(results['attributes']['title'], 'foo')
+        results = self.server.post_collection('issue', form)
+        self.assertEqual(self.dummy_client.response_code, 201)
+        issueid = results['data']['id']
+        results = self.server.get_element('issue', issueid, {})
+        self.assertEqual(self.dummy_client.response_code, 200)
+        self.assertEqual(results['data']['attributes']['title'], 'foo')
         self.assertEqual(self.db.issue.get(issueid, "tx_Source"), 'web')
 
     def testPostFile(self):
@@ -152,11 +151,11 @@
         form.list = [
             cgi.MiniFieldStorage('content', 'hello\r\nthere')
         ]
-        code, results = self.server.post_collection('file', form)
-        self.assertEqual(code, 201)
-        fileid = results['id']
-        code, results = self.server.get_element('file', fileid, {})
-        self.assertEqual(code, 200)
+        results = self.server.post_collection('file', form)
+        self.assertEqual(self.dummy_client.response_code, 201)
+        fileid = results['data']['id']
+        results = self.server.get_element('file', fileid, {})['data']
+        self.assertEqual(self.dummy_client.response_code, 200)
         self.assertEqual(results['attributes']['content'], 'hello\r\nthere')
 
     def testAuthDeniedPut(self):
@@ -168,10 +167,9 @@
         form.list = [
             cgi.MiniFieldStorage('realname', 'someone')
         ]
-        self.assertRaises(
-            Unauthorised,
-            self.server.put_element, 'user', '1', form
-        )
+        results = self.server.put_element('user', '1', form)
+        self.assertEqual(self.dummy_client.response_code, 403)
+        self.assertEqual(results['error']['status'], 403)
 
     def testAuthDeniedPost(self):
         """
@@ -181,10 +179,9 @@
         form.list = [
             cgi.MiniFieldStorage('username', 'blah')
         ]
-        self.assertRaises(
-            Unauthorised,
-            self.server.post_collection, 'user', form
-        )
+        results = self.server.post_collection('user', form)
+        self.assertEqual(self.dummy_client.response_code, 403)
+        self.assertEqual(results['error']['status'], 403)
 
     def testAuthAllowedPut(self):
         """
@@ -196,10 +193,9 @@
             cgi.MiniFieldStorage('realname', 'someone')
         ]
         try:
-            try:
-                self.server.put_element('user', '2', form)
-            except Unauthorised, err:
-                self.fail('raised %s' % err)
+            self.server.put_element('user', '2', form)
+        except Unauthorised, err:
+            self.fail('raised %s' % err)
         finally:
             self.db.setCurrentUser('joe')
 
@@ -213,10 +209,9 @@
             cgi.MiniFieldStorage('username', 'blah')
         ]
         try:
-            try:
-                self.server.post_collection('user', form)
-            except Unauthorised, err:
-                self.fail('raised %s' % err)
+            self.server.post_collection('user', form)
+        except Unauthorised, err:
+            self.fail('raised %s' % err)
         finally:
             self.db.setCurrentUser('joe')
 
@@ -228,19 +223,19 @@
         issue_id = self.db.issue.create(title='foo', nosy=['1'])
 
         # remove the title and nosy
-        code, results = self.server.delete_attribute(
+        results = self.server.delete_attribute(
             'issue', issue_id, 'title', {}
         )
-        self.assertEqual(code, 200)
+        self.assertEqual(self.dummy_client.response_code, 200)
 
-        code, results = self.server.delete_attribute(
+        results = self.server.delete_attribute(
             'issue', issue_id, 'nosy', {}
         )
-        self.assertEqual(code, 200)
+        self.assertEqual(self.dummy_client.response_code, 200)
 
         # verify the result
-        code, results = self.server.get_element('issue', issue_id, {})
-        self.assertEqual(code, 200)
+        results = self.server.get_element('issue', issue_id, {})['data']
+        self.assertEqual(self.dummy_client.response_code, 200)
         self.assertEqual(len(results['attributes']['nosy']), 0)
         self.assertListEqual(results['attributes']['nosy'], [])
         self.assertEqual(results['attributes']['title'], None)
@@ -258,12 +253,12 @@
             cgi.MiniFieldStorage('op', 'add'),
             cgi.MiniFieldStorage('nosy', '2')
         ]
-        code, results = self.server.patch_element('issue', issue_id, form)
-        self.assertEqual(code, 200)
+        results = self.server.patch_element('issue', issue_id, form)
+        self.assertEqual(self.dummy_client.response_code, 200)
 
         # verify the result
-        code, results = self.server.get_element('issue', issue_id, {})
-        self.assertEqual(code, 200)
+        results = self.server.get_element('issue', issue_id, {})['data']
+        self.assertEqual(self.dummy_client.response_code, 200)
         self.assertEqual(len(results['attributes']['nosy']), 2)
         self.assertListEqual(results['attributes']['nosy'], ['1', '2'])
 
@@ -281,12 +276,12 @@
             cgi.MiniFieldStorage('nosy', '2'),
             cgi.MiniFieldStorage('status', '3')
         ]
-        code, results = self.server.patch_element('issue', issue_id, form)
-        self.assertEqual(code, 200)
+        results = self.server.patch_element('issue', issue_id, form)
+        self.assertEqual(self.dummy_client.response_code, 200)
 
         # verify the result
-        code, results = self.server.get_element('issue', issue_id, {})
-        self.assertEqual(code, 200)
+        results = self.server.get_element('issue', issue_id, {})['data']
+        self.assertEqual(self.dummy_client.response_code, 200)
         self.assertEqual(results['attributes']['status'], '3')
         self.assertEqual(len(results['attributes']['nosy']), 1)
         self.assertListEqual(results['attributes']['nosy'], ['2'])
@@ -305,12 +300,12 @@
             cgi.MiniFieldStorage('nosy', ''),
             cgi.MiniFieldStorage('title', '')
         ]
-        code, results = self.server.patch_element('issue', issue_id, form)
-        self.assertEqual(code, 200)
+        results = self.server.patch_element('issue', issue_id, form)
+        self.assertEqual(self.dummy_client.response_code, 200)
 
         # verify the result
-        code, results = self.server.get_element('issue', issue_id, {})
-        self.assertEqual(code, 200)
+        results = self.server.get_element('issue', issue_id, {})['data']
+        self.assertEqual(self.dummy_client.response_code, 200)
         self.assertEqual(results['attributes']['title'], None)
         self.assertEqual(len(results['attributes']['nosy']), 0)
         self.assertEqual(results['attributes']['nosy'], [])

Roundup Issue Tracker: http://roundup-tracker.org/