3 from db_test import DBDakTestCase
5 from daklib.dbconn import Uid
7 from sqlalchemy.orm import object_session
8 from sqlalchemy.exc import InvalidRequestError
13 class SessionTestCase(DBDakTestCase):
15 This TestCase checks the behaviour of SQLAlchemy's session object. It should
16 make sure the SQLAlchemy always works as we expect it. And it might help
17 dak beginners to get a grasp on how the session works.
23 def test_timestamps(self):
25 Test the basic transaction behaviour. The session is not configured for
26 autocommit mode and that is why we always have an open transaction that
27 ends with either rollback() or commit().
30 # timestamps will always be the same in one transaction
31 timestamp01 = self.now()
33 timestamp02 = self.now()
34 self.assertEqual(timestamp01, timestamp02)
35 uid = Uid(uid = 'foobar')
38 self.assertEqual(timestamp01, uid.created)
39 # ... but different in multiple transactions
40 self.session.rollback()
41 timestamp03 = self.now()
42 self.assertTrue(timestamp01 < timestamp03)
43 uid = Uid(uid = 'foobar')
46 self.assertTrue(timestamp01 < uid.created)
50 Test INSERT, UPDATE, DELETE, ROLLBACK, and COMMIT behaviour of the
55 uid = Uid(uid = 'foobar')
56 self.assertTrue(uid not in self.session)
58 self.assertTrue(uid in self.session)
59 self.assertTrue(uid in self.session.new)
61 self.assertTrue(uid in self.session)
62 self.assertTrue(uid not in self.session.new)
65 self.assertTrue(uid in self.session.dirty)
67 self.assertTrue(uid not in self.session.dirty)
69 self.session.rollback()
70 self.assertTrue(uid not in self.session)
72 uid = Uid(uid = 'foobar')
74 self.assertTrue(uid in self.session.new)
76 self.assertTrue(uid in self.session)
77 self.assertTrue(uid not in self.session.new)
79 self.session.delete(uid)
80 self.assertTrue(uid in self.session)
81 self.assertTrue(uid in self.session.deleted)
83 self.assertTrue(uid not in self.session)
84 self.assertTrue(uid not in self.session.deleted)
86 def test_expunge(self):
88 Test expunge() of objects from session and the object_session()
93 uid = Uid(uid = 'foobar')
95 self.assertTrue(uid in self.session)
96 self.assertEqual(self.session, object_session(uid))
97 self.session.expunge(uid)
98 self.assertTrue(uid not in self.session)
100 self.session.add(uid)
101 self.assertTrue(uid in self.session)
103 self.assertTrue(uid not in self.session)
104 # make uid persistent
105 self.session.add(uid)
106 self.session.commit()
107 self.assertTrue(uid in self.session)
108 # test rollback() for persistent object
109 self.session.rollback()
110 self.assertTrue(uid in self.session)
111 # test expunge() for persistent object
112 self.session.expunge(uid)
113 self.assertTrue(uid not in self.session)
114 # test close() for persistent object
115 self.session.add(uid)
116 self.assertTrue(uid in self.session)
118 self.assertTrue(uid not in self.session)
122 Refreshes self.uid and should raise an exception is self.uid is not
125 self.session.refresh(self.uid)
127 def test_refresh(self):
129 Test the refresh() of an object.
132 self.uid = Uid(uid = 'foobar')
133 self.assertEqual(None, self.uid.uid_id)
134 self.session.add(self.uid)
135 self.assertEqual(None, self.uid.uid_id)
137 self.assertTrue(self.uid.uid_id is not None)
138 self.session.rollback()
139 self.assertRaises(InvalidRequestError, self.refresh)
141 def classes_to_clean(self):
142 # We need to clean all Uid objects in case some test fails.
145 if __name__ == '__main__':