sanic/tests/test_config.py

142 lines
3.7 KiB
Python
Raw Normal View History

2016-12-16 17:46:07 +00:00
from os import environ
2018-09-29 18:54:47 +01:00
from pathlib import Path
from contextlib import contextmanager
from tempfile import TemporaryDirectory
from textwrap import dedent
2016-12-16 17:46:07 +00:00
import pytest
from sanic import Sanic
from sanic.exceptions import PyFileError
2016-12-16 17:46:07 +00:00
2018-09-29 18:54:47 +01:00
@contextmanager
def temp_path():
""" a simple cross platform replacement for NamedTemporaryFile """
with TemporaryDirectory() as td:
2018-12-30 11:18:06 +00:00
yield Path(td, "file")
2018-09-29 18:54:47 +01:00
2018-08-26 15:43:14 +01:00
def test_load_from_object(app):
2016-12-16 17:46:07 +00:00
class Config:
2018-12-30 11:18:06 +00:00
not_for_config = "should not be used"
CONFIG_VALUE = "should be used"
2016-12-16 17:46:07 +00:00
app.config.from_object(Config)
2018-12-30 11:18:06 +00:00
assert "CONFIG_VALUE" in app.config
assert app.config.CONFIG_VALUE == "should be used"
assert "not_for_config" not in app.config
2016-12-16 17:46:07 +00:00
def test_auto_load_env():
environ["SANIC_TEST_ANSWER"] = "42"
app = Sanic()
2017-09-05 09:58:48 +01:00
assert app.config.TEST_ANSWER == 42
del environ["SANIC_TEST_ANSWER"]
2017-09-05 09:58:48 +01:00
def test_dont_load_env():
environ["SANIC_TEST_ANSWER"] = "42"
app = Sanic(load_env=False)
2018-12-30 11:18:06 +00:00
assert getattr(app.config, "TEST_ANSWER", None) is None
del environ["SANIC_TEST_ANSWER"]
2016-12-16 17:46:07 +00:00
2017-09-05 09:58:48 +01:00
def test_load_env_prefix():
environ["MYAPP_TEST_ANSWER"] = "42"
2018-12-30 11:18:06 +00:00
app = Sanic(load_env="MYAPP_")
2017-09-05 09:58:48 +01:00
assert app.config.TEST_ANSWER == 42
del environ["MYAPP_TEST_ANSWER"]
def test_load_env_prefix_float_values():
environ["MYAPP_TEST_ROI"] = "2.3"
app = Sanic(load_env="MYAPP_")
assert app.config.TEST_ROI == 2.3
del environ["MYAPP_TEST_ROI"]
def test_load_env_prefix_string_value():
environ["MYAPP_TEST_TOKEN"] = "somerandomtesttoken"
app = Sanic(load_env="MYAPP_")
assert app.config.TEST_TOKEN == "somerandomtesttoken"
del environ["MYAPP_TEST_TOKEN"]
2018-08-26 15:43:14 +01:00
def test_load_from_file(app):
2018-12-30 11:18:06 +00:00
config = dedent(
"""
2018-09-29 18:54:47 +01:00
VALUE = 'some value'
condition = 1 == 1
if condition:
CONDITIONAL = 'should be set'
2018-12-30 11:18:06 +00:00
"""
)
2018-09-29 18:54:47 +01:00
with temp_path() as config_path:
config_path.write_text(config)
app.config.from_pyfile(str(config_path))
2018-12-30 11:18:06 +00:00
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
2016-12-16 17:46:07 +00:00
2018-08-26 15:43:14 +01:00
def test_load_from_missing_file(app):
2016-12-16 17:46:07 +00:00
with pytest.raises(IOError):
2018-12-30 11:18:06 +00:00
app.config.from_pyfile("non-existent file")
2016-12-16 17:46:07 +00:00
2018-08-26 15:43:14 +01:00
def test_load_from_envvar(app):
2018-09-29 18:54:47 +01:00
config = "VALUE = 'some value'"
with temp_path() as config_path:
config_path.write_text(config)
2018-12-30 11:18:06 +00:00
environ["APP_CONFIG"] = str(config_path)
app.config.from_envvar("APP_CONFIG")
assert "VALUE" in app.config
assert app.config.VALUE == "some value"
2016-12-16 17:46:07 +00:00
2018-08-26 15:43:14 +01:00
def test_load_from_missing_envvar(app):
with pytest.raises(RuntimeError) as e:
2018-12-30 11:18:06 +00:00
app.config.from_envvar("non-existent variable")
assert str(e.value) == (
"The environment variable 'non-existent "
"variable' is not set and thus configuration "
"could not be loaded."
)
2016-12-16 17:46:07 +00:00
def test_load_config_from_file_invalid_syntax(app):
config = "VALUE = some value"
with temp_path() as config_path:
config_path.write_text(config)
with pytest.raises(PyFileError):
app.config.from_pyfile(config_path)
2018-08-26 15:43:14 +01:00
def test_overwrite_exisiting_config(app):
2016-12-16 17:46:07 +00:00
app.config.DEFAULT = 1
2016-12-16 17:46:07 +00:00
class Config:
DEFAULT = 2
app.config.from_object(Config)
assert app.config.DEFAULT == 2
2018-10-06 23:14:37 +01:00
def test_overwrite_exisiting_config_ignore_lowercase(app):
app.config.default = 1
class Config:
default = 2
app.config.from_object(Config)
assert app.config.default == 1
2018-08-26 15:43:14 +01:00
def test_missing_config(app):
with pytest.raises(AttributeError) as e:
2016-12-16 17:46:07 +00:00
app.config.NON_EXISTENT
assert str(e.value) == ("Config has no 'NON_EXISTENT'")