1
from test.lib.testing import assert_raises, assert_raises_message, eq_
1
from sqlalchemy.testing import assert_raises, assert_raises_message, eq_
4
4
import sqlalchemy.engine.url as url
5
5
from sqlalchemy import create_engine, engine_from_config, exc, pool
6
from sqlalchemy.engine import _coerce_config
6
from sqlalchemy.engine.util import _coerce_config
7
from sqlalchemy.engine.default import DefaultDialect
7
8
import sqlalchemy as tsa
8
from test.lib import fixtures, testing
9
from sqlalchemy.testing import fixtures
10
from sqlalchemy import testing
11
from sqlalchemy.testing.mock import Mock
10
14
class ParseConnectTest(fixtures.TestBase):
11
15
def test_rfc1738(self):
119
123
prefixed = dict(ini.items('prefixed'))
120
self.assert_(tsa.engine._coerce_config(prefixed, 'sqlalchemy.')
124
self.assert_(_coerce_config(prefixed, 'sqlalchemy.')
123
127
plain = dict(ini.items('plain'))
124
self.assert_(tsa.engine._coerce_config(plain, '') == expected)
128
self.assert_(_coerce_config(plain, '') == expected)
126
130
def test_engine_from_config(self):
127
131
dbapi = mock_dbapi
252
# pretend pysqlite throws the
253
# "Cannot operate on a closed database." error
254
# on connect. IRL we'd be getting Oracle's "shutdown in progress"
256
257
e = create_engine('sqlite://')
257
258
sqlite3 = e.dialect.dbapi
258
class ThrowOnConnect(MockDBAPI):
260
Error = sqlite3.Error
261
ProgrammingError = sqlite3.ProgrammingError
262
def connect(self, *args, **kw):
263
raise sqlite3.ProgrammingError("Cannot operate on a closed database.")
261
dbapi.Error = sqlite3.Error,
262
dbapi.ProgrammingError = sqlite3.ProgrammingError
263
dbapi.connect = Mock(side_effect=sqlite3.ProgrammingError(
264
"Cannot operate on a closed database."))
265
create_engine('sqlite://', module=ThrowOnConnect()).connect()
266
create_engine('sqlite://', module=dbapi).connect()
267
268
except tsa.exc.DBAPIError, de:
268
269
assert de.connection_invalidated
315
316
_initialize=False,
318
class MockDBAPI(object):
319
version_info = sqlite_version_info = 99, 9, 9
320
sqlite_version = '99.9.9'
322
def __init__(self, **kwargs):
324
self.paramstyle = 'named'
326
def connect(self, *args, **kwargs):
327
for k in self.kwargs:
319
class TestRegNewDBAPI(fixtures.TestBase):
320
def test_register_base(self):
321
from sqlalchemy.dialects import registry
322
registry.register("mockdialect", __name__, "MockDialect")
324
e = create_engine("mockdialect://")
325
assert isinstance(e.dialect, MockDialect)
327
def test_register_dotted(self):
328
from sqlalchemy.dialects import registry
329
registry.register("mockdialect.foob", __name__, "MockDialect")
331
e = create_engine("mockdialect+foob://")
332
assert isinstance(e.dialect, MockDialect)
334
def test_register_legacy(self):
335
from sqlalchemy.dialects import registry
336
tokens = __name__.split(".")
339
dialect = MockDialect
340
registry.register("mockdialect.foob", ".".join(tokens[0:-1]), tokens[-1])
342
e = create_engine("mockdialect+foob://")
343
assert isinstance(e.dialect, MockDialect)
345
def test_register_per_dbapi(self):
346
from sqlalchemy.dialects import registry
347
registry.register("mysql.my_mock_dialect", __name__, "MockDialect")
349
e = create_engine("mysql+my_mock_dialect://")
350
assert isinstance(e.dialect, MockDialect)
352
class MockDialect(DefaultDialect):
354
def dbapi(cls, **kw):
357
def MockDBAPI(**assert_kwargs):
358
connection = Mock(get_server_version_info=Mock(return_value='5.0'))
359
def connect(*args, **kwargs):
360
for k in assert_kwargs:
328
361
assert k in kwargs, 'key %s not present in dictionary' % k
329
assert kwargs[k] == self.kwargs[k], \
330
'value %s does not match %s' % (kwargs[k],
332
return MockConnection()
335
class MockConnection(object):
336
def get_server_info(self):
345
class MockCursor(object):
363
kwargs[k], assert_kwargs[k]
368
sqlite_version_info=(99, 9, 9,),
369
version_info=(99, 9, 9,),
370
sqlite_version='99.9.9',
372
connect=Mock(side_effect=connect)
349
375
mock_dbapi = MockDBAPI()
350
376
mock_sqlite_dbapi = msd = MockDBAPI()