359 lines
5.4 KiB
Python
359 lines
5.4 KiB
Python
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
|
|
from app.auto.config import (
|
|
load_auto_config,
|
|
)
|
|
|
|
|
|
BASE_CONFIG = """
|
|
version: 1
|
|
|
|
check_interval: 5.0
|
|
|
|
co2:
|
|
base_speed: 1
|
|
hysteresis: 100
|
|
|
|
thresholds:
|
|
- ppm: 800
|
|
speed: 2
|
|
|
|
temperature:
|
|
hysteresis: 0.5
|
|
"""
|
|
|
|
|
|
def load_config(text: str):
|
|
temp_dir = TemporaryDirectory()
|
|
|
|
path = (
|
|
Path(temp_dir.name)
|
|
/ "auto.yaml"
|
|
)
|
|
|
|
path.write_text(
|
|
text,
|
|
encoding="utf-8",
|
|
)
|
|
|
|
config = load_auto_config(path)
|
|
|
|
return temp_dir, config
|
|
|
|
|
|
def test_valid_temperature_config():
|
|
|
|
temp_dir, config = load_config(
|
|
BASE_CONFIG
|
|
)
|
|
|
|
try:
|
|
print()
|
|
print("=" * 70)
|
|
print("VALID TEMPERATURE CONFIG")
|
|
print("=" * 70)
|
|
|
|
print(
|
|
"hysteresis:",
|
|
config.temperature.hysteresis,
|
|
)
|
|
|
|
assert (
|
|
config.temperature.hysteresis
|
|
== 0.5
|
|
)
|
|
|
|
finally:
|
|
temp_dir.cleanup()
|
|
|
|
|
|
def test_temperature_config_required():
|
|
|
|
config_text = """
|
|
version: 1
|
|
|
|
check_interval: 5.0
|
|
|
|
co2:
|
|
base_speed: 1
|
|
hysteresis: 100
|
|
|
|
thresholds:
|
|
- ppm: 800
|
|
speed: 2
|
|
"""
|
|
|
|
try:
|
|
temp_dir, _ = load_config(
|
|
config_text
|
|
)
|
|
|
|
except ValueError as exc:
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print("MISSING TEMPERATURE CONFIG")
|
|
print("=" * 70)
|
|
print(exc)
|
|
|
|
assert (
|
|
str(exc)
|
|
== "temperature config is required"
|
|
)
|
|
|
|
return
|
|
|
|
else:
|
|
temp_dir.cleanup()
|
|
|
|
raise AssertionError(
|
|
"Missing temperature config "
|
|
"must raise ValueError"
|
|
)
|
|
|
|
|
|
def test_temperature_must_be_mapping():
|
|
|
|
config_text = """
|
|
version: 1
|
|
|
|
check_interval: 5.0
|
|
|
|
co2:
|
|
base_speed: 1
|
|
hysteresis: 100
|
|
|
|
thresholds:
|
|
- ppm: 800
|
|
speed: 2
|
|
|
|
temperature: 0.5
|
|
"""
|
|
|
|
try:
|
|
temp_dir, _ = load_config(
|
|
config_text
|
|
)
|
|
|
|
except ValueError as exc:
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print("TEMPERATURE MUST BE MAPPING")
|
|
print("=" * 70)
|
|
print(exc)
|
|
|
|
assert (
|
|
str(exc)
|
|
== "temperature must be an object"
|
|
)
|
|
|
|
return
|
|
|
|
else:
|
|
temp_dir.cleanup()
|
|
|
|
raise AssertionError(
|
|
"Invalid temperature mapping "
|
|
"must raise ValueError"
|
|
)
|
|
|
|
|
|
def test_temperature_hysteresis_must_be_number():
|
|
|
|
config_text = """
|
|
version: 1
|
|
|
|
check_interval: 5.0
|
|
|
|
co2:
|
|
base_speed: 1
|
|
hysteresis: 100
|
|
|
|
thresholds:
|
|
- ppm: 800
|
|
speed: 2
|
|
|
|
temperature:
|
|
hysteresis: abc
|
|
"""
|
|
|
|
try:
|
|
temp_dir, _ = load_config(
|
|
config_text
|
|
)
|
|
|
|
except ValueError as exc:
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(
|
|
"HYSTERESIS MUST BE NUMBER"
|
|
)
|
|
print("=" * 70)
|
|
print(exc)
|
|
|
|
assert (
|
|
str(exc)
|
|
== (
|
|
"temperature.hysteresis "
|
|
"must be a number"
|
|
)
|
|
)
|
|
|
|
return
|
|
|
|
else:
|
|
temp_dir.cleanup()
|
|
|
|
raise AssertionError(
|
|
"Non-numeric hysteresis "
|
|
"must raise ValueError"
|
|
)
|
|
|
|
|
|
def test_temperature_hysteresis_must_not_be_negative():
|
|
|
|
config_text = """
|
|
version: 1
|
|
|
|
check_interval: 5.0
|
|
|
|
co2:
|
|
base_speed: 1
|
|
hysteresis: 100
|
|
|
|
thresholds:
|
|
- ppm: 800
|
|
speed: 2
|
|
|
|
temperature:
|
|
hysteresis: -0.1
|
|
"""
|
|
|
|
try:
|
|
temp_dir, _ = load_config(
|
|
config_text
|
|
)
|
|
|
|
except ValueError as exc:
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(
|
|
"HYSTERESIS MUST NOT BE NEGATIVE"
|
|
)
|
|
print("=" * 70)
|
|
print(exc)
|
|
|
|
assert (
|
|
str(exc)
|
|
== (
|
|
"temperature.hysteresis "
|
|
"must be >= 0"
|
|
)
|
|
)
|
|
|
|
return
|
|
|
|
else:
|
|
temp_dir.cleanup()
|
|
|
|
raise AssertionError(
|
|
"Negative hysteresis "
|
|
"must raise ValueError"
|
|
)
|
|
|
|
|
|
def test_unknown_temperature_field():
|
|
|
|
config_text = """
|
|
version: 1
|
|
|
|
check_interval: 5.0
|
|
|
|
co2:
|
|
base_speed: 1
|
|
hysteresis: 100
|
|
|
|
thresholds:
|
|
- ppm: 800
|
|
speed: 2
|
|
|
|
temperature:
|
|
hysteresis: 0.5
|
|
something_else: 123
|
|
"""
|
|
|
|
try:
|
|
temp_dir, _ = load_config(
|
|
config_text
|
|
)
|
|
|
|
except ValueError as exc:
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(
|
|
"UNKNOWN TEMPERATURE FIELD"
|
|
)
|
|
print("=" * 70)
|
|
print(exc)
|
|
|
|
assert (
|
|
str(exc)
|
|
== (
|
|
"Unknown temperature config fields: "
|
|
"['something_else']"
|
|
)
|
|
)
|
|
|
|
return
|
|
|
|
else:
|
|
temp_dir.cleanup()
|
|
|
|
raise AssertionError(
|
|
"Unknown temperature field "
|
|
"must raise ValueError"
|
|
)
|
|
|
|
|
|
def test_temperature_is_allowed_top_level_field():
|
|
|
|
temp_dir, config = load_config(
|
|
BASE_CONFIG
|
|
)
|
|
|
|
try:
|
|
assert (
|
|
config.temperature.hysteresis
|
|
== 0.5
|
|
)
|
|
|
|
finally:
|
|
temp_dir.cleanup()
|
|
|
|
|
|
def main():
|
|
|
|
test_valid_temperature_config()
|
|
test_temperature_config_required()
|
|
test_temperature_must_be_mapping()
|
|
test_temperature_hysteresis_must_be_number()
|
|
test_temperature_hysteresis_must_not_be_negative()
|
|
test_unknown_temperature_field()
|
|
test_temperature_is_allowed_top_level_field()
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(
|
|
"ALL AUTO TEMPERATURE CONFIG "
|
|
"TESTS PASSED"
|
|
)
|
|
print("=" * 70)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |