from __future__ import annotations from fastapi.testclient import TestClient import app.main as main from app.core.event_core import EventCore from app.core.models import EntityState, RuntimeState from app.core.stores import FutureStores def test_health_and_backup_roundtrip(tmp_path, monkeypatch) -> None: # type: ignore[no-untyped-def] test_stores = FutureStores(tmp_path) monkeypatch.setattr(main, "stores", test_stores) monkeypatch.setattr(main, "event_core", EventCore(test_stores)) client = TestClient(main.app) health = client.get("/health") backup = client.get("/v2/backup/export") restore = client.post("/v2/backup/restore", json=backup.json()) assert health.status_code == 200 assert health.json()["version"] == "2.0.0-alpha.9" assert backup.status_code == 200 assert restore.status_code == 200 assert restore.json() == {"status": "restored"} def test_dashboard_control_and_learning_endpoints(tmp_path, monkeypatch) -> None: # type: ignore[no-untyped-def] test_stores = FutureStores(tmp_path) test_stores.save_runtime( RuntimeState( entities={ "light.storage": EntityState( entity_id="light.storage", domain="light", state="off", ), "binary_sensor.storage_door": EntityState( entity_id="binary_sensor.storage_door", domain="binary_sensor", state="off", ), } ) ) monkeypatch.setattr(main, "stores", test_stores) monkeypatch.setattr(main, "event_core", EventCore(test_stores)) client = TestClient(main.app) entities = client.get("/v2/entities?domain=light,binary_sensor") control = client.post( "/v2/control/light.storage/stage", json={ "stage": "dry_run", "min_confidence": 0.75, "manual_block": False, "cooldown_seconds": 120, }, ) learning = client.post( "/v2/learning/light.storage/patterns", json={ "trigger_entity_id": "binary_sensor.storage_door", "trigger_state": "on", "target_state": "on", "confidence": 0.91, }, ) simulation = client.post( "/v2/simulate", json={ "actuator_entity_id": "light.storage", "trigger_entity_id": "binary_sensor.storage_door", "trigger_state": "on", }, ) readiness = client.get("/v2/control/light.storage/readiness") global_control = client.post("/v2/control/global", json={"enabled": False}) detailed_health = client.get("/v2/health") dashboard = client.get("/v2/dashboard") assert entities.status_code == 200 assert [item["entity_id"] for item in entities.json()] == [ "binary_sensor.storage_door", "light.storage", ] assert control.status_code == 200 assert control.json()["stage"] == "dry_run" assert learning.status_code == 200 assert learning.json()["patterns"][0]["trigger_entity_id"] == "binary_sensor.storage_door" assert simulation.status_code == 200 assert simulation.json()["decision"]["target_state"] == "on" assert readiness.status_code == 200 assert readiness.json()["ready"] is False assert global_control.status_code == 200 assert global_control.json()["global_enabled"] is False assert detailed_health.status_code == 200 assert detailed_health.json()["global_enabled"] is False assert dashboard.status_code == 200 assert dashboard.json()["actuator_count"] == 1