Files
KX-Bridge-Release/tests/test_api_state.py

114 lines
3.7 KiB
Python

"""
Tests für /api/state — Drucker-Zustandsabfrage.
"""
import pytest
@pytest.mark.asyncio
async def test_state_returns_200(client):
c, _ = client
resp = await c.get("/api/state")
assert resp.status == 200
@pytest.mark.asyncio
async def test_state_schema(client):
"""Alle erwarteten Felder müssen vorhanden und typsicher sein."""
c, _ = client
resp = await c.get("/api/state")
data = await resp.json()
assert isinstance(data["print_state"], str)
assert isinstance(data["kobra_state"], str)
assert isinstance(data["nozzle_temp"], float)
assert isinstance(data["nozzle_target"], float)
assert isinstance(data["bed_temp"], float)
assert isinstance(data["bed_target"], float)
assert isinstance(data["progress"], float)
assert isinstance(data["print_duration"], int)
assert isinstance(data["remain_time"], int)
assert isinstance(data["curr_layer"], int)
assert isinstance(data["total_layers"], int)
assert isinstance(data["filename"], str)
assert isinstance(data["fan_speed"], int)
assert isinstance(data["light_on"], bool)
assert isinstance(data["ams_slots"], list)
@pytest.mark.asyncio
async def test_state_initial_values(client):
"""Im Offline-Start müssen Temperaturen 0 und Zustand 'standby' sein."""
c, _ = client
data = await (await c.get("/api/state")).json()
assert data["print_state"] == "standby"
assert data["nozzle_temp"] == 0.0
assert data["bed_temp"] == 0.0
assert data["progress"] == 0.0
assert data["filename"] == ""
@pytest.mark.asyncio
async def test_state_updates_after_mqtt_print_report(client):
"""Simuliert ein eingehendes print/report MQTT-Paket und prüft State-Update."""
c, bridge = client
# Simuliere MQTT-Nachricht wie vom echten Drucker
bridge._on_print({
"state": "printing",
"data": {
"filename": "test.gcode",
"progress": 42,
"print_time": 10, # Minuten → 600s
"remain_time": 5, # Minuten → 300s
"curr_layer": 20,
"total_layers": 100,
}
})
data = await (await c.get("/api/state")).json()
assert data["print_state"] == "printing"
assert data["filename"] == "test.gcode"
assert data["progress"] == pytest.approx(0.42)
assert data["print_duration"] == 600
assert data["remain_time"] == 300
assert data["curr_layer"] == 20
assert data["total_layers"] == 100
@pytest.mark.asyncio
async def test_state_updates_after_mqtt_temp_report(client):
"""Simuliert ein tempature/report Paket."""
c, bridge = client
bridge._on_temp({
"data": {
"curr_nozzle_temp": 215.3,
"target_nozzle_temp": 220.0,
"curr_hotbed_temp": 59.8,
"target_hotbed_temp": 60.0,
}
})
data = await (await c.get("/api/state")).json()
assert data["nozzle_temp"] == pytest.approx(215.3)
assert data["nozzle_target"] == pytest.approx(220.0)
assert data["bed_temp"] == pytest.approx(59.8)
assert data["bed_target"] == pytest.approx(60.0)
@pytest.mark.asyncio
async def test_state_resets_on_cancel(client):
"""Nach 'stoped' müssen Progress und Filename zurückgesetzt werden."""
c, bridge = client
# Erst Druck simulieren
bridge._on_print({"state": "printing", "data": {"filename": "x.gcode", "progress": 50}})
# Dann Abbruch
bridge._on_print({"state": "stoped", "data": {}})
data = await (await c.get("/api/state")).json()
assert data["progress"] == 0.0
assert data["filename"] == ""