from datetime import datetime from schedule import ( ScheduleActionType, ScheduleService, load_schedule, ) SCHEDULE_FILE = "config/schedule.yaml" def print_result(title, result): print() print("=" * 70) print(title) print("=" * 70) print(f"Enabled: {result.enabled}") if result.current is not None: print( f"Current: " f"{result.current.when} | " f"{result.current.template} | " f"{result.current.point.action.type}" ) else: print("Current: None") if result.next is not None: print( f"Next: " f"{result.next.when} | " f"{result.next.template} | " f"{result.next.point.action.type}" ) else: print("Next: None") print(f"Auto: {result.auto_active}") print(f"Settings: {result.scheduled_settings.to_dict()}") def main(): print("Загрузка schedule.yaml...") config = load_schedule(SCHEDULE_FILE) print("YAML успешно загружен и проверен.") print() service = ScheduleService(config) # -------------------------------------------------------------- # TEST 1 # Понедельник 06:30 # # Текущая точка должна быть 00:00 power off. # Следующая — 07:00. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 6, 30) ) print_result( "TEST 1 — Monday 06:30", result, ) assert result.current.when.hour == 0 assert result.next.when.hour == 7 assert result.auto_active is False assert result.scheduled_settings.power is False # -------------------------------------------------------------- # TEST 2 # Понедельник 07:30 # # Должны накопиться параметры из точки 07:00. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 7, 30) ) print_result( "TEST 2 — Monday 07:30", result, ) settings = result.scheduled_settings assert result.current.when.hour == 7 assert result.next.when.hour == 9 assert result.auto_active is False assert settings.power is True assert settings.speed == 2 assert settings.heater is True assert settings.target_temp == 20 assert settings.mode == "outside" # -------------------------------------------------------------- # TEST 3 # Понедельник 10:00 # # В 09:00 поменялась только скорость. # # Остальные значения должны сохраниться от 07:00. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 10, 0) ) print_result( "TEST 3 — Monday 10:00", result, ) settings = result.scheduled_settings assert result.current.when.hour == 9 assert result.next.when.hour == 13 assert settings.power is True assert settings.speed == 1 assert settings.heater is True assert settings.target_temp == 20 assert settings.mode == "outside" # -------------------------------------------------------------- # TEST 4 # Понедельник 13:10 # # Последняя точка AUTO. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 13, 10) ) print_result( "TEST 4 — Monday 13:10 / AUTO", result, ) assert result.current.point.action.type == ScheduleActionType.AUTO assert result.auto_active is True assert result.next.when.hour == 17 assert result.next.when.minute == 0 # Накопленные настройки при AUTO не стираются. assert result.scheduled_settings.speed == 1 assert result.scheduled_settings.power is True # -------------------------------------------------------------- # TEST 5 # Понедельник 17:10 # # AUTO закончился. # Speed должен стать 3. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 17, 10) ) print_result( "TEST 5 — Monday 17:10", result, ) assert result.auto_active is False assert result.current.when.hour == 17 assert result.current.when.minute == 0 assert result.next.when.hour == 17 assert result.next.when.minute == 30 assert result.scheduled_settings.speed == 3 # -------------------------------------------------------------- # TEST 6 # Понедельник 17:40 # # Снова AUTO. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 17, 40) ) print_result( "TEST 6 — Monday 17:40 / AUTO", result, ) assert result.auto_active is True assert result.current.when.hour == 17 assert result.current.when.minute == 30 assert result.next.when.hour == 23 # Последний scheduled speed всё равно должен помнить 3. assert result.scheduled_settings.speed == 3 # -------------------------------------------------------------- # TEST 7 # Понедельник 23:15 # # Heater off, speed 1. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 14, 23, 15) ) print_result( "TEST 7 — Monday 23:15", result, ) settings = result.scheduled_settings assert result.auto_active is False assert settings.speed == 1 assert settings.heater is False # -------------------------------------------------------------- # TEST 8 # Суббота 09:30 # # Проверяем переключение на weekend. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 19, 9, 30) ) print_result( "TEST 8 — Saturday 09:30", result, ) assert result.current.template == "weekend" assert result.next.template == "weekend" settings = result.scheduled_settings assert settings.power is True assert settings.speed == 1 assert settings.heater is True assert settings.target_temp == 20 # -------------------------------------------------------------- # TEST 9 # Суббота 10:30 # # Weekend AUTO. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 19, 10, 30) ) print_result( "TEST 9 — Saturday 10:30 / AUTO", result, ) assert result.current.template == "weekend" assert result.auto_active is True # -------------------------------------------------------------- # TEST 10 # Проверяем переход через полночь. # # Вторник 00:30. # В 00:00 вторника уже должна действовать power off. # -------------------------------------------------------------- result = service.resolve( datetime(2026, 9, 15, 0, 30) ) print_result( "TEST 10 — Tuesday 00:30", result, ) assert result.current.when.day == 15 assert result.current.when.hour == 0 assert result.scheduled_settings.power is False print() print("=" * 70) print("ALL SCHEDULE TESTS PASSED") print("=" * 70) if __name__ == "__main__": main()