312 lines
7.7 KiB
Python
312 lines
7.7 KiB
Python
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() |