| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 1 | #-*- coding: ISO-8859-1 -*- | 
 | 2 | # pysqlite2/test/dbapi.py: tests for DB-API compliance | 
 | 3 | # | 
| Gerhard Häring | 1cc60ed | 2008-02-29 22:08:41 +0000 | [diff] [blame] | 4 | # Copyright (C) 2004-2007 Gerhard Häring <gh@ghaering.de> | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 5 | # | 
 | 6 | # This file is part of pysqlite. | 
 | 7 | # | 
 | 8 | # This software is provided 'as-is', without any express or implied | 
 | 9 | # warranty.  In no event will the authors be held liable for any damages | 
 | 10 | # arising from the use of this software. | 
 | 11 | # | 
 | 12 | # Permission is granted to anyone to use this software for any purpose, | 
 | 13 | # including commercial applications, and to alter it and redistribute it | 
 | 14 | # freely, subject to the following restrictions: | 
 | 15 | # | 
 | 16 | # 1. The origin of this software must not be misrepresented; you must not | 
 | 17 | #    claim that you wrote the original software. If you use this software | 
 | 18 | #    in a product, an acknowledgment in the product documentation would be | 
 | 19 | #    appreciated but is not required. | 
 | 20 | # 2. Altered source versions must be plainly marked as such, and must not be | 
 | 21 | #    misrepresented as being the original software. | 
 | 22 | # 3. This notice may not be removed or altered from any source distribution. | 
 | 23 |  | 
 | 24 | import unittest | 
| Gerhard Häring | 1cc60ed | 2008-02-29 22:08:41 +0000 | [diff] [blame] | 25 | import sys | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 26 | import threading | 
 | 27 | import sqlite3 as sqlite | 
 | 28 |  | 
 | 29 | class ModuleTests(unittest.TestCase): | 
 | 30 |     def CheckAPILevel(self): | 
 | 31 |         self.assertEqual(sqlite.apilevel, "2.0", | 
 | 32 |                          "apilevel is %s, should be 2.0" % sqlite.apilevel) | 
 | 33 |  | 
 | 34 |     def CheckThreadSafety(self): | 
 | 35 |         self.assertEqual(sqlite.threadsafety, 1, | 
 | 36 |                          "threadsafety is %d, should be 1" % sqlite.threadsafety) | 
 | 37 |  | 
 | 38 |     def CheckParamStyle(self): | 
 | 39 |         self.assertEqual(sqlite.paramstyle, "qmark", | 
 | 40 |                          "paramstyle is '%s', should be 'qmark'" % | 
 | 41 |                          sqlite.paramstyle) | 
 | 42 |  | 
 | 43 |     def CheckWarning(self): | 
 | 44 |         self.assert_(issubclass(sqlite.Warning, StandardError), | 
 | 45 |                      "Warning is not a subclass of StandardError") | 
 | 46 |  | 
 | 47 |     def CheckError(self): | 
 | 48 |         self.failUnless(issubclass(sqlite.Error, StandardError), | 
 | 49 |                         "Error is not a subclass of StandardError") | 
 | 50 |  | 
 | 51 |     def CheckInterfaceError(self): | 
 | 52 |         self.failUnless(issubclass(sqlite.InterfaceError, sqlite.Error), | 
 | 53 |                         "InterfaceError is not a subclass of Error") | 
 | 54 |  | 
 | 55 |     def CheckDatabaseError(self): | 
 | 56 |         self.failUnless(issubclass(sqlite.DatabaseError, sqlite.Error), | 
 | 57 |                         "DatabaseError is not a subclass of Error") | 
 | 58 |  | 
 | 59 |     def CheckDataError(self): | 
 | 60 |         self.failUnless(issubclass(sqlite.DataError, sqlite.DatabaseError), | 
 | 61 |                         "DataError is not a subclass of DatabaseError") | 
 | 62 |  | 
 | 63 |     def CheckOperationalError(self): | 
 | 64 |         self.failUnless(issubclass(sqlite.OperationalError, sqlite.DatabaseError), | 
 | 65 |                         "OperationalError is not a subclass of DatabaseError") | 
 | 66 |  | 
 | 67 |     def CheckIntegrityError(self): | 
 | 68 |         self.failUnless(issubclass(sqlite.IntegrityError, sqlite.DatabaseError), | 
 | 69 |                         "IntegrityError is not a subclass of DatabaseError") | 
 | 70 |  | 
 | 71 |     def CheckInternalError(self): | 
 | 72 |         self.failUnless(issubclass(sqlite.InternalError, sqlite.DatabaseError), | 
 | 73 |                         "InternalError is not a subclass of DatabaseError") | 
 | 74 |  | 
 | 75 |     def CheckProgrammingError(self): | 
 | 76 |         self.failUnless(issubclass(sqlite.ProgrammingError, sqlite.DatabaseError), | 
 | 77 |                         "ProgrammingError is not a subclass of DatabaseError") | 
 | 78 |  | 
 | 79 |     def CheckNotSupportedError(self): | 
 | 80 |         self.failUnless(issubclass(sqlite.NotSupportedError, | 
 | 81 |                                    sqlite.DatabaseError), | 
 | 82 |                         "NotSupportedError is not a subclass of DatabaseError") | 
 | 83 |  | 
 | 84 | class ConnectionTests(unittest.TestCase): | 
 | 85 |     def setUp(self): | 
 | 86 |         self.cx = sqlite.connect(":memory:") | 
 | 87 |         cu = self.cx.cursor() | 
 | 88 |         cu.execute("create table test(id integer primary key, name text)") | 
 | 89 |         cu.execute("insert into test(name) values (?)", ("foo",)) | 
 | 90 |  | 
 | 91 |     def tearDown(self): | 
 | 92 |         self.cx.close() | 
 | 93 |  | 
 | 94 |     def CheckCommit(self): | 
 | 95 |         self.cx.commit() | 
 | 96 |  | 
 | 97 |     def CheckCommitAfterNoChanges(self): | 
 | 98 |         """ | 
 | 99 |         A commit should also work when no changes were made to the database. | 
 | 100 |         """ | 
 | 101 |         self.cx.commit() | 
 | 102 |         self.cx.commit() | 
 | 103 |  | 
 | 104 |     def CheckRollback(self): | 
 | 105 |         self.cx.rollback() | 
 | 106 |  | 
 | 107 |     def CheckRollbackAfterNoChanges(self): | 
 | 108 |         """ | 
 | 109 |         A rollback should also work when no changes were made to the database. | 
 | 110 |         """ | 
 | 111 |         self.cx.rollback() | 
 | 112 |         self.cx.rollback() | 
 | 113 |  | 
 | 114 |     def CheckCursor(self): | 
 | 115 |         cu = self.cx.cursor() | 
 | 116 |  | 
 | 117 |     def CheckFailedOpen(self): | 
 | 118 |         YOU_CANNOT_OPEN_THIS = "/foo/bar/bla/23534/mydb.db" | 
 | 119 |         try: | 
 | 120 |             con = sqlite.connect(YOU_CANNOT_OPEN_THIS) | 
 | 121 |         except sqlite.OperationalError: | 
 | 122 |             return | 
 | 123 |         self.fail("should have raised an OperationalError") | 
 | 124 |  | 
 | 125 |     def CheckClose(self): | 
 | 126 |         self.cx.close() | 
 | 127 |  | 
 | 128 |     def CheckExceptions(self): | 
 | 129 |         # Optional DB-API extension. | 
 | 130 |         self.failUnlessEqual(self.cx.Warning, sqlite.Warning) | 
 | 131 |         self.failUnlessEqual(self.cx.Error, sqlite.Error) | 
 | 132 |         self.failUnlessEqual(self.cx.InterfaceError, sqlite.InterfaceError) | 
 | 133 |         self.failUnlessEqual(self.cx.DatabaseError, sqlite.DatabaseError) | 
 | 134 |         self.failUnlessEqual(self.cx.DataError, sqlite.DataError) | 
 | 135 |         self.failUnlessEqual(self.cx.OperationalError, sqlite.OperationalError) | 
 | 136 |         self.failUnlessEqual(self.cx.IntegrityError, sqlite.IntegrityError) | 
 | 137 |         self.failUnlessEqual(self.cx.InternalError, sqlite.InternalError) | 
 | 138 |         self.failUnlessEqual(self.cx.ProgrammingError, sqlite.ProgrammingError) | 
 | 139 |         self.failUnlessEqual(self.cx.NotSupportedError, sqlite.NotSupportedError) | 
 | 140 |  | 
 | 141 | class CursorTests(unittest.TestCase): | 
 | 142 |     def setUp(self): | 
 | 143 |         self.cx = sqlite.connect(":memory:") | 
 | 144 |         self.cu = self.cx.cursor() | 
 | 145 |         self.cu.execute("create table test(id integer primary key, name text, income number)") | 
 | 146 |         self.cu.execute("insert into test(name) values (?)", ("foo",)) | 
 | 147 |  | 
 | 148 |     def tearDown(self): | 
 | 149 |         self.cu.close() | 
 | 150 |         self.cx.close() | 
 | 151 |  | 
 | 152 |     def CheckExecuteNoArgs(self): | 
 | 153 |         self.cu.execute("delete from test") | 
 | 154 |  | 
 | 155 |     def CheckExecuteIllegalSql(self): | 
 | 156 |         try: | 
 | 157 |             self.cu.execute("select asdf") | 
 | 158 |             self.fail("should have raised an OperationalError") | 
 | 159 |         except sqlite.OperationalError: | 
 | 160 |             return | 
 | 161 |         except: | 
 | 162 |             self.fail("raised wrong exception") | 
 | 163 |  | 
 | 164 |     def CheckExecuteTooMuchSql(self): | 
 | 165 |         try: | 
 | 166 |             self.cu.execute("select 5+4; select 4+5") | 
 | 167 |             self.fail("should have raised a Warning") | 
 | 168 |         except sqlite.Warning: | 
 | 169 |             return | 
 | 170 |         except: | 
 | 171 |             self.fail("raised wrong exception") | 
 | 172 |  | 
 | 173 |     def CheckExecuteTooMuchSql2(self): | 
 | 174 |         self.cu.execute("select 5+4; -- foo bar") | 
 | 175 |  | 
 | 176 |     def CheckExecuteTooMuchSql3(self): | 
 | 177 |         self.cu.execute(""" | 
 | 178 |             select 5+4; | 
 | 179 |  | 
 | 180 |             /* | 
 | 181 |             foo | 
 | 182 |             */ | 
 | 183 |             """) | 
 | 184 |  | 
 | 185 |     def CheckExecuteWrongSqlArg(self): | 
 | 186 |         try: | 
 | 187 |             self.cu.execute(42) | 
 | 188 |             self.fail("should have raised a ValueError") | 
 | 189 |         except ValueError: | 
 | 190 |             return | 
 | 191 |         except: | 
 | 192 |             self.fail("raised wrong exception.") | 
 | 193 |  | 
 | 194 |     def CheckExecuteArgInt(self): | 
 | 195 |         self.cu.execute("insert into test(id) values (?)", (42,)) | 
 | 196 |  | 
 | 197 |     def CheckExecuteArgFloat(self): | 
 | 198 |         self.cu.execute("insert into test(income) values (?)", (2500.32,)) | 
 | 199 |  | 
 | 200 |     def CheckExecuteArgString(self): | 
 | 201 |         self.cu.execute("insert into test(name) values (?)", ("Hugo",)) | 
 | 202 |  | 
 | 203 |     def CheckExecuteWrongNoOfArgs1(self): | 
 | 204 |         # too many parameters | 
 | 205 |         try: | 
 | 206 |             self.cu.execute("insert into test(id) values (?)", (17, "Egon")) | 
 | 207 |             self.fail("should have raised ProgrammingError") | 
 | 208 |         except sqlite.ProgrammingError: | 
 | 209 |             pass | 
 | 210 |  | 
 | 211 |     def CheckExecuteWrongNoOfArgs2(self): | 
 | 212 |         # too little parameters | 
 | 213 |         try: | 
 | 214 |             self.cu.execute("insert into test(id) values (?)") | 
 | 215 |             self.fail("should have raised ProgrammingError") | 
 | 216 |         except sqlite.ProgrammingError: | 
 | 217 |             pass | 
 | 218 |  | 
 | 219 |     def CheckExecuteWrongNoOfArgs3(self): | 
 | 220 |         # no parameters, parameters are needed | 
 | 221 |         try: | 
 | 222 |             self.cu.execute("insert into test(id) values (?)") | 
 | 223 |             self.fail("should have raised ProgrammingError") | 
 | 224 |         except sqlite.ProgrammingError: | 
 | 225 |             pass | 
 | 226 |  | 
| Gerhard Häring | 1cc60ed | 2008-02-29 22:08:41 +0000 | [diff] [blame] | 227 |     def CheckExecuteParamList(self): | 
 | 228 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 229 |         self.cu.execute("select name from test where name=?", ["foo"]) | 
 | 230 |         row = self.cu.fetchone() | 
 | 231 |         self.failUnlessEqual(row[0], "foo") | 
 | 232 |  | 
 | 233 |     def CheckExecuteParamSequence(self): | 
 | 234 |         class L(object): | 
 | 235 |             def __len__(self): | 
 | 236 |                 return 1 | 
 | 237 |             def __getitem__(self, x): | 
 | 238 |                 assert x == 0 | 
 | 239 |                 return "foo" | 
 | 240 |  | 
 | 241 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 242 |         self.cu.execute("select name from test where name=?", L()) | 
 | 243 |         row = self.cu.fetchone() | 
 | 244 |         self.failUnlessEqual(row[0], "foo") | 
 | 245 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 246 |     def CheckExecuteDictMapping(self): | 
 | 247 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 248 |         self.cu.execute("select name from test where name=:name", {"name": "foo"}) | 
 | 249 |         row = self.cu.fetchone() | 
 | 250 |         self.failUnlessEqual(row[0], "foo") | 
 | 251 |  | 
| Gerhard Häring | 1cc60ed | 2008-02-29 22:08:41 +0000 | [diff] [blame] | 252 |     def CheckExecuteDictMapping_Mapping(self): | 
 | 253 |         # Test only works with Python 2.5 or later | 
 | 254 |         if sys.version_info < (2, 5, 0): | 
 | 255 |             return | 
 | 256 |  | 
 | 257 |         class D(dict): | 
 | 258 |             def __missing__(self, key): | 
 | 259 |                 return "foo" | 
 | 260 |  | 
 | 261 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 262 |         self.cu.execute("select name from test where name=:name", D()) | 
 | 263 |         row = self.cu.fetchone() | 
 | 264 |         self.failUnlessEqual(row[0], "foo") | 
 | 265 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 266 |     def CheckExecuteDictMappingTooLittleArgs(self): | 
 | 267 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 268 |         try: | 
 | 269 |             self.cu.execute("select name from test where name=:name and id=:id", {"name": "foo"}) | 
 | 270 |             self.fail("should have raised ProgrammingError") | 
 | 271 |         except sqlite.ProgrammingError: | 
 | 272 |             pass | 
 | 273 |  | 
 | 274 |     def CheckExecuteDictMappingNoArgs(self): | 
 | 275 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 276 |         try: | 
 | 277 |             self.cu.execute("select name from test where name=:name") | 
 | 278 |             self.fail("should have raised ProgrammingError") | 
 | 279 |         except sqlite.ProgrammingError: | 
 | 280 |             pass | 
 | 281 |  | 
 | 282 |     def CheckExecuteDictMappingUnnamed(self): | 
 | 283 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 284 |         try: | 
 | 285 |             self.cu.execute("select name from test where name=?", {"name": "foo"}) | 
 | 286 |             self.fail("should have raised ProgrammingError") | 
 | 287 |         except sqlite.ProgrammingError: | 
 | 288 |             pass | 
 | 289 |  | 
 | 290 |     def CheckClose(self): | 
 | 291 |         self.cu.close() | 
 | 292 |  | 
 | 293 |     def CheckRowcountExecute(self): | 
 | 294 |         self.cu.execute("delete from test") | 
 | 295 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 296 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 297 |         self.cu.execute("update test set name='bar'") | 
 | 298 |         self.failUnlessEqual(self.cu.rowcount, 2) | 
 | 299 |  | 
| Gerhard Häring | 7f7ca35 | 2008-05-31 21:33:27 +0000 | [diff] [blame^] | 300 |     def CheckRowcountSelect(self): | 
 | 301 |         """ | 
 | 302 |         pysqlite does not know the rowcount of SELECT statements, because we | 
 | 303 |         don't fetch all rows after executing the select statement. The rowcount | 
 | 304 |         has thus to be -1. | 
 | 305 |         """ | 
 | 306 |         self.cu.execute("select 5 union select 6") | 
 | 307 |         self.failUnlessEqual(self.cu.rowcount, -1) | 
 | 308 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 309 |     def CheckRowcountExecutemany(self): | 
 | 310 |         self.cu.execute("delete from test") | 
 | 311 |         self.cu.executemany("insert into test(name) values (?)", [(1,), (2,), (3,)]) | 
 | 312 |         self.failUnlessEqual(self.cu.rowcount, 3) | 
 | 313 |  | 
| Anthony Baxter | 72289a6 | 2006-04-04 06:29:05 +0000 | [diff] [blame] | 314 |     def CheckTotalChanges(self): | 
 | 315 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 316 |         self.cu.execute("insert into test(name) values ('foo')") | 
 | 317 |         if self.cx.total_changes < 2: | 
 | 318 |             self.fail("total changes reported wrong value") | 
 | 319 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 320 |     # Checks for executemany: | 
 | 321 |     # Sequences are required by the DB-API, iterators | 
 | 322 |     # enhancements in pysqlite. | 
 | 323 |  | 
 | 324 |     def CheckExecuteManySequence(self): | 
 | 325 |         self.cu.executemany("insert into test(income) values (?)", [(x,) for x in range(100, 110)]) | 
 | 326 |  | 
 | 327 |     def CheckExecuteManyIterator(self): | 
 | 328 |         class MyIter: | 
 | 329 |             def __init__(self): | 
 | 330 |                 self.value = 5 | 
 | 331 |  | 
 | 332 |             def next(self): | 
 | 333 |                 if self.value == 10: | 
 | 334 |                     raise StopIteration | 
 | 335 |                 else: | 
 | 336 |                     self.value += 1 | 
 | 337 |                     return (self.value,) | 
 | 338 |  | 
 | 339 |         self.cu.executemany("insert into test(income) values (?)", MyIter()) | 
 | 340 |  | 
 | 341 |     def CheckExecuteManyGenerator(self): | 
 | 342 |         def mygen(): | 
 | 343 |             for i in range(5): | 
 | 344 |                 yield (i,) | 
 | 345 |  | 
 | 346 |         self.cu.executemany("insert into test(income) values (?)", mygen()) | 
 | 347 |  | 
 | 348 |     def CheckExecuteManyWrongSqlArg(self): | 
 | 349 |         try: | 
 | 350 |             self.cu.executemany(42, [(3,)]) | 
 | 351 |             self.fail("should have raised a ValueError") | 
 | 352 |         except ValueError: | 
 | 353 |             return | 
 | 354 |         except: | 
 | 355 |             self.fail("raised wrong exception.") | 
 | 356 |  | 
 | 357 |     def CheckExecuteManySelect(self): | 
 | 358 |         try: | 
 | 359 |             self.cu.executemany("select ?", [(3,)]) | 
 | 360 |             self.fail("should have raised a ProgrammingError") | 
 | 361 |         except sqlite.ProgrammingError: | 
 | 362 |             return | 
 | 363 |         except: | 
 | 364 |             self.fail("raised wrong exception.") | 
 | 365 |  | 
 | 366 |     def CheckExecuteManyNotIterable(self): | 
 | 367 |         try: | 
 | 368 |             self.cu.executemany("insert into test(income) values (?)", 42) | 
 | 369 |             self.fail("should have raised a TypeError") | 
 | 370 |         except TypeError: | 
 | 371 |             return | 
 | 372 |         except Exception, e: | 
 | 373 |             print "raised", e.__class__ | 
 | 374 |             self.fail("raised wrong exception.") | 
 | 375 |  | 
 | 376 |     def CheckFetchIter(self): | 
 | 377 |         # Optional DB-API extension. | 
 | 378 |         self.cu.execute("delete from test") | 
 | 379 |         self.cu.execute("insert into test(id) values (?)", (5,)) | 
 | 380 |         self.cu.execute("insert into test(id) values (?)", (6,)) | 
 | 381 |         self.cu.execute("select id from test order by id") | 
 | 382 |         lst = [] | 
 | 383 |         for row in self.cu: | 
 | 384 |             lst.append(row[0]) | 
 | 385 |         self.failUnlessEqual(lst[0], 5) | 
 | 386 |         self.failUnlessEqual(lst[1], 6) | 
 | 387 |  | 
 | 388 |     def CheckFetchone(self): | 
 | 389 |         self.cu.execute("select name from test") | 
 | 390 |         row = self.cu.fetchone() | 
 | 391 |         self.failUnlessEqual(row[0], "foo") | 
 | 392 |         row = self.cu.fetchone() | 
 | 393 |         self.failUnlessEqual(row, None) | 
 | 394 |  | 
 | 395 |     def CheckFetchoneNoStatement(self): | 
 | 396 |         cur = self.cx.cursor() | 
 | 397 |         row = cur.fetchone() | 
 | 398 |         self.failUnlessEqual(row, None) | 
 | 399 |  | 
 | 400 |     def CheckArraySize(self): | 
 | 401 |         # must default ot 1 | 
 | 402 |         self.failUnlessEqual(self.cu.arraysize, 1) | 
 | 403 |  | 
 | 404 |         # now set to 2 | 
 | 405 |         self.cu.arraysize = 2 | 
 | 406 |  | 
 | 407 |         # now make the query return 3 rows | 
 | 408 |         self.cu.execute("delete from test") | 
 | 409 |         self.cu.execute("insert into test(name) values ('A')") | 
 | 410 |         self.cu.execute("insert into test(name) values ('B')") | 
 | 411 |         self.cu.execute("insert into test(name) values ('C')") | 
 | 412 |         self.cu.execute("select name from test") | 
 | 413 |         res = self.cu.fetchmany() | 
 | 414 |  | 
 | 415 |         self.failUnlessEqual(len(res), 2) | 
 | 416 |  | 
 | 417 |     def CheckFetchmany(self): | 
 | 418 |         self.cu.execute("select name from test") | 
 | 419 |         res = self.cu.fetchmany(100) | 
 | 420 |         self.failUnlessEqual(len(res), 1) | 
 | 421 |         res = self.cu.fetchmany(100) | 
 | 422 |         self.failUnlessEqual(res, []) | 
 | 423 |  | 
| Gerhard Häring | 1cc60ed | 2008-02-29 22:08:41 +0000 | [diff] [blame] | 424 |     def CheckFetchmanyKwArg(self): | 
 | 425 |         """Checks if fetchmany works with keyword arguments""" | 
 | 426 |         self.cu.execute("select name from test") | 
 | 427 |         res = self.cu.fetchmany(size=100) | 
 | 428 |         self.failUnlessEqual(len(res), 1) | 
 | 429 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 430 |     def CheckFetchall(self): | 
 | 431 |         self.cu.execute("select name from test") | 
 | 432 |         res = self.cu.fetchall() | 
 | 433 |         self.failUnlessEqual(len(res), 1) | 
 | 434 |         res = self.cu.fetchall() | 
 | 435 |         self.failUnlessEqual(res, []) | 
 | 436 |  | 
 | 437 |     def CheckSetinputsizes(self): | 
 | 438 |         self.cu.setinputsizes([3, 4, 5]) | 
 | 439 |  | 
 | 440 |     def CheckSetoutputsize(self): | 
 | 441 |         self.cu.setoutputsize(5, 0) | 
 | 442 |  | 
 | 443 |     def CheckSetoutputsizeNoColumn(self): | 
 | 444 |         self.cu.setoutputsize(42) | 
 | 445 |  | 
 | 446 |     def CheckCursorConnection(self): | 
 | 447 |         # Optional DB-API extension. | 
 | 448 |         self.failUnlessEqual(self.cu.connection, self.cx) | 
 | 449 |  | 
 | 450 |     def CheckWrongCursorCallable(self): | 
 | 451 |         try: | 
 | 452 |             def f(): pass | 
 | 453 |             cur = self.cx.cursor(f) | 
 | 454 |             self.fail("should have raised a TypeError") | 
 | 455 |         except TypeError: | 
 | 456 |             return | 
 | 457 |         self.fail("should have raised a ValueError") | 
 | 458 |  | 
 | 459 |     def CheckCursorWrongClass(self): | 
 | 460 |         class Foo: pass | 
 | 461 |         foo = Foo() | 
 | 462 |         try: | 
 | 463 |             cur = sqlite.Cursor(foo) | 
 | 464 |             self.fail("should have raised a ValueError") | 
 | 465 |         except TypeError: | 
 | 466 |             pass | 
 | 467 |  | 
 | 468 | class ThreadTests(unittest.TestCase): | 
 | 469 |     def setUp(self): | 
 | 470 |         self.con = sqlite.connect(":memory:") | 
 | 471 |         self.cur = self.con.cursor() | 
 | 472 |         self.cur.execute("create table test(id integer primary key, name text, bin binary, ratio number, ts timestamp)") | 
 | 473 |  | 
 | 474 |     def tearDown(self): | 
 | 475 |         self.cur.close() | 
 | 476 |         self.con.close() | 
 | 477 |  | 
 | 478 |     def CheckConCursor(self): | 
 | 479 |         def run(con, errors): | 
 | 480 |             try: | 
 | 481 |                 cur = con.cursor() | 
 | 482 |                 errors.append("did not raise ProgrammingError") | 
 | 483 |                 return | 
 | 484 |             except sqlite.ProgrammingError: | 
 | 485 |                 return | 
 | 486 |             except: | 
 | 487 |                 errors.append("raised wrong exception") | 
 | 488 |  | 
 | 489 |         errors = [] | 
 | 490 |         t = threading.Thread(target=run, kwargs={"con": self.con, "errors": errors}) | 
 | 491 |         t.start() | 
 | 492 |         t.join() | 
 | 493 |         if len(errors) > 0: | 
 | 494 |             self.fail("\n".join(errors)) | 
 | 495 |  | 
 | 496 |     def CheckConCommit(self): | 
 | 497 |         def run(con, errors): | 
 | 498 |             try: | 
 | 499 |                 con.commit() | 
 | 500 |                 errors.append("did not raise ProgrammingError") | 
 | 501 |                 return | 
 | 502 |             except sqlite.ProgrammingError: | 
 | 503 |                 return | 
 | 504 |             except: | 
 | 505 |                 errors.append("raised wrong exception") | 
 | 506 |  | 
 | 507 |         errors = [] | 
 | 508 |         t = threading.Thread(target=run, kwargs={"con": self.con, "errors": errors}) | 
 | 509 |         t.start() | 
 | 510 |         t.join() | 
 | 511 |         if len(errors) > 0: | 
 | 512 |             self.fail("\n".join(errors)) | 
 | 513 |  | 
 | 514 |     def CheckConRollback(self): | 
 | 515 |         def run(con, errors): | 
 | 516 |             try: | 
 | 517 |                 con.rollback() | 
 | 518 |                 errors.append("did not raise ProgrammingError") | 
 | 519 |                 return | 
 | 520 |             except sqlite.ProgrammingError: | 
 | 521 |                 return | 
 | 522 |             except: | 
 | 523 |                 errors.append("raised wrong exception") | 
 | 524 |  | 
 | 525 |         errors = [] | 
 | 526 |         t = threading.Thread(target=run, kwargs={"con": self.con, "errors": errors}) | 
 | 527 |         t.start() | 
 | 528 |         t.join() | 
 | 529 |         if len(errors) > 0: | 
 | 530 |             self.fail("\n".join(errors)) | 
 | 531 |  | 
 | 532 |     def CheckConClose(self): | 
 | 533 |         def run(con, errors): | 
 | 534 |             try: | 
 | 535 |                 con.close() | 
 | 536 |                 errors.append("did not raise ProgrammingError") | 
 | 537 |                 return | 
 | 538 |             except sqlite.ProgrammingError: | 
 | 539 |                 return | 
 | 540 |             except: | 
 | 541 |                 errors.append("raised wrong exception") | 
 | 542 |  | 
 | 543 |         errors = [] | 
 | 544 |         t = threading.Thread(target=run, kwargs={"con": self.con, "errors": errors}) | 
 | 545 |         t.start() | 
 | 546 |         t.join() | 
 | 547 |         if len(errors) > 0: | 
 | 548 |             self.fail("\n".join(errors)) | 
 | 549 |  | 
 | 550 |     def CheckCurImplicitBegin(self): | 
 | 551 |         def run(cur, errors): | 
 | 552 |             try: | 
 | 553 |                 cur.execute("insert into test(name) values ('a')") | 
 | 554 |                 errors.append("did not raise ProgrammingError") | 
 | 555 |                 return | 
 | 556 |             except sqlite.ProgrammingError: | 
 | 557 |                 return | 
 | 558 |             except: | 
 | 559 |                 errors.append("raised wrong exception") | 
 | 560 |  | 
 | 561 |         errors = [] | 
 | 562 |         t = threading.Thread(target=run, kwargs={"cur": self.cur, "errors": errors}) | 
 | 563 |         t.start() | 
 | 564 |         t.join() | 
 | 565 |         if len(errors) > 0: | 
 | 566 |             self.fail("\n".join(errors)) | 
 | 567 |  | 
 | 568 |     def CheckCurClose(self): | 
 | 569 |         def run(cur, errors): | 
 | 570 |             try: | 
 | 571 |                 cur.close() | 
 | 572 |                 errors.append("did not raise ProgrammingError") | 
 | 573 |                 return | 
 | 574 |             except sqlite.ProgrammingError: | 
 | 575 |                 return | 
 | 576 |             except: | 
 | 577 |                 errors.append("raised wrong exception") | 
 | 578 |  | 
 | 579 |         errors = [] | 
 | 580 |         t = threading.Thread(target=run, kwargs={"cur": self.cur, "errors": errors}) | 
 | 581 |         t.start() | 
 | 582 |         t.join() | 
 | 583 |         if len(errors) > 0: | 
 | 584 |             self.fail("\n".join(errors)) | 
 | 585 |  | 
 | 586 |     def CheckCurExecute(self): | 
 | 587 |         def run(cur, errors): | 
 | 588 |             try: | 
 | 589 |                 cur.execute("select name from test") | 
 | 590 |                 errors.append("did not raise ProgrammingError") | 
 | 591 |                 return | 
 | 592 |             except sqlite.ProgrammingError: | 
 | 593 |                 return | 
 | 594 |             except: | 
 | 595 |                 errors.append("raised wrong exception") | 
 | 596 |  | 
 | 597 |         errors = [] | 
 | 598 |         self.cur.execute("insert into test(name) values ('a')") | 
 | 599 |         t = threading.Thread(target=run, kwargs={"cur": self.cur, "errors": errors}) | 
 | 600 |         t.start() | 
 | 601 |         t.join() | 
 | 602 |         if len(errors) > 0: | 
 | 603 |             self.fail("\n".join(errors)) | 
 | 604 |  | 
 | 605 |     def CheckCurIterNext(self): | 
 | 606 |         def run(cur, errors): | 
 | 607 |             try: | 
 | 608 |                 row = cur.fetchone() | 
 | 609 |                 errors.append("did not raise ProgrammingError") | 
 | 610 |                 return | 
 | 611 |             except sqlite.ProgrammingError: | 
 | 612 |                 return | 
 | 613 |             except: | 
 | 614 |                 errors.append("raised wrong exception") | 
 | 615 |  | 
 | 616 |         errors = [] | 
 | 617 |         self.cur.execute("insert into test(name) values ('a')") | 
 | 618 |         self.cur.execute("select name from test") | 
 | 619 |         t = threading.Thread(target=run, kwargs={"cur": self.cur, "errors": errors}) | 
 | 620 |         t.start() | 
 | 621 |         t.join() | 
 | 622 |         if len(errors) > 0: | 
 | 623 |             self.fail("\n".join(errors)) | 
 | 624 |  | 
 | 625 | class ConstructorTests(unittest.TestCase): | 
 | 626 |     def CheckDate(self): | 
 | 627 |         d = sqlite.Date(2004, 10, 28) | 
 | 628 |  | 
 | 629 |     def CheckTime(self): | 
 | 630 |         t = sqlite.Time(12, 39, 35) | 
 | 631 |  | 
 | 632 |     def CheckTimestamp(self): | 
 | 633 |         ts = sqlite.Timestamp(2004, 10, 28, 12, 39, 35) | 
 | 634 |  | 
 | 635 |     def CheckDateFromTicks(self): | 
 | 636 |         d = sqlite.DateFromTicks(42) | 
 | 637 |  | 
 | 638 |     def CheckTimeFromTicks(self): | 
 | 639 |         t = sqlite.TimeFromTicks(42) | 
 | 640 |  | 
 | 641 |     def CheckTimestampFromTicks(self): | 
 | 642 |         ts = sqlite.TimestampFromTicks(42) | 
 | 643 |  | 
 | 644 |     def CheckBinary(self): | 
 | 645 |         b = sqlite.Binary(chr(0) + "'") | 
 | 646 |  | 
 | 647 | class ExtensionTests(unittest.TestCase): | 
 | 648 |     def CheckScriptStringSql(self): | 
 | 649 |         con = sqlite.connect(":memory:") | 
 | 650 |         cur = con.cursor() | 
 | 651 |         cur.executescript(""" | 
 | 652 |             -- bla bla | 
 | 653 |             /* a stupid comment */ | 
 | 654 |             create table a(i); | 
 | 655 |             insert into a(i) values (5); | 
 | 656 |             """) | 
 | 657 |         cur.execute("select i from a") | 
 | 658 |         res = cur.fetchone()[0] | 
 | 659 |         self.failUnlessEqual(res, 5) | 
 | 660 |  | 
 | 661 |     def CheckScriptStringUnicode(self): | 
 | 662 |         con = sqlite.connect(":memory:") | 
 | 663 |         cur = con.cursor() | 
 | 664 |         cur.executescript(u""" | 
 | 665 |             create table a(i); | 
 | 666 |             insert into a(i) values (5); | 
 | 667 |             select i from a; | 
 | 668 |             delete from a; | 
 | 669 |             insert into a(i) values (6); | 
 | 670 |             """) | 
 | 671 |         cur.execute("select i from a") | 
 | 672 |         res = cur.fetchone()[0] | 
 | 673 |         self.failUnlessEqual(res, 6) | 
 | 674 |  | 
 | 675 |     def CheckScriptErrorIncomplete(self): | 
 | 676 |         con = sqlite.connect(":memory:") | 
 | 677 |         cur = con.cursor() | 
 | 678 |         raised = False | 
 | 679 |         try: | 
 | 680 |             cur.executescript("create table test(sadfsadfdsa") | 
 | 681 |         except sqlite.ProgrammingError: | 
 | 682 |             raised = True | 
 | 683 |         self.failUnlessEqual(raised, True, "should have raised an exception") | 
 | 684 |  | 
 | 685 |     def CheckScriptErrorNormal(self): | 
 | 686 |         con = sqlite.connect(":memory:") | 
 | 687 |         cur = con.cursor() | 
 | 688 |         raised = False | 
 | 689 |         try: | 
 | 690 |             cur.executescript("create table test(sadfsadfdsa); select foo from hurz;") | 
 | 691 |         except sqlite.OperationalError: | 
 | 692 |             raised = True | 
 | 693 |         self.failUnlessEqual(raised, True, "should have raised an exception") | 
 | 694 |  | 
 | 695 |     def CheckConnectionExecute(self): | 
 | 696 |         con = sqlite.connect(":memory:") | 
 | 697 |         result = con.execute("select 5").fetchone()[0] | 
 | 698 |         self.failUnlessEqual(result, 5, "Basic test of Connection.execute") | 
 | 699 |  | 
 | 700 |     def CheckConnectionExecutemany(self): | 
 | 701 |         con = sqlite.connect(":memory:") | 
 | 702 |         con.execute("create table test(foo)") | 
 | 703 |         con.executemany("insert into test(foo) values (?)", [(3,), (4,)]) | 
 | 704 |         result = con.execute("select foo from test order by foo").fetchall() | 
 | 705 |         self.failUnlessEqual(result[0][0], 3, "Basic test of Connection.executemany") | 
 | 706 |         self.failUnlessEqual(result[1][0], 4, "Basic test of Connection.executemany") | 
 | 707 |  | 
 | 708 |     def CheckConnectionExecutescript(self): | 
 | 709 |         con = sqlite.connect(":memory:") | 
 | 710 |         con.executescript("create table test(foo); insert into test(foo) values (5);") | 
 | 711 |         result = con.execute("select foo from test").fetchone()[0] | 
 | 712 |         self.failUnlessEqual(result, 5, "Basic test of Connection.executescript") | 
 | 713 |  | 
 | 714 | class ClosedTests(unittest.TestCase): | 
 | 715 |     def setUp(self): | 
 | 716 |         pass | 
 | 717 |  | 
 | 718 |     def tearDown(self): | 
 | 719 |         pass | 
 | 720 |  | 
 | 721 |     def CheckClosedConCursor(self): | 
 | 722 |         con = sqlite.connect(":memory:") | 
 | 723 |         con.close() | 
 | 724 |         try: | 
 | 725 |             cur = con.cursor() | 
 | 726 |             self.fail("Should have raised a ProgrammingError") | 
 | 727 |         except sqlite.ProgrammingError: | 
 | 728 |             pass | 
 | 729 |         except: | 
 | 730 |             self.fail("Should have raised a ProgrammingError") | 
 | 731 |  | 
 | 732 |     def CheckClosedConCommit(self): | 
 | 733 |         con = sqlite.connect(":memory:") | 
 | 734 |         con.close() | 
 | 735 |         try: | 
 | 736 |             con.commit() | 
 | 737 |             self.fail("Should have raised a ProgrammingError") | 
 | 738 |         except sqlite.ProgrammingError: | 
 | 739 |             pass | 
 | 740 |         except: | 
 | 741 |             self.fail("Should have raised a ProgrammingError") | 
 | 742 |  | 
 | 743 |     def CheckClosedConRollback(self): | 
 | 744 |         con = sqlite.connect(":memory:") | 
 | 745 |         con.close() | 
 | 746 |         try: | 
 | 747 |             con.rollback() | 
 | 748 |             self.fail("Should have raised a ProgrammingError") | 
 | 749 |         except sqlite.ProgrammingError: | 
 | 750 |             pass | 
 | 751 |         except: | 
 | 752 |             self.fail("Should have raised a ProgrammingError") | 
 | 753 |  | 
 | 754 |     def CheckClosedCurExecute(self): | 
 | 755 |         con = sqlite.connect(":memory:") | 
 | 756 |         cur = con.cursor() | 
 | 757 |         con.close() | 
 | 758 |         try: | 
 | 759 |             cur.execute("select 4") | 
 | 760 |             self.fail("Should have raised a ProgrammingError") | 
 | 761 |         except sqlite.ProgrammingError: | 
 | 762 |             pass | 
 | 763 |         except: | 
 | 764 |             self.fail("Should have raised a ProgrammingError") | 
 | 765 |  | 
 | 766 | def suite(): | 
 | 767 |     module_suite = unittest.makeSuite(ModuleTests, "Check") | 
 | 768 |     connection_suite = unittest.makeSuite(ConnectionTests, "Check") | 
 | 769 |     cursor_suite = unittest.makeSuite(CursorTests, "Check") | 
 | 770 |     thread_suite = unittest.makeSuite(ThreadTests, "Check") | 
 | 771 |     constructor_suite = unittest.makeSuite(ConstructorTests, "Check") | 
 | 772 |     ext_suite = unittest.makeSuite(ExtensionTests, "Check") | 
 | 773 |     closed_suite = unittest.makeSuite(ClosedTests, "Check") | 
 | 774 |     return unittest.TestSuite((module_suite, connection_suite, cursor_suite, thread_suite, constructor_suite, ext_suite, closed_suite)) | 
 | 775 |  | 
 | 776 | def test(): | 
 | 777 |     runner = unittest.TextTestRunner() | 
 | 778 |     runner.run(suite()) | 
 | 779 |  | 
 | 780 | if __name__ == "__main__": | 
 | 781 |     test() |