fix: ensure config has no app when constructor finishes
had to move `make_engine_from_config()` out of app handler and define as a separate function, so that `get_engines()` did not need to instantiate the app handler. because if it did, then config extensions would lose the ability to set a default app handler - er, they could do it but it would be ignored
This commit is contained in:
parent
3ab181b129
commit
c3efbfbf7b
6 changed files with 110 additions and 102 deletions
|
@ -7,6 +7,8 @@ from unittest import TestCase
|
|||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
from sqlalchemy.engine import Engine
|
||||
from sqlalchemy.pool import NullPool
|
||||
|
||||
from wuttjamaican.db import conf
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
|
@ -93,3 +95,38 @@ class TestGetSetting(TestCase):
|
|||
def test_missing_value(self):
|
||||
value = conf.get_setting(self.session, 'foo')
|
||||
self.assertIsNone(value)
|
||||
|
||||
|
||||
class TestMakeEngineFromConfig(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
engine = conf.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
})
|
||||
self.assertIsInstance(engine, Engine)
|
||||
|
||||
def test_poolclass(self):
|
||||
|
||||
engine = conf.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
})
|
||||
self.assertNotIsInstance(engine.pool, NullPool)
|
||||
|
||||
engine = conf.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
'sqlalchemy.poolclass': 'sqlalchemy.pool:NullPool',
|
||||
})
|
||||
self.assertIsInstance(engine.pool, NullPool)
|
||||
|
||||
def test_pool_pre_ping(self):
|
||||
|
||||
engine = conf.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
})
|
||||
self.assertFalse(engine.pool._pre_ping)
|
||||
|
||||
engine = conf.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
'sqlalchemy.pool_pre_ping': 'true',
|
||||
})
|
||||
self.assertTrue(engine.pool._pre_ping)
|
||||
|
|
|
@ -9,8 +9,6 @@ from unittest.mock import patch, MagicMock
|
|||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
from sqlalchemy.engine import Engine
|
||||
from sqlalchemy.pool import NullPool
|
||||
|
||||
from wuttjamaican import app, db
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
|
@ -47,38 +45,6 @@ class TestAppHandler(TestCase):
|
|||
self.assertEqual(len(os.listdir(tempdir)), 3)
|
||||
shutil.rmtree(tempdir)
|
||||
|
||||
def test_make_engine_from_config_basic(self):
|
||||
engine = self.app.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
})
|
||||
self.assertIsInstance(engine, Engine)
|
||||
|
||||
def test_make_engine_from_config_poolclass(self):
|
||||
|
||||
engine = self.app.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
})
|
||||
self.assertNotIsInstance(engine.pool, NullPool)
|
||||
|
||||
engine = self.app.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
'sqlalchemy.poolclass': 'sqlalchemy.pool:NullPool',
|
||||
})
|
||||
self.assertIsInstance(engine.pool, NullPool)
|
||||
|
||||
def test_make_engine_from_config_pool_pre_ping(self):
|
||||
|
||||
engine = self.app.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
})
|
||||
self.assertFalse(engine.pool._pre_ping)
|
||||
|
||||
engine = self.app.make_engine_from_config({
|
||||
'sqlalchemy.url': 'sqlite://',
|
||||
'sqlalchemy.pool_pre_ping': 'true',
|
||||
})
|
||||
self.assertTrue(engine.pool._pre_ping)
|
||||
|
||||
def test_make_session(self):
|
||||
session = self.app.make_session()
|
||||
self.assertIsInstance(session, db.Session.class_)
|
||||
|
@ -118,7 +84,7 @@ class TestAppProvider(TestCase):
|
|||
def setUp(self):
|
||||
self.config = WuttaConfig(appname='wuttatest')
|
||||
self.app = app.AppHandler(self.config)
|
||||
self.config.app = self.app
|
||||
self.config._app = self.app
|
||||
|
||||
def test_constructor(self):
|
||||
|
||||
|
@ -198,7 +164,7 @@ class TestGenericHandler(TestCase):
|
|||
def setUp(self):
|
||||
self.config = WuttaConfig(appname='wuttatest')
|
||||
self.app = app.AppHandler(self.config)
|
||||
self.config.app = self.app
|
||||
self.config._app = self.app
|
||||
|
||||
def test_constructor(self):
|
||||
handler = app.GenericHandler(self.config)
|
||||
|
|
|
@ -228,6 +228,17 @@ configure_logging = true
|
|||
config = conf.WuttaConfig(files=[myfile])
|
||||
logging.config.fileConfig.assert_called_once()
|
||||
|
||||
def test_config_has_no_app_after_init(self):
|
||||
|
||||
# initial config should *not* have an app yet, otherwise
|
||||
# extensions cannot specify a default app handler
|
||||
config = conf.WuttaConfig()
|
||||
self.assertFalse(hasattr(config, '_app'))
|
||||
|
||||
# but after that we can get an app okay
|
||||
app = config.get_app()
|
||||
self.assertIs(app, config._app)
|
||||
|
||||
def test_setdefault(self):
|
||||
config = conf.WuttaConfig()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue