196 lines
3.4 KiB
Python
196 lines
3.4 KiB
Python
from datetime import datetime
|
|
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
|
|
from schedule import (
|
|
ScheduleService,
|
|
load_schedule,
|
|
)
|
|
|
|
|
|
SCHEDULE_YAML = """
|
|
version: 1
|
|
|
|
enabled: true
|
|
timezone: local
|
|
|
|
templates:
|
|
|
|
test:
|
|
|
|
- time: "09:00"
|
|
action:
|
|
type: set
|
|
power: on
|
|
speed: 1
|
|
target_temp: 23
|
|
|
|
- time: "10:00"
|
|
action:
|
|
type: auto
|
|
speed: 3
|
|
target_temp: 20
|
|
|
|
- time: "12:00"
|
|
action:
|
|
type: set
|
|
speed: 2
|
|
target_temp: 22
|
|
|
|
days:
|
|
mon: test
|
|
tue: test
|
|
wed: test
|
|
thu: test
|
|
fri: test
|
|
sat: test
|
|
sun: test
|
|
"""
|
|
|
|
|
|
def load_test_schedule():
|
|
|
|
temp_dir = TemporaryDirectory()
|
|
|
|
path = (
|
|
Path(temp_dir.name)
|
|
/ "schedule.yaml"
|
|
)
|
|
|
|
path.write_text(
|
|
SCHEDULE_YAML,
|
|
encoding="utf-8",
|
|
)
|
|
|
|
config = load_schedule(path)
|
|
|
|
return temp_dir, config
|
|
|
|
|
|
def test_auto_temperature_resolution():
|
|
|
|
temp_dir, config = (
|
|
load_test_schedule()
|
|
)
|
|
|
|
try:
|
|
service = ScheduleService(
|
|
config
|
|
)
|
|
|
|
# ----------------------------------------------
|
|
# 09:30 — обычный SET
|
|
# ----------------------------------------------
|
|
|
|
resolution = service.resolve(
|
|
datetime(
|
|
2026,
|
|
9,
|
|
14,
|
|
9,
|
|
30,
|
|
)
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_active
|
|
is False
|
|
)
|
|
|
|
assert (
|
|
resolution.scheduled_settings.target_temp
|
|
== 23
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_target_temp
|
|
is None
|
|
)
|
|
|
|
# ----------------------------------------------
|
|
# 10:30 — AUTO
|
|
#
|
|
# Последний SET по-прежнему хранит 23,
|
|
# но AUTO явно требует 20.
|
|
# ----------------------------------------------
|
|
|
|
resolution = service.resolve(
|
|
datetime(
|
|
2026,
|
|
9,
|
|
14,
|
|
10,
|
|
30,
|
|
)
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_active
|
|
is True
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_fallback_speed
|
|
== 3
|
|
)
|
|
|
|
assert (
|
|
resolution.scheduled_settings.target_temp
|
|
== 23
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_target_temp
|
|
== 20
|
|
)
|
|
|
|
# ----------------------------------------------
|
|
# 12:30 — снова SET
|
|
#
|
|
# AUTO закончился.
|
|
# ----------------------------------------------
|
|
|
|
resolution = service.resolve(
|
|
datetime(
|
|
2026,
|
|
9,
|
|
14,
|
|
12,
|
|
30,
|
|
)
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_active
|
|
is False
|
|
)
|
|
|
|
assert (
|
|
resolution.scheduled_settings.target_temp
|
|
== 22
|
|
)
|
|
|
|
assert (
|
|
resolution.auto_target_temp
|
|
is None
|
|
)
|
|
|
|
finally:
|
|
temp_dir.cleanup()
|
|
|
|
|
|
def main():
|
|
|
|
test_auto_temperature_resolution()
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(
|
|
"ALL AUTO TEMPERATURE RESOLUTION "
|
|
"TESTS PASSED"
|
|
)
|
|
print("=" * 70)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |