Source code for sqlobject.tests.test_sqlite
import math
import threading
import pytest
from sqlobject import SQLObject, StringCol, FloatCol
from sqlobject.compat import string_type
from sqlobject.sqlbuilder import Select
from sqlobject.tests.dbtest import getConnection, setupClass, supports
from sqlobject.tests.dbtest import setSQLiteConnectionFactory
from .test_basic import SOTestSO1
try:
connection = getConnection()
except (AttributeError, NameError):
# The module was imported during documentation building
pass
else:
if connection.dbName != "sqlite":
pytestmark = pytest.mark.skip("These tests require SQLite")
[docs]class SQLiteFactoryTest(SQLObject):
name = StringCol()
[docs]def test_sqlite_factory():
setupClass(SQLiteFactoryTest)
if not SQLiteFactoryTest._connection.using_sqlite2:
pytest.skip("These tests require SQLite v2+")
factory = [None]
def SQLiteConnectionFactory(sqlite):
class MyConnection(sqlite.Connection):
pass
factory[0] = MyConnection
return MyConnection
setSQLiteConnectionFactory(SQLiteFactoryTest, SQLiteConnectionFactory)
conn = SQLiteFactoryTest._connection.makeConnection()
assert factory[0]
assert isinstance(conn, factory[0])
[docs]def test_sqlite_factory_str():
setupClass(SQLiteFactoryTest)
if not SQLiteFactoryTest._connection.using_sqlite2:
pytest.skip("These tests require SQLite v2+")
factory = [None]
def SQLiteConnectionFactory(sqlite):
class MyConnection(sqlite.Connection):
pass
factory[0] = MyConnection
return MyConnection
from sqlobject.sqlite import sqliteconnection
sqliteconnection.SQLiteConnectionFactory = SQLiteConnectionFactory
setSQLiteConnectionFactory(SQLiteFactoryTest, "SQLiteConnectionFactory")
conn = SQLiteFactoryTest._connection.makeConnection()
assert factory[0]
assert isinstance(conn, factory[0])
del sqliteconnection.SQLiteConnectionFactory
[docs]def test_sqlite_aggregate():
setupClass(SQLiteFactoryTest)
if not SQLiteFactoryTest._connection.using_sqlite2:
pytest.skip("These tests require SQLite v2+")
def SQLiteConnectionFactory(sqlite):
class MyConnection(sqlite.Connection):
def __init__(self, *args, **kwargs):
super(MyConnection, self).__init__(*args, **kwargs)
self.create_aggregate("group_concat", 1, self.group_concat)
class group_concat:
def __init__(self):
self.acc = []
def step(self, value):
if isinstance(value, string_type):
self.acc.append(value)
else:
self.acc.append(str(value))
def finalize(self):
self.acc.sort()
return ", ".join(self.acc)
return MyConnection
setSQLiteConnectionFactory(SQLiteFactoryTest, SQLiteConnectionFactory)
SQLiteFactoryTest(name='sqlobject')
SQLiteFactoryTest(name='sqlbuilder')
assert SQLiteFactoryTest.select(orderBy="name").\
accumulateOne("group_concat", "name") == \
"sqlbuilder, sqlobject"
[docs]def do_select():
list(SOTestSO1.select())
[docs]def test_sqlite_threaded():
setupClass(SOTestSO1)
t = threading.Thread(target=do_select)
t.start()
t.join()
# This should reuse the same connection as the connection
# made above (at least will with most database drivers, but
# this will cause an error in SQLite):
do_select()
[docs]def test_empty_string():
setupClass(SOTestSO1)
test = SOTestSO1(name=None, passwd='')
assert test.name is None
assert test.passwd == ''
[docs]def test_memorydb():
if not supports("memorydb"):
pytest.skip("memorydb isn't supported")
if not connection._memory:
pytest.skip("The connection isn't memorydb")
setupClass(SOTestSO1)
connection.close() # create a new connection to an in-memory database
SOTestSO1.setConnection(connection)
SOTestSO1.createTable()
[docs]def test_list_databases():
assert 'main' in connection.listDatabases()
[docs]def test_list_tables():
setupClass(SOTestSO1)
assert SOTestSO1.sqlmeta.table in connection.listTables()
[docs]class SQLiteTruedivTest(SQLObject):
value = FloatCol()
[docs]def test_truediv():
setupClass(SQLiteTruedivTest)
if SQLiteTruedivTest._connection.dbName == "sqlite":
if not SQLiteTruedivTest._connection.using_sqlite2:
pytest.skip("These tests require SQLite v2+")
def SQLiteConnectionFactory(sqlite):
class MyConnection(sqlite.Connection):
def __init__(self, *args, **kwargs):
super(MyConnection, self).__init__(*args, **kwargs)
self.create_function("floor", 1, math.floor)
return MyConnection
setSQLiteConnectionFactory(SQLiteTruedivTest, SQLiteConnectionFactory)
SQLiteTruedivTest(value=-5.0)
assert SQLiteTruedivTest._connection.queryAll(
SQLiteTruedivTest._connection.sqlrepr(
Select(SQLiteTruedivTest.q.value // 4)))[0][0] == -2