21.3 deprecations (#2007)
* Cleanup deprecations * Remove config deprecations and fix config compat * Add some tests and remove unneeded dependency * Add some tests and remove unneeded dependency * Remove pytest-dependency
This commit is contained in:
@@ -22,24 +22,41 @@ class ConfigTest:
|
||||
not_for_config = "should not be used"
|
||||
CONFIG_VALUE = "should be used"
|
||||
|
||||
@property
|
||||
def ANOTHER_VALUE(self):
|
||||
return self.CONFIG_VALUE
|
||||
|
||||
@property
|
||||
def another_not_for_config(self):
|
||||
return self.not_for_config
|
||||
|
||||
|
||||
def test_load_from_object(app):
|
||||
app.config.from_object(ConfigTest)
|
||||
app.config.load(ConfigTest)
|
||||
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_object_string(app):
|
||||
app.config.from_object("test_config.ConfigTest")
|
||||
app.config.load("test_config.ConfigTest")
|
||||
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_instance(app):
|
||||
app.config.load(ConfigTest())
|
||||
assert "CONFIG_VALUE" in app.config
|
||||
assert app.config.CONFIG_VALUE == "should be used"
|
||||
assert app.config.ANOTHER_VALUE == "should be used"
|
||||
assert "not_for_config" not in app.config
|
||||
assert "another_not_for_config" not in app.config
|
||||
|
||||
|
||||
def test_load_from_object_string_exception(app):
|
||||
with pytest.raises(ImportError):
|
||||
app.config.from_object("test_config.Config.test")
|
||||
app.config.load("test_config.Config.test")
|
||||
|
||||
|
||||
def test_auto_load_env():
|
||||
@@ -52,7 +69,7 @@ def test_auto_load_env():
|
||||
def test_auto_load_bool_env():
|
||||
environ["SANIC_TEST_ANSWER"] = "True"
|
||||
app = Sanic(name=__name__)
|
||||
assert app.config.TEST_ANSWER == True
|
||||
assert app.config.TEST_ANSWER is True
|
||||
del environ["SANIC_TEST_ANSWER"]
|
||||
|
||||
|
||||
@@ -95,7 +112,7 @@ def test_load_from_file(app):
|
||||
)
|
||||
with temp_path() as config_path:
|
||||
config_path.write_text(config)
|
||||
app.config.from_pyfile(str(config_path))
|
||||
app.config.load(str(config_path))
|
||||
assert "VALUE" in app.config
|
||||
assert app.config.VALUE == "some value"
|
||||
assert "CONDITIONAL" in app.config
|
||||
@@ -105,7 +122,7 @@ def test_load_from_file(app):
|
||||
|
||||
def test_load_from_missing_file(app):
|
||||
with pytest.raises(IOError):
|
||||
app.config.from_pyfile("non-existent file")
|
||||
app.config.load("non-existent file")
|
||||
|
||||
|
||||
def test_load_from_envvar(app):
|
||||
@@ -113,14 +130,14 @@ def test_load_from_envvar(app):
|
||||
with temp_path() as config_path:
|
||||
config_path.write_text(config)
|
||||
environ["APP_CONFIG"] = str(config_path)
|
||||
app.config.from_envvar("APP_CONFIG")
|
||||
app.config.load("${APP_CONFIG}")
|
||||
assert "VALUE" in app.config
|
||||
assert app.config.VALUE == "some value"
|
||||
|
||||
|
||||
def test_load_from_missing_envvar(app):
|
||||
with pytest.raises(RuntimeError) as e:
|
||||
app.config.from_envvar("non-existent variable")
|
||||
with pytest.raises(IOError) as e:
|
||||
app.config.load("non-existent variable")
|
||||
assert str(e.value) == (
|
||||
"The environment variable 'non-existent "
|
||||
"variable' is not set and thus configuration "
|
||||
@@ -134,7 +151,7 @@ def test_load_config_from_file_invalid_syntax(app):
|
||||
config_path.write_text(config)
|
||||
|
||||
with pytest.raises(PyFileError):
|
||||
app.config.from_pyfile(config_path)
|
||||
app.config.load(config_path)
|
||||
|
||||
|
||||
def test_overwrite_exisiting_config(app):
|
||||
@@ -143,7 +160,7 @@ def test_overwrite_exisiting_config(app):
|
||||
class Config:
|
||||
DEFAULT = 2
|
||||
|
||||
app.config.from_object(Config)
|
||||
app.config.load(Config)
|
||||
assert app.config.DEFAULT == 2
|
||||
|
||||
|
||||
@@ -153,14 +170,12 @@ def test_overwrite_exisiting_config_ignore_lowercase(app):
|
||||
class Config:
|
||||
default = 2
|
||||
|
||||
app.config.from_object(Config)
|
||||
app.config.load(Config)
|
||||
assert app.config.default == 1
|
||||
|
||||
|
||||
def test_missing_config(app):
|
||||
with pytest.raises(
|
||||
AttributeError, match="Config has no 'NON_EXISTENT'"
|
||||
) as e:
|
||||
with pytest.raises(AttributeError, match="Config has no 'NON_EXISTENT'"):
|
||||
_ = app.config.NON_EXISTENT
|
||||
|
||||
|
||||
@@ -175,7 +190,8 @@ def test_config_defaults():
|
||||
|
||||
def test_config_custom_defaults():
|
||||
"""
|
||||
we should have all the variables from defaults rewriting them with custom defaults passed in
|
||||
we should have all the variables from defaults rewriting them with
|
||||
custom defaults passed in
|
||||
Config
|
||||
"""
|
||||
custom_defaults = {
|
||||
@@ -192,7 +208,8 @@ def test_config_custom_defaults():
|
||||
|
||||
def test_config_custom_defaults_with_env():
|
||||
"""
|
||||
test that environment variables has higher priority than DEFAULT_CONFIG and passed defaults dict
|
||||
test that environment variables has higher priority than DEFAULT_CONFIG
|
||||
and passed defaults dict
|
||||
"""
|
||||
custom_defaults = {
|
||||
"REQUEST_MAX_SIZE123": 1,
|
||||
@@ -226,22 +243,22 @@ def test_config_custom_defaults_with_env():
|
||||
|
||||
|
||||
def test_config_access_log_passing_in_run(app):
|
||||
assert app.config.ACCESS_LOG == True
|
||||
assert app.config.ACCESS_LOG is True
|
||||
|
||||
@app.listener("after_server_start")
|
||||
async def _request(sanic, loop):
|
||||
app.stop()
|
||||
|
||||
app.run(port=1340, access_log=False)
|
||||
assert app.config.ACCESS_LOG == False
|
||||
assert app.config.ACCESS_LOG is False
|
||||
|
||||
app.run(port=1340, access_log=True)
|
||||
assert app.config.ACCESS_LOG == True
|
||||
assert app.config.ACCESS_LOG is True
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_config_access_log_passing_in_create_server(app):
|
||||
assert app.config.ACCESS_LOG == True
|
||||
assert app.config.ACCESS_LOG is True
|
||||
|
||||
@app.listener("after_server_start")
|
||||
async def _request(sanic, loop):
|
||||
@@ -250,24 +267,51 @@ async def test_config_access_log_passing_in_create_server(app):
|
||||
await app.create_server(
|
||||
port=1341, access_log=False, return_asyncio_server=True
|
||||
)
|
||||
assert app.config.ACCESS_LOG == False
|
||||
assert app.config.ACCESS_LOG is False
|
||||
|
||||
await app.create_server(
|
||||
port=1342, access_log=True, return_asyncio_server=True
|
||||
)
|
||||
assert app.config.ACCESS_LOG == True
|
||||
assert app.config.ACCESS_LOG is True
|
||||
|
||||
|
||||
def test_config_rewrite_keep_alive():
|
||||
config = Config()
|
||||
assert config.KEEP_ALIVE == DEFAULT_CONFIG["KEEP_ALIVE"]
|
||||
config = Config(keep_alive=True)
|
||||
assert config.KEEP_ALIVE == True
|
||||
assert config.KEEP_ALIVE is True
|
||||
config = Config(keep_alive=False)
|
||||
assert config.KEEP_ALIVE == False
|
||||
assert config.KEEP_ALIVE is False
|
||||
|
||||
# use defaults
|
||||
config = Config(defaults={"KEEP_ALIVE": False})
|
||||
assert config.KEEP_ALIVE == False
|
||||
assert config.KEEP_ALIVE is False
|
||||
config = Config(defaults={"KEEP_ALIVE": True})
|
||||
assert config.KEEP_ALIVE == True
|
||||
assert config.KEEP_ALIVE is True
|
||||
|
||||
|
||||
_test_setting_as_dict = {"TEST_SETTING_VALUE": 1}
|
||||
_test_setting_as_class = type("C", (), {"TEST_SETTING_VALUE": 1})
|
||||
_test_setting_as_module = str(
|
||||
Path(__file__).parent / "static/app_test_config.py"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"conf_object",
|
||||
[
|
||||
_test_setting_as_dict,
|
||||
_test_setting_as_class,
|
||||
_test_setting_as_module,
|
||||
],
|
||||
ids=["from_dict", "from_class", "from_file"],
|
||||
)
|
||||
def test_update(app, conf_object):
|
||||
app.update_config(conf_object)
|
||||
assert app.config["TEST_SETTING_VALUE"] == 1
|
||||
|
||||
|
||||
def test_update_from_lowercase_key(app):
|
||||
d = {"test_setting_value": 1}
|
||||
app.update_config(d)
|
||||
assert "test_setting_value" not in app.config
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
from pathlib import Path
|
||||
from types import ModuleType
|
||||
|
||||
import pytest
|
||||
|
||||
from sanic.exceptions import LoadFileException
|
||||
from sanic.utils import load_module_from_file_location
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def loaded_module_from_file_location():
|
||||
return load_module_from_file_location(
|
||||
str(Path(__file__).parent / "static" / "app_test_config.py")
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.dependency(name="test_load_module_from_file_location")
|
||||
def test_load_module_from_file_location(loaded_module_from_file_location):
|
||||
assert isinstance(loaded_module_from_file_location, ModuleType)
|
||||
|
||||
|
||||
@pytest.mark.dependency(depends=["test_load_module_from_file_location"])
|
||||
def test_loaded_module_from_file_location_name(
|
||||
loaded_module_from_file_location,
|
||||
):
|
||||
name = loaded_module_from_file_location.__name__
|
||||
if "C:\\" in name:
|
||||
name = name.split("\\")[-1]
|
||||
assert name == "app_test_config"
|
||||
|
||||
|
||||
def test_load_module_from_file_location_with_non_existing_env_variable():
|
||||
with pytest.raises(
|
||||
LoadFileException,
|
||||
match="The following environment variables are not set: MuuMilk",
|
||||
):
|
||||
|
||||
load_module_from_file_location("${MuuMilk}")
|
||||
@@ -1,36 +0,0 @@
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
_test_setting_as_dict = {"TEST_SETTING_VALUE": 1}
|
||||
_test_setting_as_class = type("C", (), {"TEST_SETTING_VALUE": 1})
|
||||
_test_setting_as_module = str(
|
||||
Path(__file__).parent / "static/app_test_config.py"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"conf_object",
|
||||
[
|
||||
_test_setting_as_dict,
|
||||
_test_setting_as_class,
|
||||
pytest.param(
|
||||
_test_setting_as_module,
|
||||
marks=pytest.mark.dependency(
|
||||
depends=["test_load_module_from_file_location"],
|
||||
scope="session",
|
||||
),
|
||||
),
|
||||
],
|
||||
ids=["from_dict", "from_class", "from_file"],
|
||||
)
|
||||
def test_update(app, conf_object):
|
||||
app.update_config(conf_object)
|
||||
assert app.config["TEST_SETTING_VALUE"] == 1
|
||||
|
||||
|
||||
def test_update_from_lowercase_key(app):
|
||||
d = {"test_setting_value": 1}
|
||||
app.update_config(d)
|
||||
assert "test_setting_value" not in app.config
|
||||
50
tests/test_utils.py
Normal file
50
tests/test_utils.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from os import environ
|
||||
from pathlib import Path
|
||||
from types import ModuleType
|
||||
|
||||
import pytest
|
||||
|
||||
from sanic.exceptions import LoadFileException
|
||||
from sanic.utils import load_module_from_file_location
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"location",
|
||||
(
|
||||
Path(__file__).parent / "static" / "app_test_config.py",
|
||||
str(Path(__file__).parent / "static" / "app_test_config.py"),
|
||||
str(Path(__file__).parent / "static" / "app_test_config.py").encode(),
|
||||
),
|
||||
)
|
||||
def test_load_module_from_file_location(location):
|
||||
module = load_module_from_file_location(location)
|
||||
|
||||
assert isinstance(module, ModuleType)
|
||||
|
||||
|
||||
def test_loaded_module_from_file_location_name():
|
||||
module = load_module_from_file_location(
|
||||
str(Path(__file__).parent / "static" / "app_test_config.py")
|
||||
)
|
||||
|
||||
name = module.__name__
|
||||
if "C:\\" in name:
|
||||
name = name.split("\\")[-1]
|
||||
assert name == "app_test_config"
|
||||
|
||||
|
||||
def test_load_module_from_file_location_with_non_existing_env_variable():
|
||||
with pytest.raises(
|
||||
LoadFileException,
|
||||
match="The following environment variables are not set: MuuMilk",
|
||||
):
|
||||
|
||||
load_module_from_file_location("${MuuMilk}")
|
||||
|
||||
|
||||
def test_load_module_from_file_location_using_env():
|
||||
environ["APP_TEST_CONFIG"] = "static/app_test_config.py"
|
||||
location = str(Path(__file__).parent / "${APP_TEST_CONFIG}")
|
||||
module = load_module_from_file_location(location)
|
||||
|
||||
assert isinstance(module, ModuleType)
|
||||
Reference in New Issue
Block a user