From a550b5c112e4744880e97439c2df41ea2d7f6a41 Mon Sep 17 00:00:00 2001 From: Tim Mundt Date: Fri, 16 Dec 2016 18:46:07 +0100 Subject: [PATCH] added tests and small fixes for config --- sanic/config.py | 7 ++-- tests/test_config.py | 76 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 tests/test_config.py diff --git a/sanic/config.py b/sanic/config.py index 55cebc61..feb3b484 100644 --- a/sanic/config.py +++ b/sanic/config.py @@ -4,7 +4,7 @@ import types class Config(dict): def __init__(self, defaults=None): - dict.__init__(self, defaults or {}) + super().__init__(defaults or {}) self.LOGO = """ ▄▄▄▄▄ ▀▀▀██████▄▄▄ _______________ @@ -31,7 +31,10 @@ class Config(dict): self.ROUTER_CACHE_SIZE = 1024 def __getattr__(self, attr): - return self[attr] + try: + return self[attr] + except KeyError as ke: + raise AttributeError("Config has no '{}'".format(ke.args[0])) def __setattr__(self, attr, value): self[attr] = value diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 00000000..c7e41ade --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,76 @@ +from os import environ +import pytest +from tempfile import NamedTemporaryFile + +from sanic import Sanic + + +def test_load_from_object(): + app = Sanic('test_load_from_object') + class Config: + not_for_config = 'should not be used' + CONFIG_VALUE = 'should be used' + + app.config.from_object(Config) + assert 'CONFIG_VALUE' in app.config + assert app.config.CONFIG_VALUE == 'should be used' + assert 'not_for_config' not in app.config + + +def test_load_from_file(): + app = Sanic('test_load_from_file') + config = b""" +VALUE = 'some value' +condition = 1 == 1 +if condition: + CONDITIONAL = 'should be set' + """ + with NamedTemporaryFile() as config_file: + config_file.write(config) + config_file.seek(0) + app.config.from_pyfile(config_file.name) + assert 'VALUE' in app.config + assert app.config.VALUE == 'some value' + assert 'CONDITIONAL' in app.config + assert app.config.CONDITIONAL == 'should be set' + assert 'condition' not in app.config + + +def test_load_from_missing_file(): + app = Sanic('test_load_from_missing_file') + with pytest.raises(IOError): + app.config.from_pyfile('non-existent file') + + +def test_load_from_envvar(): + app = Sanic('test_load_from_envvar') + config = b"VALUE = 'some value'" + with NamedTemporaryFile() as config_file: + config_file.write(config) + config_file.seek(0) + environ['APP_CONFIG'] = config_file.name + app.config.from_envvar('APP_CONFIG') + assert 'VALUE' in app.config + assert app.config.VALUE == 'some value' + + +def test_load_from_missing_envvar(): + app = Sanic('test_load_from_missing_envvar') + with pytest.raises(RuntimeError): + app.config.from_envvar('non-existent variable') + + +def test_overwrite_exisiting_config(): + app = Sanic('test_overwrite_exisiting_config') + app.config.DEFAULT = 1 + class Config: + DEFAULT = 2 + + app.config.from_object(Config) + assert app.config.DEFAULT == 2 + + +def test_missing_config(): + app = Sanic('test_missing_config') + with pytest.raises(AttributeError): + app.config.NON_EXISTENT