]> git.decadent.org.uk Git - dak.git/blobdiff - tests/dbtest_session.py
Merge remote-tracking branch 'jcristau/formatone-no-tar-sig'
[dak.git] / tests / dbtest_session.py
index 7c378ce98cdc45ed7dbc5b35b45ec2e9edc81845..3a8d3cf2e0a747abfe9f3770467338db94d5814c 100755 (executable)
@@ -2,9 +2,8 @@
 
 from db_test import DBDakTestCase
 
-from daklib.dbconn import Uid
+from daklib.dbconn import DBConn, Uid
 
-from sqlalchemy.orm import object_session
 from sqlalchemy.exc import InvalidRequestError
 
 import time
@@ -93,7 +92,6 @@ class SessionTestCase(DBDakTestCase):
         uid = Uid(uid = 'foobar')
         self.session.add(uid)
         self.assertTrue(uid in self.session)
-        self.assertEqual(self.session, object_session(uid))
         self.session.expunge(uid)
         self.assertTrue(uid not in self.session)
         # test close()
@@ -138,6 +136,42 @@ class SessionTestCase(DBDakTestCase):
         self.session.rollback()
         self.assertRaises(InvalidRequestError, self.refresh)
 
+    def test_session(self):
+        '''
+        Tests the ORMObject.session() method.
+        '''
+
+        uid = Uid(uid = 'foobar')
+        self.session.add(uid)
+        self.assertEqual(self.session, uid.session())
+
+    def test_clone(self):
+        '''
+        Tests the ORMObject.clone() method.
+        '''
+
+        uid1 = Uid(uid = 'foobar')
+        # no session yet
+        self.assertRaises(RuntimeError, uid1.clone)
+        self.session.add(uid1)
+        # object not persistent yet
+        self.assertRaises(RuntimeError, uid1.clone)
+        self.session.commit()
+        # test without session parameter
+        uid2 = uid1.clone()
+        self.assertTrue(uid1 is not uid2)
+        self.assertEqual(uid1.uid, uid2.uid)
+        self.assertTrue(uid2 not in uid1.session())
+        self.assertTrue(uid1 not in uid2.session())
+        # test with explicit session parameter
+        new_session = DBConn().session()
+        uid3 = uid1.clone(session = new_session)
+        self.assertEqual(uid1.uid, uid3.uid)
+        self.assertTrue(uid3 in new_session)
+        # test for ressource leaks with mass cloning
+        for _ in xrange(1, 1000):
+            uid1.clone()
+
     def classes_to_clean(self):
         # We need to clean all Uid objects in case some test fails.
         return (Uid,)