kiwi-scp/tests/test_config.py
2021-10-15 19:39:14 +02:00

269 lines
6.2 KiB
Python

from ipaddress import IPv4Network
from pathlib import Path
import pytest
import toml
from pydantic import ValidationError
from kiwi_scp.config import Config
class UnCoercible:
"""A class that doesn't have a string representation"""
def __str__(self):
raise ValueError
def test_default():
c = Config()
version = toml.load("./pyproject.toml")["tool"]["poetry"]["version"]
assert c.version == version
assert len(c.shells) == 1
assert c.shells[0] == Path("/bin/bash")
assert c.projects == []
assert c.environment == {}
assert c.storage.directory == Path("/var/local/kiwi")
assert c.network.name == "kiwi_hub"
assert c.network.cidr == IPv4Network("10.22.46.0/24")
########
# SHELLS
########
def test_shells_empty():
c = Config(shells=None)
assert c == Config(shells=[])
assert c.shells == []
def test_shells_list():
c = Config(shells=["/bin/sh", "sh"])
assert len(c.shells) == 2
assert c.shells[0] == Path("/bin/sh")
assert c.shells[1] == Path("sh")
c = Config(shells=["/bin/bash"])
assert len(c.shells) == 1
assert c.shells[0] == Path("/bin/bash")
def test_shells_dict():
c = Config(shells={"/bin/bash": None})
assert len(c.shells) == 1
assert c.shells[0] == Path("/bin/bash")
def test_shells_coercible():
c = Config(shells="/bin/bash")
assert c == Config(shells=Path("/bin/bash"))
assert len(c.shells) == 1
assert c.shells[0] == Path("/bin/bash")
c = Config(shells=123)
assert len(c.shells) == 1
assert c.shells[0] == Path("123")
def test_shells_uncoercible():
with pytest.raises(ValidationError) as exc_info:
Config(shells=UnCoercible())
assert len(exc_info.value.errors()) == 1
error = exc_info.value.errors()[0]
assert error["msg"] == "Invalid Shells Format"
assert error["type"] == "value_error"
with pytest.raises(ValidationError) as exc_info:
Config(shells=["/bin/bash", UnCoercible()])
assert len(exc_info.value.errors()) == 1
error = exc_info.value.errors()[0]
assert error["msg"] == "value is not a valid path"
assert error["type"] == "type_error.path"
##########
# PROJECTS
##########
def test_proj_empty():
c = Config(projects=None)
assert c == Config(projects=[])
assert c.projects == []
def test_proj_long():
c = Config(projects=[{
"name": "project",
"enabled": False,
"override_storage": {"directory": "/test/directory"},
}])
assert len(c.projects) == 1
p = c.projects[0]
assert p.name == "project"
assert not p.enabled
assert p.override_storage is not None
assert p.override_storage.directory == Path("/test/directory")
def test_proj_short():
c = Config(projects=[{
"project": False,
}])
assert len(c.projects) == 1
p = c.projects[0]
assert p.name == "project"
assert not p.enabled
assert p.override_storage is None
def test_proj_dict():
c = Config(projects={"name": "project"})
assert c == Config(projects=[{"name": "project"}])
assert len(c.projects) == 1
p = c.projects[0]
assert p.name == "project"
assert p.enabled
assert p.override_storage is None
def test_proj_coercible():
c = Config(projects="project")
assert c == Config(projects=["project"])
assert len(c.projects) == 1
p = c.projects[0]
assert p.name == "project"
assert p.enabled
assert p.override_storage is None
def test_proj_uncoercible():
with pytest.raises(ValidationError) as exc_info:
Config(projects=["valid", UnCoercible()])
assert len(exc_info.value.errors()) == 1
error = exc_info.value.errors()[0]
assert error["msg"] == "Invalid Projects Format"
assert error["type"] == "value_error"
with pytest.raises(ValidationError) as exc_info:
Config(projects=UnCoercible())
assert len(exc_info.value.errors()) == 1
error = exc_info.value.errors()[0]
assert error["msg"] == "Invalid Projects Format"
assert error["type"] == "value_error"
#############
# ENVIRONMENT
#############
def test_env_empty():
c = Config(environment=None)
assert c.environment == {}
def test_env_dict():
c = Config(environment={})
assert c.environment == {}
c = Config(environment={"variable": "value"})
assert len(c.environment) == 1
assert "variable" in c.environment
assert c.environment["variable"] == "value"
def test_env_list():
c = Config(environment=[])
assert c.environment == {}
c = Config(environment=[
"variable=value",
])
assert len(c.environment) == 1
assert "variable" in c.environment
assert c.environment["variable"] == "value"
c = Config(environment=[
"variable",
])
assert len(c.environment) == 1
assert "variable" in c.environment
assert c.environment["variable"] is None
c = Config(environment=[
123,
])
assert len(c.environment) == 1
assert "123" in c.environment
assert c.environment["123"] is None
def test_env_coercible():
c = Config(environment="variable=value")
assert len(c.environment) == 1
assert "variable" in c.environment
assert c.environment["variable"] == "value"
c = Config(environment="variable")
assert len(c.environment) == 1
assert "variable" in c.environment
assert c.environment["variable"] is None
c = Config(environment=123)
assert len(c.environment) == 1
assert "123" in c.environment
assert c.environment["123"] is None
c = Config(environment=123.4)
assert len(c.environment) == 1
assert "123.4" in c.environment
assert c.environment["123.4"] is None
def test_env_uncoercible():
with pytest.raises(ValidationError) as exc_info:
Config(environment=UnCoercible())
assert len(exc_info.value.errors()) == 1
error = exc_info.value.errors()[0]
assert error["msg"] == "Invalid Environment Format"
assert error["type"] == "value_error"
with pytest.raises(ValidationError) as exc_info:
Config(environment=["valid", UnCoercible()])
assert len(exc_info.value.errors()) == 1
error = exc_info.value.errors()[0]
assert error["msg"] == "Invalid Environment Format"
assert error["type"] == "value_error"