181 lines
3.3 KiB
Python
181 lines
3.3 KiB
Python
import asyncio
|
|
from types import SimpleNamespace
|
|
|
|
from app.auto.controller import AutoController
|
|
|
|
|
|
class FakeScheduleService:
|
|
|
|
def __init__(self):
|
|
self.paused = True
|
|
self.override_active = False
|
|
|
|
def resolve(self, now):
|
|
return SimpleNamespace(
|
|
enabled=True,
|
|
auto_active=True,
|
|
auto_fallback_speed=1,
|
|
auto_target_temp=20,
|
|
)
|
|
|
|
|
|
class FakeQingpingService:
|
|
|
|
def __init__(self):
|
|
self.online = True
|
|
|
|
self.state = SimpleNamespace(
|
|
co2=1200,
|
|
temperature=19.0,
|
|
)
|
|
|
|
|
|
class FakeTionController:
|
|
|
|
def __init__(self):
|
|
self.calls = []
|
|
|
|
async def set_speed(self, speed):
|
|
self.calls.append(
|
|
("set_speed", speed)
|
|
)
|
|
|
|
async def heater_on(self):
|
|
self.calls.append(
|
|
("heater_on", None)
|
|
)
|
|
|
|
async def heater_off(self):
|
|
self.calls.append(
|
|
("heater_off", None)
|
|
)
|
|
|
|
async def set_target_temperature(
|
|
self,
|
|
temperature,
|
|
):
|
|
self.calls.append(
|
|
(
|
|
"set_target_temperature",
|
|
temperature,
|
|
)
|
|
)
|
|
|
|
|
|
class FakeTionService:
|
|
|
|
def __init__(self):
|
|
self.online = True
|
|
|
|
self.state = SimpleNamespace(
|
|
in_temp=19,
|
|
)
|
|
|
|
self.controller = FakeTionController()
|
|
|
|
async def execute(
|
|
self,
|
|
operation,
|
|
):
|
|
return await operation(
|
|
self.controller
|
|
)
|
|
|
|
|
|
async def test_paused_schedule_suspends_auto():
|
|
|
|
schedule = FakeScheduleService()
|
|
qingping = FakeQingpingService()
|
|
tion = FakeTionService()
|
|
|
|
controller = AutoController(
|
|
schedule_service=schedule,
|
|
qingping_service=qingping,
|
|
tion_service=tion,
|
|
)
|
|
|
|
# Имитируем состояние,
|
|
# которое AUTO помнил до pause.
|
|
controller._target_speed = 3
|
|
controller._auto_speed = 3
|
|
|
|
controller._target_heater = True
|
|
controller._auto_heater = True
|
|
|
|
controller._target_temperature = 30
|
|
|
|
controller._temperature = 19.0
|
|
controller._temperature_source = (
|
|
"qingping"
|
|
)
|
|
|
|
await controller._process()
|
|
|
|
status = controller.status()
|
|
|
|
# AUTO должен быть остановлен.
|
|
assert (
|
|
status["state"]
|
|
== "suspended"
|
|
)
|
|
|
|
assert (
|
|
status["reason"]
|
|
== "schedule_paused"
|
|
)
|
|
|
|
# Никаких команд Tion.
|
|
assert tion.controller.calls == []
|
|
|
|
# Старое владение AUTO забыто.
|
|
assert (
|
|
controller._target_speed
|
|
is None
|
|
)
|
|
|
|
assert (
|
|
controller._auto_speed
|
|
is None
|
|
)
|
|
|
|
assert (
|
|
controller._target_heater
|
|
is None
|
|
)
|
|
|
|
assert (
|
|
controller._auto_heater
|
|
is None
|
|
)
|
|
|
|
assert (
|
|
controller._target_temperature
|
|
is None
|
|
)
|
|
|
|
assert (
|
|
controller._temperature
|
|
is None
|
|
)
|
|
|
|
assert (
|
|
controller._temperature_source
|
|
is None
|
|
)
|
|
|
|
|
|
async def main():
|
|
|
|
await test_paused_schedule_suspends_auto()
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print(
|
|
"ALL AUTO SCHEDULE PAUSE "
|
|
"TESTS PASSED"
|
|
)
|
|
print("=" * 70)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main()) |