diff --git a/tests/test_conf.py b/tests/test_conf.py index 684387e..c978e22 100644 --- a/tests/test_conf.py +++ b/tests/test_conf.py @@ -8,9 +8,6 @@ from unittest.mock import patch, MagicMock import pytest from wuttjamaican import conf as mod - -# TODO: get rid of this eventually -from wuttjamaican import conf from wuttjamaican.exc import ConfigurationError from wuttjamaican.app import AppHandler from wuttjamaican.testing import FileTestCase, ConfigTestCase @@ -21,19 +18,19 @@ class TestWuttaConfig(FileTestCase): return mod.WuttaConfig(**kwargs) def test_contstructor_basic(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertEqual(config.appname, "wutta") self.assertEqual(config.files_read, []) def test_constructor_valid_files(self): myfile = self.write_file("my.conf", "") - config = conf.WuttaConfig(files=[myfile]) + config = mod.WuttaConfig(files=[myfile]) self.assertEqual(len(config.files_read), 1) self.assertEqual(config.files_read[0], myfile) def test_constructor_missing_files(self): invalid = os.path.join(self.tempdir, "invalid.conf") - self.assertRaises(FileNotFoundError, conf.WuttaConfig, files=[invalid]) + self.assertRaises(FileNotFoundError, mod.WuttaConfig, files=[invalid]) def test_constructor_required_files_are_present(self): first = self.write_file( @@ -56,7 +53,7 @@ baz = B """, ) - config = conf.WuttaConfig(files=[second]) + config = mod.WuttaConfig(files=[second]) self.assertEqual(len(config.files_read), 2) # nb. files_read listing is in order of "priority" which is # same the as order in which files were initially read @@ -77,7 +74,7 @@ baz = B """, ) - self.assertRaises(FileNotFoundError, conf.WuttaConfig, files=[second]) + self.assertRaises(FileNotFoundError, mod.WuttaConfig, files=[second]) def test_constructor_included_files_are_present(self): first = self.write_file( @@ -100,7 +97,7 @@ baz = B """, ) - config = conf.WuttaConfig(files=[second]) + config = mod.WuttaConfig(files=[second]) self.assertEqual(len(config.files_read), 2) # nb. files_read listing is in order of "priority" which is # same the as order in which files were initially read @@ -121,7 +118,7 @@ baz = B """, ) - config = conf.WuttaConfig(files=[second]) + config = mod.WuttaConfig(files=[second]) self.assertEqual(len(config.files_read), 1) self.assertEqual(config.files_read[0], second) self.assertIsNone(config.get("foo.bar")) @@ -159,7 +156,7 @@ baz = C """, ) - config = conf.WuttaConfig(files=[top, middle, base]) + config = mod.WuttaConfig(files=[top, middle, base]) self.assertEqual(len(config.files_read), 3) # nb. files_read listing is in order of "priority" which is # same the as order in which files were initially read @@ -186,7 +183,7 @@ require = %(here)s/first.conf """, ) - config = conf.WuttaConfig(files=[second]) + config = mod.WuttaConfig(files=[second]) files = config.get_prioritized_files() self.assertEqual(len(files), 2) self.assertEqual(files[0], second) @@ -202,16 +199,16 @@ baz = %(__file__)s """, ) - config = conf.WuttaConfig(files=[myconf]) + config = mod.WuttaConfig(files=[myconf]) self.assertEqual(config.get("foo.bar"), f"{self.tempdir}/bar.txt") self.assertEqual(config.get("foo.baz"), myconf) def test_constructor_defaults(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertEqual(config.defaults, {}) self.assertIsNone(config.get("foo")) - config = conf.WuttaConfig(defaults={"foo": "bar"}) + config = mod.WuttaConfig(defaults={"foo": "bar"}) self.assertEqual(config.defaults, {"foo": "bar"}) self.assertEqual(config.get("foo"), "bar") @@ -233,17 +230,17 @@ preferdb = true ) # flags are off by default - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertFalse(config.usedb) self.assertFalse(config.preferdb) # but may override via constructor - config = conf.WuttaConfig(usedb=True, preferdb=True) + config = mod.WuttaConfig(usedb=True, preferdb=True) self.assertTrue(config.usedb) self.assertTrue(config.preferdb) # and also may override via config file - config = conf.WuttaConfig(files=[myfile]) + config = mod.WuttaConfig(files=[myfile]) self.assertTrue(config.usedb) self.assertTrue(config.preferdb) @@ -256,12 +253,12 @@ preferdb = true pytest.skip("test is not relevant without sqlalchemy") # flags are off by default - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertFalse(config.usedb) self.assertFalse(config.preferdb) # but caller may enable the flags (if sqlalchemy available) - config = conf.WuttaConfig(usedb=True, preferdb=True) + config = mod.WuttaConfig(usedb=True, preferdb=True) self.assertTrue(config.usedb) self.assertTrue(config.preferdb) @@ -276,7 +273,7 @@ preferdb = true return orig_import(name, *args, **kwargs) with patch("builtins.__import__", side_effect=mock_import): - config = conf.WuttaConfig(usedb=True, preferdb=True) + config = mod.WuttaConfig(usedb=True, preferdb=True) self.assertFalse(config.usedb) self.assertFalse(config.preferdb) @@ -289,19 +286,19 @@ configure_logging = true """, ) - with patch.object(conf.WuttaConfig, "_configure_logging") as method: + with patch.object(mod.WuttaConfig, "_configure_logging") as method: # no logging config by default - config = conf.WuttaConfig() + config = mod.WuttaConfig() method.assert_not_called() # but may override via constructor method.reset_mock() - config = conf.WuttaConfig(configure_logging=True) + config = mod.WuttaConfig(configure_logging=True) method.assert_called_once() # and also may override via config file method.reset_mock() - config = conf.WuttaConfig(files=[myfile]) + config = mod.WuttaConfig(files=[myfile]) method.assert_called_once() def test_constructor_configures_logging(self): @@ -318,7 +315,7 @@ configure_logging = true with patch("wuttjamaican.conf.logging") as logging: # basic constructor attempts logging config - config = conf.WuttaConfig(configure_logging=True) + config = mod.WuttaConfig(configure_logging=True) logging.config.fileConfig.assert_called_once() # if logging config fails, error is *not* raised @@ -326,18 +323,18 @@ configure_logging = true logging.config.fileConfig.side_effect = configparser.NoSectionError( "logging" ) - config = conf.WuttaConfig(configure_logging=True) + config = mod.WuttaConfig(configure_logging=True) logging.config.fileConfig.assert_called_once() # and it works if we specify config file logging.config.fileConfig.reset_mock() - config = conf.WuttaConfig(files=[myfile]) + config = mod.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() + config = mod.WuttaConfig() self.assertIsNone(config._app) # but after that we can get an app okay @@ -346,7 +343,7 @@ configure_logging = true self.assertIs(app, config._app) def test_setdefault(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() # value is empty by default self.assertIsNone(config.get("foo")) @@ -360,15 +357,15 @@ configure_logging = true self.assertEqual(config.setdefault("baz", "blarg"), "blarg") def test_get_require_with_default(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertRaises(ValueError, config.get, "foo", require=True, default="bar") def test_get_require_missing(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertRaises(ConfigurationError, config.get, "foo", require=True) def test_get_with_default(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() # nb. returns None if no default specified self.assertIsNone(config.get("foo")) self.assertEqual(config.get("foo", default="bar"), "bar") @@ -381,7 +378,7 @@ configure_logging = true pytest.skip("test is not relevant without sqlalchemy") # minimal config, but at least it needs db cxn info - config = conf.WuttaConfig(defaults={"wutta.db.default.url": "sqlite://"}) + config = mod.WuttaConfig(defaults={"wutta.db.default.url": "sqlite://"}) session = Session() @@ -414,17 +411,17 @@ configure_logging = true session.close() def test_get_default(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertIsNone(config.get("foo")) self.assertEqual(config.get("foo", default="bar"), "bar") def test_get_require(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertIsNone(config.get("foo")) self.assertRaises(ConfigurationError, config.get, "foo", require=True) def test_get_require_message(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertIsNone(config.get("foo")) try: config.get("foo", require=True, message="makin stuff up") @@ -439,7 +436,7 @@ configure_logging = true pytest.skip("test is not relevant without sqlalchemy") # start out with a default value - config = conf.WuttaConfig( + config = mod.WuttaConfig( defaults={"wutta.db.default.url": "sqlite://", "foo": "bar"} ) self.assertEqual(config.get("foo"), "bar") @@ -479,7 +476,7 @@ configure_logging = true session.close() def test_get_ambiguous(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() # value is returned if key is not ambiguous config.setdefault("foo", "bar") @@ -490,23 +487,23 @@ configure_logging = true self.assertIsNone(config.get("foo")) def test_require(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertRaises(ConfigurationError, config.require, "foo") def test_get_bool(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertFalse(config.get_bool("foo.bar")) config.setdefault("foo.bar", "true") self.assertTrue(config.get_bool("foo.bar")) def test_get_int(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertIsNone(config.get_int("foo.bar")) config.setdefault("foo.bar", "42") self.assertEqual(config.get_int("foo.bar"), 42) def test_get_list(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertIsNone(config.get_list("foo.bar")) config.setdefault("foo.bar", "hello world") self.assertEqual(config.get_list("foo.bar"), ["hello", "world"]) @@ -626,7 +623,7 @@ configure_logging = true def test_get_app(self): # default handler - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertEqual(config.default_app_handler_spec, "wuttjamaican.app:AppHandler") app = config.get_app() self.assertIsInstance(app, AppHandler) @@ -634,7 +631,7 @@ configure_logging = true self.assertIs(type(app), AppHandler) # custom default handler - config = conf.WuttaConfig() + config = mod.WuttaConfig() config.default_app_handler_spec = "tests.test_conf:CustomAppHandler" app = config.get_app() self.assertIsInstance(app, CustomAppHandler) @@ -646,7 +643,7 @@ configure_logging = true pytest.skip("test is not relevant without sqlalchemy") # default func - config = conf.WuttaConfig() + config = mod.WuttaConfig() self.assertEqual( config.default_engine_maker_spec, "wuttjamaican.db.conf:make_engine_from_config", @@ -655,7 +652,7 @@ configure_logging = true self.assertIs(make_engine, make_engine_from_config) # custom default func - config = conf.WuttaConfig() + config = mod.WuttaConfig() config.default_engine_maker_spec = ( "tests.test_conf:custom_make_engine_from_config" ) @@ -663,7 +660,7 @@ configure_logging = true self.assertIs(make_engine, custom_make_engine_from_config) def test_production(self): - config = conf.WuttaConfig() + config = mod.WuttaConfig() # false if not defined self.assertFalse(config.production()) @@ -683,15 +680,15 @@ def custom_make_engine_from_config(): class TestWuttaConfigExtension(TestCase): def test_basic(self): - config = conf.WuttaConfig() - ext = conf.WuttaConfigExtension() + config = mod.WuttaConfig() + ext = mod.WuttaConfigExtension() self.assertIsNone(ext.key) self.assertEqual(repr(ext), "WuttaConfigExtension(key=None)") class TestGenericDefaultFiles(TestCase): def test_linux(self): - files = conf.generic_default_files("wuttatest") + files = mod.generic_default_files("wuttatest") self.assertIsInstance(files, list) self.assertTrue(len(files) > 1) self.assertIn("/etc/wuttatest.conf", files) @@ -701,7 +698,7 @@ class TestGenericDefaultFiles(TestCase): win32com.shell.SHGetSpecialFolderPath.return_value = r"C:" + os.sep with patch.dict("sys.modules", **{"win32com.shell": win32com}): with patch("wuttjamaican.conf.sys", platform="win32"): - files = conf.generic_default_files("wuttatest") + files = mod.generic_default_files("wuttatest") self.assertIsInstance(files, list) self.assertTrue(len(files) > 1) self.assertIn(os.path.join("C:", "wuttatest.conf"), files) @@ -716,7 +713,7 @@ class TestGenericDefaultFiles(TestCase): with patch("builtins.__import__", side_effect=mock_import): with patch("wuttjamaican.conf.sys", platform="win32"): - files = conf.generic_default_files("wuttatest") + files = mod.generic_default_files("wuttatest") self.assertIsInstance(files, list) self.assertEqual(len(files), 0) @@ -731,11 +728,11 @@ winsvc.RattailFileMonitor = /path/to/other/file """, ) - files = conf.get_config_paths(files=[myconf], winsvc="RattailFileMonitor") + files = mod.get_config_paths(files=[myconf], winsvc="RattailFileMonitor") self.assertEqual(files, ["/path/to/other/file"]) def test_nonexistent_default_files(self): - files = conf.get_config_paths( + files = mod.get_config_paths( files=None, env_files_name="IGNORE_THIS", default_files=["/this/does/not/exist"], @@ -755,7 +752,7 @@ class TestMakeConfig(FileTestCase): with patch("wuttjamaican.conf.WuttaConfig") as WuttaConfig: # generic files are used if nothing is specified generic_default_files.return_value = [generic] - config = conf.make_config(appname="wuttatest") + config = mod.make_config(appname="wuttatest", extend=False) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [generic], appname="wuttatest", usedb=None, preferdb=None @@ -765,7 +762,7 @@ class TestMakeConfig(FileTestCase): generic_default_files.reset_mock() generic_default_files.return_value = [] WuttaConfig.reset_mock() - config = conf.make_config(appname="wuttatest") + config = mod.make_config(appname="wuttatest", extend=False) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [], appname="wuttatest", usedb=None, preferdb=None @@ -779,7 +776,7 @@ class TestMakeConfig(FileTestCase): with patch("wuttjamaican.conf.WuttaConfig") as WuttaConfig: # generic defaults are used if nothing specified generic_default_files.return_value = [generic] - config = conf.make_config(appname="wuttatest") + config = mod.make_config(appname="wuttatest", extend=False) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [generic], appname="wuttatest", usedb=None, preferdb=None @@ -788,7 +785,9 @@ class TestMakeConfig(FileTestCase): # can specify single default file generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config(appname="wuttatest", default_files=myfile) + config = mod.make_config( + appname="wuttatest", default_files=myfile, extend=False + ) generic_default_files.assert_not_called() WuttaConfig.assert_called_once_with( [myfile], appname="wuttatest", usedb=None, preferdb=None @@ -797,7 +796,9 @@ class TestMakeConfig(FileTestCase): # can specify default files as list generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config(appname="wuttatest", default_files=[myfile]) + config = mod.make_config( + appname="wuttatest", default_files=[myfile], extend=False + ) generic_default_files.assert_not_called() WuttaConfig.assert_called_once_with( [myfile], appname="wuttatest", usedb=None, preferdb=None @@ -806,8 +807,10 @@ class TestMakeConfig(FileTestCase): # can specify default files as callable generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config( - appname="wuttatest", default_files=lambda appname: [myfile] + config = mod.make_config( + appname="wuttatest", + default_files=lambda appname: [myfile], + extend=False, ) generic_default_files.assert_not_called() WuttaConfig.assert_called_once_with( @@ -823,7 +826,7 @@ class TestMakeConfig(FileTestCase): generic_default_files.return_value = [generic] # no plus files by default - config = conf.make_config(appname="wuttatest") + config = mod.make_config(appname="wuttatest", extend=False) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [generic], appname="wuttatest", usedb=None, preferdb=None @@ -832,7 +835,9 @@ class TestMakeConfig(FileTestCase): # can specify single plus file generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config(appname="wuttatest", plus_files=myfile) + config = mod.make_config( + appname="wuttatest", plus_files=myfile, extend=False + ) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [generic, myfile], appname="wuttatest", usedb=None, preferdb=None @@ -841,7 +846,9 @@ class TestMakeConfig(FileTestCase): # can specify plus files as list generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config(appname="wuttatest", plus_files=[myfile]) + config = mod.make_config( + appname="wuttatest", plus_files=[myfile], extend=False + ) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [generic, myfile], appname="wuttatest", usedb=None, preferdb=None @@ -850,8 +857,10 @@ class TestMakeConfig(FileTestCase): # can specify plus files via env generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config( - appname="wuttatest", env={"WUTTATEST_CONFIG_PLUS_FILES": myfile} + config = mod.make_config( + appname="wuttatest", + env={"WUTTATEST_CONFIG_PLUS_FILES": myfile}, + extend=False, ) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( @@ -867,7 +876,7 @@ class TestMakeConfig(FileTestCase): generic_default_files.return_value = [generic] # generic files by default - config = conf.make_config(appname="wuttatest") + config = mod.make_config(appname="wuttatest", extend=False) generic_default_files.assert_called_once_with("wuttatest") WuttaConfig.assert_called_once_with( [generic], appname="wuttatest", usedb=None, preferdb=None @@ -876,7 +885,7 @@ class TestMakeConfig(FileTestCase): # can specify single primary file (nb. no default files) generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config(myfile, appname="wuttatest") + config = mod.make_config(myfile, appname="wuttatest", extend=False) generic_default_files.assert_not_called() WuttaConfig.assert_called_once_with( [myfile], appname="wuttatest", usedb=None, preferdb=None @@ -885,7 +894,7 @@ class TestMakeConfig(FileTestCase): # can specify primary files as list generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config([myfile], appname="wuttatest") + config = mod.make_config([myfile], appname="wuttatest", extend=False) generic_default_files.assert_not_called() WuttaConfig.assert_called_once_with( [myfile], appname="wuttatest", usedb=None, preferdb=None @@ -894,8 +903,10 @@ class TestMakeConfig(FileTestCase): # can specify primary files via env generic_default_files.reset_mock() WuttaConfig.reset_mock() - config = conf.make_config( - appname="wuttatest", env={"WUTTATEST_CONFIG_FILES": myfile} + config = mod.make_config( + appname="wuttatest", + env={"WUTTATEST_CONFIG_FILES": myfile}, + extend=False, ) generic_default_files.assert_not_called() WuttaConfig.assert_called_once_with(