120 lines
3.3 KiB
Python
120 lines
3.3 KiB
Python
from datetime import datetime
|
|
|
|
from sqlmodel import Session
|
|
|
|
from app.models import EntityCache, EntityFlag
|
|
|
|
|
|
def _seed_entities(session: Session):
|
|
entities = [
|
|
EntityCache(
|
|
entity_id="light.salon",
|
|
domain="light",
|
|
friendly_name="Lumière Salon",
|
|
state="on",
|
|
is_available=True,
|
|
fetched_at=datetime.utcnow(),
|
|
),
|
|
EntityCache(
|
|
entity_id="sensor.temperature",
|
|
domain="sensor",
|
|
friendly_name="Température",
|
|
state="22.5",
|
|
device_class="temperature",
|
|
unit_of_measurement="°C",
|
|
is_available=True,
|
|
fetched_at=datetime.utcnow(),
|
|
),
|
|
EntityCache(
|
|
entity_id="switch.garage",
|
|
domain="switch",
|
|
friendly_name="Garage",
|
|
state="off",
|
|
is_available=True,
|
|
fetched_at=datetime.utcnow(),
|
|
),
|
|
EntityCache(
|
|
entity_id="sensor.humidity",
|
|
domain="sensor",
|
|
friendly_name="Humidité",
|
|
state="unavailable",
|
|
is_available=False,
|
|
fetched_at=datetime.utcnow(),
|
|
),
|
|
]
|
|
for e in entities:
|
|
session.add(e)
|
|
session.commit()
|
|
|
|
|
|
def test_list_entities_empty(client):
|
|
resp = client.get("/api/entities")
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert data["items"] == []
|
|
assert data["total"] == 0
|
|
|
|
|
|
def test_list_entities_with_data(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities")
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert data["total"] == 4
|
|
assert len(data["items"]) == 4
|
|
|
|
|
|
def test_list_entities_filter_domain(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities?domain=sensor")
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert data["total"] == 2
|
|
assert all(e["domain"] == "sensor" for e in data["items"])
|
|
|
|
|
|
def test_list_entities_filter_multi_domain(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities?domain=light,switch")
|
|
data = resp.json()
|
|
assert data["total"] == 2
|
|
|
|
|
|
def test_list_entities_search(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities?search=salon")
|
|
data = resp.json()
|
|
assert data["total"] == 1
|
|
assert data["items"][0]["entity_id"] == "light.salon"
|
|
|
|
|
|
def test_list_entities_filter_available(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities?available=false")
|
|
data = resp.json()
|
|
assert data["total"] == 1
|
|
assert data["items"][0]["entity_id"] == "sensor.humidity"
|
|
|
|
|
|
def test_list_entities_pagination(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities?page=1&per_page=2")
|
|
data = resp.json()
|
|
assert len(data["items"]) == 2
|
|
assert data["total"] == 4
|
|
assert data["pages"] == 2
|
|
|
|
|
|
def test_get_entity_detail(client, session):
|
|
_seed_entities(session)
|
|
resp = client.get("/api/entities/light.salon")
|
|
assert resp.status_code == 200
|
|
data = resp.json()
|
|
assert data["entity_id"] == "light.salon"
|
|
assert data["favorite"] is False
|
|
|
|
|
|
def test_get_entity_not_found(client):
|
|
resp = client.get("/api/entities/nonexistent.entity")
|
|
assert resp.status_code == 404
|