mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-11 11:22:15 -04:00
234 lines
8.2 KiB
Python
234 lines
8.2 KiB
Python
import testenv; testenv.configure_for_tests()
|
|
import ConfigParser, StringIO
|
|
import sqlalchemy.engine.url as url
|
|
from sqlalchemy import create_engine, engine_from_config
|
|
import testlib.sa as tsa
|
|
from testlib import TestBase
|
|
|
|
|
|
class ParseConnectTest(TestBase):
|
|
def test_rfc1738(self):
|
|
for text in (
|
|
'dbtype://username:password@hostspec:110//usr/db_file.db',
|
|
'dbtype://username:password@hostspec/database',
|
|
'dbtype://username:password@hostspec',
|
|
'dbtype://username:password@/database',
|
|
'dbtype://username@hostspec',
|
|
'dbtype://username:password@127.0.0.1:1521',
|
|
'dbtype://hostspec/database',
|
|
'dbtype://hostspec',
|
|
'dbtype://hostspec/?arg1=val1&arg2=val2',
|
|
'dbtype:///database',
|
|
'dbtype:///:memory:',
|
|
'dbtype:///foo/bar/im/a/file',
|
|
'dbtype:///E:/work/src/LEM/db/hello.db',
|
|
'dbtype:///E:/work/src/LEM/db/hello.db?foo=bar&hoho=lala',
|
|
'dbtype://',
|
|
'dbtype://username:password@/db',
|
|
'dbtype:////usr/local/mailman/lists/_xtest@example.com/members.db',
|
|
'dbtype://username:apples%2Foranges@hostspec/mydatabase',
|
|
):
|
|
u = url.make_url(text)
|
|
print u, text
|
|
print "username=", u.username, "password=", u.password, "database=", u.database, "host=", u.host
|
|
assert u.drivername == 'dbtype'
|
|
assert u.username == 'username' or u.username is None
|
|
assert u.password == 'password' or u.password == 'apples/oranges' or u.password is None
|
|
assert u.host == 'hostspec' or u.host == '127.0.0.1' or (not u.host)
|
|
assert str(u) == text
|
|
|
|
class CreateEngineTest(TestBase):
|
|
"""test that create_engine arguments of different types get propagated properly"""
|
|
def test_connect_query(self):
|
|
dbapi = MockDBAPI(foober='12', lala='18', fooz='somevalue')
|
|
|
|
# start the postgres dialect, but put our mock DBAPI as the module instead of psycopg
|
|
e = create_engine('postgres://scott:tiger@somehost/test?foober=12&lala=18&fooz=somevalue', module=dbapi)
|
|
c = e.connect()
|
|
|
|
def test_kwargs(self):
|
|
dbapi = MockDBAPI(foober=12, lala=18, hoho={'this':'dict'}, fooz='somevalue')
|
|
|
|
# start the postgres dialect, but put our mock DBAPI as the module instead of psycopg
|
|
e = create_engine('postgres://scott:tiger@somehost/test?fooz=somevalue', connect_args={'foober':12, 'lala':18, 'hoho':{'this':'dict'}}, module=dbapi)
|
|
c = e.connect()
|
|
|
|
def test_coerce_config(self):
|
|
raw = r"""
|
|
[prefixed]
|
|
sqlalchemy.url=postgres://scott:tiger@somehost/test?fooz=somevalue
|
|
sqlalchemy.convert_unicode=0
|
|
sqlalchemy.echo=false
|
|
sqlalchemy.echo_pool=1
|
|
sqlalchemy.max_overflow=2
|
|
sqlalchemy.pool_recycle=50
|
|
sqlalchemy.pool_size=2
|
|
sqlalchemy.pool_threadlocal=1
|
|
sqlalchemy.pool_timeout=10
|
|
[plain]
|
|
url=postgres://scott:tiger@somehost/test?fooz=somevalue
|
|
convert_unicode=0
|
|
echo=0
|
|
echo_pool=1
|
|
max_overflow=2
|
|
pool_recycle=50
|
|
pool_size=2
|
|
pool_threadlocal=1
|
|
pool_timeout=10
|
|
"""
|
|
ini = ConfigParser.ConfigParser()
|
|
ini.readfp(StringIO.StringIO(raw))
|
|
|
|
expected = {
|
|
'url': 'postgres://scott:tiger@somehost/test?fooz=somevalue',
|
|
'convert_unicode': 0,
|
|
'echo': False,
|
|
'echo_pool': True,
|
|
'max_overflow': 2,
|
|
'pool_recycle': 50,
|
|
'pool_size': 2,
|
|
'pool_threadlocal': True,
|
|
'pool_timeout': 10,
|
|
}
|
|
|
|
prefixed = dict(ini.items('prefixed'))
|
|
self.assert_(tsa.engine._coerce_config(prefixed, 'sqlalchemy.') == expected)
|
|
|
|
plain = dict(ini.items('plain'))
|
|
self.assert_(tsa.engine._coerce_config(plain, '') == expected)
|
|
|
|
def test_engine_from_config(self):
|
|
dbapi = MockDBAPI()
|
|
|
|
config = {
|
|
'sqlalchemy.url':'postgres://scott:tiger@somehost/test?fooz=somevalue',
|
|
'sqlalchemy.pool_recycle':'50',
|
|
'sqlalchemy.echo':'true'
|
|
}
|
|
|
|
e = engine_from_config(config, module=dbapi)
|
|
assert e.pool._recycle == 50
|
|
assert e.url == url.make_url('postgres://scott:tiger@somehost/test?fooz=somevalue')
|
|
assert e.echo is True
|
|
|
|
def test_custom(self):
|
|
dbapi = MockDBAPI(foober=12, lala=18, hoho={'this':'dict'}, fooz='somevalue')
|
|
|
|
def connect():
|
|
return dbapi.connect(foober=12, lala=18, fooz='somevalue', hoho={'this':'dict'})
|
|
|
|
# start the postgres dialect, but put our mock DBAPI as the module instead of psycopg
|
|
e = create_engine('postgres://', creator=connect, module=dbapi)
|
|
c = e.connect()
|
|
|
|
def test_recycle(self):
|
|
dbapi = MockDBAPI(foober=12, lala=18, hoho={'this':'dict'}, fooz='somevalue')
|
|
e = create_engine('postgres://', pool_recycle=472, module=dbapi)
|
|
assert e.pool._recycle == 472
|
|
|
|
def test_badargs(self):
|
|
# good arg, use MockDBAPI to prevent oracle import errors
|
|
e = create_engine('oracle://', use_ansi=True, module=MockDBAPI())
|
|
|
|
try:
|
|
e = create_engine("foobar://", module=MockDBAPI())
|
|
assert False
|
|
except ImportError:
|
|
assert True
|
|
|
|
# bad arg
|
|
try:
|
|
e = create_engine('postgres://', use_ansi=True, module=MockDBAPI())
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
# bad arg
|
|
try:
|
|
e = create_engine('oracle://', lala=5, use_ansi=True, module=MockDBAPI())
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
try:
|
|
e = create_engine('postgres://', lala=5, module=MockDBAPI())
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
try:
|
|
e = create_engine('sqlite://', lala=5)
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
try:
|
|
e = create_engine('mysql://', use_unicode=True, module=MockDBAPI())
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
try:
|
|
# sqlite uses SingletonThreadPool which doesnt have max_overflow
|
|
e = create_engine('sqlite://', max_overflow=5)
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
e = create_engine('mysql://', module=MockDBAPI(), connect_args={'use_unicode':True}, convert_unicode=True)
|
|
|
|
e = create_engine('sqlite://', connect_args={'use_unicode':True}, convert_unicode=True)
|
|
try:
|
|
c = e.connect()
|
|
assert False
|
|
except tsa.exc.DBAPIError:
|
|
assert True
|
|
|
|
def test_urlattr(self):
|
|
"""test the url attribute on ``Engine``."""
|
|
|
|
e = create_engine('mysql://scott:tiger@localhost/test', module=MockDBAPI())
|
|
u = url.make_url('mysql://scott:tiger@localhost/test')
|
|
e2 = create_engine(u, module=MockDBAPI())
|
|
assert e.url.drivername == e2.url.drivername == 'mysql'
|
|
assert e.url.username == e2.url.username == 'scott'
|
|
assert e2.url is u
|
|
|
|
def test_poolargs(self):
|
|
"""test that connection pool args make it thru"""
|
|
e = create_engine('postgres://', creator=None, pool_recycle=50, echo_pool=None, module=MockDBAPI())
|
|
assert e.pool._recycle == 50
|
|
|
|
# these args work for QueuePool
|
|
e = create_engine('postgres://', max_overflow=8, pool_timeout=60, poolclass=tsa.pool.QueuePool, module=MockDBAPI())
|
|
|
|
try:
|
|
# but not SingletonThreadPool
|
|
e = create_engine('sqlite://', max_overflow=8, pool_timeout=60, poolclass=tsa.pool.SingletonThreadPool)
|
|
assert False
|
|
except TypeError:
|
|
assert True
|
|
|
|
class MockDBAPI(object):
|
|
def __init__(self, **kwargs):
|
|
self.kwargs = kwargs
|
|
self.paramstyle = 'named'
|
|
def connect(self, **kwargs):
|
|
print kwargs, self.kwargs
|
|
for k in self.kwargs:
|
|
assert k in kwargs, "key %s not present in dictionary" % k
|
|
assert kwargs[k]==self.kwargs[k], "value %s does not match %s" % (kwargs[k], self.kwargs[k])
|
|
return MockConnection()
|
|
class MockConnection(object):
|
|
def close(self):
|
|
pass
|
|
def cursor(self):
|
|
return MockCursor()
|
|
class MockCursor(object):
|
|
def close(self):
|
|
pass
|
|
mock_dbapi = MockDBAPI()
|
|
|
|
if __name__ == "__main__":
|
|
testenv.main()
|