diff test/test_postgresql.py @ 4887:05c857e5dbed

New rdbms configuration option 'isolation_level' See discussion in http://issues.roundup-tracker.org/issue2550806
author Ralf Schlatterbeck <rsc@runtux.com>
date Sun, 06 Apr 2014 11:11:04 +0200
parents f6e76a03b502
children 63c79c0992ae
line wrap: on
line diff
--- a/test/test_postgresql.py	Fri Apr 04 08:09:30 2014 +0200
+++ b/test/test_postgresql.py	Sun Apr 06 11:11:04 2014 +0200
@@ -21,6 +21,7 @@
 
 from db_test_base import DBTest, ROTest, config, SchemaTest, ClassicInitTest
 from db_test_base import ConcurrentDBTest, HTMLItemTest, FilterCacheTest
+from db_test_base import ClassicInitBase, setupTracker
 
 from roundup.backends import get_backend, have_backend
 
@@ -66,6 +67,54 @@
         ConcurrentDBTest.tearDown(self)
         postgresqlOpener.tearDown(self)
 
+class postgresqlJournalTest(postgresqlOpener, ClassicInitBase):
+    backend = 'postgresql'
+    def setUp(self):
+        postgresqlOpener.setUp(self)
+        ClassicInitBase.setUp(self)
+        self.tracker = setupTracker(self.dirname, self.backend)
+        db = self.tracker.open('admin')
+        self.id = db.issue.create(title='initial value')
+        db.commit()
+        db.close()
+
+    def tearDown(self):
+        self.db1.close()
+        self.db2.close()
+        ClassicInitBase.tearDown(self)
+        postgresqlOpener.tearDown(self)
+
+    def _test_journal(self, expected_journal):
+        id  = self.id
+        db1 = self.db1 = self.tracker.open('admin')
+        db2 = self.db2 = self.tracker.open('admin')
+
+        t1  = db1.issue.get(id, 'title')
+        t2  = db2.issue.get(id, 'title')
+
+        db1.issue.set (id, title='t1')
+        db1.commit()
+        db1.close()
+
+        db2.issue.set (id, title='t2')
+        db2.commit()
+        db2.close()
+        self.db = self.tracker.open('admin')
+        journal = self.db.getjournal('issue', id)
+        for n, line in enumerate(journal):
+            self.assertEqual(line[4], expected_journal[n])
+
+    def testConcurrentReadCommitted(self):
+        expected_journal = [
+            {}, {'title': 'initial value'}, {'title': 'initial value'}
+        ]
+        self._test_journal(expected_journal)
+
+    def testConcurrentRepeatableRead(self):
+        self.tracker.config.RDBMS_ISOLATION_LEVEL='repeatable read'
+        exc = self.module.TransactionRollbackError
+        self.assertRaises(exc, self._test_journal, [])
+
 class postgresqlHTMLItemTest(postgresqlOpener, HTMLItemTest):
     backend = 'postgresql'
     def setUp(self):
@@ -132,6 +181,7 @@
     suite.addTest(unittest.makeSuite(postgresqlClassicInitTest))
     suite.addTest(unittest.makeSuite(postgresqlSessionTest))
     suite.addTest(unittest.makeSuite(postgresqlConcurrencyTest))
+    suite.addTest(unittest.makeSuite(postgresqlJournalTest))
     suite.addTest(unittest.makeSuite(postgresqlHTMLItemTest))
     suite.addTest(unittest.makeSuite(postgresqlFilterCacheTest))
     return suite

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