Skip to content

Commit 5f9247e

Browse files
author
Erlend Egeberg Aasland
authored
bpo-45512: Extend sqlite3 test suite regarding isolation levels (GH-29576)
1 parent 15409c7 commit 5f9247e

File tree

2 files changed

+124
-3
lines changed

2 files changed

+124
-3
lines changed

Lib/test/test_sqlite3/test_dbapi.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,14 +514,35 @@ def test_connection_init_bad_isolation_level(self):
514514
"isolation_level string must be '', 'DEFERRED', 'IMMEDIATE', or "
515515
"'EXCLUSIVE'"
516516
)
517-
with self.assertRaisesRegex(ValueError, msg):
518-
memory_database(isolation_level="BOGUS")
517+
levels = (
518+
"BOGUS",
519+
" ",
520+
"DEFERRE",
521+
"IMMEDIAT",
522+
"EXCLUSIV",
523+
"DEFERREDS",
524+
"IMMEDIATES",
525+
"EXCLUSIVES",
526+
)
527+
for level in levels:
528+
with self.subTest(level=level):
529+
with self.assertRaisesRegex(ValueError, msg):
530+
memory_database(isolation_level=level)
531+
with memory_database() as cx:
532+
with self.assertRaisesRegex(ValueError, msg):
533+
cx.isolation_level = level
534+
# Check that the default level is not changed
535+
self.assertEqual(cx.isolation_level, "")
519536

520537
def test_connection_init_good_isolation_levels(self):
521538
for level in ("", "DEFERRED", "IMMEDIATE", "EXCLUSIVE", None):
522539
with self.subTest(level=level):
523540
with memory_database(isolation_level=level) as cx:
524-
cx.execute("select 'ok'")
541+
self.assertEqual(cx.isolation_level, level)
542+
with memory_database() as cx:
543+
self.assertEqual(cx.isolation_level, "")
544+
cx.isolation_level = level
545+
self.assertEqual(cx.isolation_level, level)
525546

526547
def test_connection_reinit(self):
527548
db = ":memory:"

Lib/test/test_sqlite3/test_transactions.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import os, unittest
2424
import sqlite3 as sqlite
2525

26+
from .test_dbapi import memory_database
27+
2628
def get_db_path():
2729
return "sqlite_testdb"
2830

@@ -143,6 +145,7 @@ def test_rollback_cursor_consistency(self):
143145
with self.assertRaises(sqlite.InterfaceError):
144146
cur.fetchall()
145147

148+
146149
class SpecialCommandTests(unittest.TestCase):
147150
def setUp(self):
148151
self.con = sqlite.connect(":memory:")
@@ -162,6 +165,7 @@ def tearDown(self):
162165
self.cur.close()
163166
self.con.close()
164167

168+
165169
class TransactionalDDL(unittest.TestCase):
166170
def setUp(self):
167171
self.con = sqlite.connect(":memory:")
@@ -196,5 +200,101 @@ def tearDown(self):
196200
self.con.close()
197201

198202

203+
class IsolationLevelFromInit(unittest.TestCase):
204+
CREATE = "create table t(t)"
205+
INSERT = "insert into t values(1)"
206+
207+
def setUp(self):
208+
self.traced = []
209+
210+
def _run_test(self, cx):
211+
cx.execute(self.CREATE)
212+
cx.set_trace_callback(lambda stmt: self.traced.append(stmt))
213+
with cx:
214+
cx.execute(self.INSERT)
215+
216+
def test_isolation_level_default(self):
217+
with memory_database() as cx:
218+
self._run_test(cx)
219+
self.assertEqual(self.traced, ["BEGIN ", self.INSERT, "COMMIT"])
220+
221+
def test_isolation_level_begin(self):
222+
with memory_database(isolation_level="") as cx:
223+
self._run_test(cx)
224+
self.assertEqual(self.traced, ["BEGIN ", self.INSERT, "COMMIT"])
225+
226+
def test_isolation_level_deferred(self):
227+
with memory_database(isolation_level="DEFERRED") as cx:
228+
self._run_test(cx)
229+
self.assertEqual(self.traced, ["BEGIN DEFERRED", self.INSERT, "COMMIT"])
230+
231+
def test_isolation_level_immediate(self):
232+
with memory_database(isolation_level="IMMEDIATE") as cx:
233+
self._run_test(cx)
234+
self.assertEqual(self.traced,
235+
["BEGIN IMMEDIATE", self.INSERT, "COMMIT"])
236+
237+
def test_isolation_level_exclusive(self):
238+
with memory_database(isolation_level="EXCLUSIVE") as cx:
239+
self._run_test(cx)
240+
self.assertEqual(self.traced,
241+
["BEGIN EXCLUSIVE", self.INSERT, "COMMIT"])
242+
243+
def test_isolation_level_none(self):
244+
with memory_database(isolation_level=None) as cx:
245+
self._run_test(cx)
246+
self.assertEqual(self.traced, [self.INSERT])
247+
248+
249+
class IsolationLevelPostInit(unittest.TestCase):
250+
QUERY = "insert into t values(1)"
251+
252+
def setUp(self):
253+
self.cx = sqlite.connect(":memory:")
254+
self.cx.execute("create table t(t)")
255+
self.traced = []
256+
self.cx.set_trace_callback(lambda stmt: self.traced.append(stmt))
257+
258+
def tearDown(self):
259+
self.cx.close()
260+
261+
def test_isolation_level_default(self):
262+
with self.cx:
263+
self.cx.execute(self.QUERY)
264+
self.assertEqual(self.traced, ["BEGIN ", self.QUERY, "COMMIT"])
265+
266+
def test_isolation_level_begin(self):
267+
self.cx.isolation_level = ""
268+
with self.cx:
269+
self.cx.execute(self.QUERY)
270+
self.assertEqual(self.traced, ["BEGIN ", self.QUERY, "COMMIT"])
271+
272+
def test_isolation_level_deferrred(self):
273+
self.cx.isolation_level = "DEFERRED"
274+
with self.cx:
275+
self.cx.execute(self.QUERY)
276+
self.assertEqual(self.traced, ["BEGIN DEFERRED", self.QUERY, "COMMIT"])
277+
278+
def test_isolation_level_immediate(self):
279+
self.cx.isolation_level = "IMMEDIATE"
280+
with self.cx:
281+
self.cx.execute(self.QUERY)
282+
self.assertEqual(self.traced,
283+
["BEGIN IMMEDIATE", self.QUERY, "COMMIT"])
284+
285+
def test_isolation_level_exclusive(self):
286+
self.cx.isolation_level = "EXCLUSIVE"
287+
with self.cx:
288+
self.cx.execute(self.QUERY)
289+
self.assertEqual(self.traced,
290+
["BEGIN EXCLUSIVE", self.QUERY, "COMMIT"])
291+
292+
def test_isolation_level_none(self):
293+
self.cx.isolation_level = None
294+
with self.cx:
295+
self.cx.execute(self.QUERY)
296+
self.assertEqual(self.traced, [self.QUERY])
297+
298+
199299
if __name__ == "__main__":
200300
unittest.main()

0 commit comments

Comments
 (0)