from dataclasses import asdict
import pytest
from konfy import Configuration, Identifier, Konfy, Setting
@pytest.fixture()
def app():
return "testapp"
@pytest.fixture()
def default_level():
return "debug"
@pytest.fixture()
def env_level():
return "error"
@pytest.fixture()
def default_timeout():
return 45
@pytest.fixture()
def env_timeout():
return 60
@pytest.fixture()
def defaults(default_level, default_timeout):
return {"logging": {"level": default_level}, "timeout": default_timeout}
@pytest.fixture()
def env(env_level, env_timeout):
return {"logging": {"level": env_level}, "timeout": env_timeout}
@pytest.fixture()
def konfy(app, defaults):
return Konfy(
application=app,
cli=None,
environment=None,
app_config=None,
user_config=None,
system_config=None,
defaults=defaults,
)
@pytest.fixture()
def konfy_with_env_and_default(app, env, defaults):
return Konfy(
application=app,
cli=None,
environment=env,
app_config=None,
user_config=None,
system_config=None,
defaults=defaults,
)
def test_konfy_configuration_with_defaults_only(konfy, defaults):
expected = defaults
actual = dict(konfy.config)
assert actual == expected
def test_access_configuration_using_index_operator(konfy, default_level):
cfg = konfy.config
expected = default_level
actual = cfg["logging"]["level"]
assert actual == expected
def test_access_configuration_using_attribute_access(konfy, default_timeout):
cfg = konfy.config
expected = default_timeout
actual = cfg.timeout
assert actual == expected
def test_access_configuration_using_nested_attribute_access(konfy, default_level):
cfg = konfy.config
expected = default_level
actual = cfg.logging.level
assert actual == expected
def test_env_has_higher_priority_than_defaults(
konfy_with_env_and_default, env_level, env_timeout,
):
konfy = konfy_with_env_and_default
cfg = konfy.config
expected = env_level
actual = cfg.logging.level
assert actual == expected
expected = env_timeout
actual = cfg.timeout
assert actual == expected
@pytest.fixture()
def configuration():
config = Configuration()
logging_ns = config.add_namespace("logging")
logging_ns.add_setting(
"level",
str,
default="info",
description="The log level to use",
help="Log level of the application, possible values[debug, info, warn, error]",
)
timeout_ns = config.add_namespace("timeout")
hard_ns = timeout_ns.add_namespace("hard")
hard_ns.add_setting("timeout", int, default=45, description="desc", help="some help")
soft_ns = timeout_ns.add_namespace("soft")
soft_ns.add_setting("timeout", int, default=45, description="desc", help="some help")
return config
def test_create_nested_namespace(configuration):
logging_ns = configuration.add_namespace("logging")
logging_ns.add_setting(
"level",
str,
default="info",
description="The log level to use",
help="Log level of the application, possible values[debug, info, warn, error]",
)
timeout_ns = configuration.add_namespace("timeout")
hard_ns = timeout_ns.add_namespace("hard")
hard_ns.add_setting("timeout", int, default=45, description="desc", help="some help")
soft_ns = timeout_ns.add_namespace("soft")
soft_ns.add_setting("timeout", int, default=45, description="desc", help="some help")
expected = asdict(Setting(
name=Identifier("logging:level"),
type=str,
default="info",
description="The log level to use",
help="Log level of the application, possible values[debug, info, warn, error]",
))
actual = asdict(configuration["logging"]["level"])
assert actual == expected
@pytest.mark.skip()
def test_idea_smoke(configuration):
settings = configuration
@pytest.mark.skip(reason="just a outline for the future")
def test_create_defaults():
from konfy import Defaults, Konfy, Setting
defaults = {"logging:level": "debug"}
defaults = Defaults(
[
Setting(
name="logging:level",
),
Setting(
ns="logging",
name="facitlity",
type=int,
value=2,
description="",
help="",
),
],
)
settings = Konfy(
name="foo", cli={}, environment=None, app_config=None, user_config=None, system_config=None, defaults=None, )