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()