Author: cito
Date: Fri Feb  5 09:04:31 2016
New Revision: 820

Log:
Skip test for privileges when running as superuser

It's not possible to test for missing privileges as a superuser
because superusers always have all privileges.

Modified:
   trunk/pg.py
   trunk/tests/test_classic_dbwrapper.py

Modified: trunk/pg.py
==============================================================================
--- trunk/pg.py Fri Feb  5 07:43:28 2016        (r819)
+++ trunk/pg.py Fri Feb  5 09:04:31 2016        (r820)
@@ -1789,18 +1789,26 @@
                 self.dbtypes.clear()
             return regtypes
 
-    def has_table_privilege(self, table, privilege='select'):
-        """Check whether current user has specified table privilege."""
+    def has_table_privilege(self, table, privilege='select', flush=False):
+        """Check whether current user has specified table privilege.
+
+        If flush is set, then the internal cache for table privileges will
+        be flushed. This may be necessary after privileges have been changed.
+        """
+        privileges = self._privileges
+        if flush:
+            privileges.clear()
+            self._do_debug('The privileges cache has been flushed')
         privilege = privilege.lower()
         try:  # ask cache
-            return self._privileges[(table, privilege)]
+            ret = privileges[table, privilege]
         except KeyError:  # cache miss, ask the database
             q = "SELECT has_table_privilege(%s, $2)" % (
                 _quote_if_unqualified('$1', table),)
             q = self.db.query(q, (table, privilege))
             ret = q.getresult()[0][0] == self._make_bool(True)
-            self._privileges[(table, privilege)] = ret  # cache it
-            return ret
+            privileges[table, privilege] = ret  # cache it
+        return ret
 
     def get(self, table, row, keyname=None):
         """Get a row from a database table or view.

Modified: trunk/tests/test_classic_dbwrapper.py
==============================================================================
--- trunk/tests/test_classic_dbwrapper.py       Fri Feb  5 07:43:28 2016        
(r819)
+++ trunk/tests/test_classic_dbwrapper.py       Fri Feb  5 09:04:31 2016        
(r820)
@@ -1071,9 +1071,8 @@
 
     def testGetAttnamesWithRegtypes(self):
         get_attnames = self.db.get_attnames
-        self.createTable('test_table',
-                         ' n int, alpha smallint, beta bool,'
-                         ' gamma char(5), tau text, v varchar(3)')
+        self.createTable('test_table', 'n int, alpha smallint, beta bool,'
+            ' gamma char(5), tau text, v varchar(3)')
         use_regtypes = self.db.use_regtypes
         regtypes = use_regtypes()
         self.assertEqual(regtypes, self.regtypes)
@@ -1089,9 +1088,8 @@
 
     def testGetAttnamesWithoutRegtypes(self):
         get_attnames = self.db.get_attnames
-        self.createTable('test_table',
-                         ' n int, alpha smallint, beta bool,'
-                         ' gamma char(5), tau text, v varchar(3)')
+        self.createTable('test_table', 'n int, alpha smallint, beta bool,'
+            ' gamma char(5), tau text, v varchar(3)')
         use_regtypes = self.db.use_regtypes
         regtypes = use_regtypes()
         self.assertEqual(regtypes, self.regtypes)
@@ -1150,9 +1148,8 @@
             r = ' '.join(list(r.keys()))
             self.assertEqual(r, 'i2 i4 i8 d f4 f8 m v4 c4 t')
         table = 'test table for get_attnames'
-        self.createTable(table,
-                         ' n int, alpha smallint, v varchar(3),'
-                         ' gamma char(5), tau text, beta bool')
+        self.createTable(table, 'n int, alpha smallint, v varchar(3),'
+                ' gamma char(5), tau text, beta bool')
         r = get_attnames(table)
         self.assertIsInstance(r, OrderedDict)
         if self.regtypes:
@@ -1189,9 +1186,8 @@
         r = ' '.join(list(r.keys()))
         self.assertEqual(r, 'i2 i4 i8 d f4 f8 m v4 c4 t')
         table = 'test table for get_attnames'
-        self.createTable(table,
-                         ' n int, alpha smallint, v varchar(3),'
-                         ' gamma char(5), tau text, beta bool')
+        self.createTable(table, 'n int, alpha smallint, v varchar(3),'
+                ' gamma char(5), tau text, beta bool')
         r = get_attnames(table)
         self.assertIsInstance(r, AttrDict)
         if self.regtypes:
@@ -1215,10 +1211,16 @@
         self.assertEqual(can('test', 'insert'), True)
         self.assertEqual(can('test', 'update'), True)
         self.assertEqual(can('test', 'delete'), True)
-        self.assertEqual(can('pg_views', 'select'), True)
-        self.assertEqual(can('pg_views', 'delete'), False)
         self.assertRaises(pg.ProgrammingError, can, 'test', 'foobar')
         self.assertRaises(pg.ProgrammingError, can, 'table_does_not_exist')
+        r = self.db.query('select rolsuper FROM pg_roles'
+            ' where rolname=current_user').getresult()[0][0]
+        if not pg.get_bool():
+            r = r == 't'
+        if r:
+            self.skipTest('must not be superuser')
+        self.assertEqual(can('pg_views', 'select'), True)
+        self.assertEqual(can('pg_views', 'delete'), False)
 
     def testGet(self):
         get = self.db.get
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql

Reply via email to