Orientamento: se il salvataggio fallisce si ripristina lo stato di prima in memoria. Refs #110
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -747,6 +747,7 @@ def create_app(folder: Path | str | None = None,
|
|||||||
raise HTTPException(400, "«orizzontale» e «verticale» devono essere true o false")
|
raise HTTPException(400, "«orizzontale» e «verticale» devono essere true o false")
|
||||||
with lock:
|
with lock:
|
||||||
prima = orientamenti.get(nome) or {}
|
prima = orientamenti.get(nome) or {}
|
||||||
|
prima_voce = orientamenti.get(nome) # #110: voce di prima (None = non c'era), per il ripristino se il salvataggio fallisce
|
||||||
cambiato = (bool(prima.get("orizzontale")), bool(prima.get("verticale"))) != (orizz, vert)
|
cambiato = (bool(prima.get("orizzontale")), bool(prima.get("verticale"))) != (orizz, vert)
|
||||||
if orizz or vert:
|
if orizz or vert:
|
||||||
orientamenti[nome] = {"orizzontale": orizz, "verticale": vert}
|
orientamenti[nome] = {"orizzontale": orizz, "verticale": vert}
|
||||||
@@ -760,6 +761,10 @@ def create_app(folder: Path | str | None = None,
|
|||||||
os.replace(tmp, file_orientamento)
|
os.replace(tmp, file_orientamento)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
_log.warning("orientamento non salvato (%s): %s", file_orientamento, e)
|
_log.warning("orientamento non salvato (%s): %s", file_orientamento, e)
|
||||||
|
if prima_voce is None: # #110: salvataggio fallito -> in memoria resta l'orientamento di prima
|
||||||
|
orientamenti.pop(nome, None)
|
||||||
|
else:
|
||||||
|
orientamenti[nome] = prima_voce
|
||||||
raise HTTPException(500, "salvataggio dell'orientamento non riuscito")
|
raise HTTPException(500, "salvataggio dell'orientamento non riuscito")
|
||||||
# i frame tenuti hanno l'orientamento di prima
|
# i frame tenuti hanno l'orientamento di prima
|
||||||
grezzi.pop(nome, None)
|
grezzi.pop(nome, None)
|
||||||
|
|||||||
@@ -166,3 +166,21 @@ def test_avviso_con_mappa_attiva(client_denso):
|
|||||||
assert "«Densa»" in r.json()["avviso"] and "va rifatta" in r.json()["avviso"]
|
assert "«Densa»" in r.json()["avviso"] and "va rifatta" in r.json()["avviso"]
|
||||||
# stesso valore di nuovo: nulla e' cambiato, nessun avviso
|
# stesso valore di nuovo: nulla e' cambiato, nessun avviso
|
||||||
assert _imposta(client_denso, True, False, source=SORGENTE_DENSA).json()["avviso"] is None
|
assert _imposta(client_denso, True, False, source=SORGENTE_DENSA).json()["avviso"] is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_scrittura_fallita_500_e_orientamento_di_prima(cartella, config, monkeypatch):
|
||||||
|
# #110: se orientamento.json non si scrive, in memoria resta l'orientamento di prima
|
||||||
|
mod = _carica()
|
||||||
|
with TestClient(mod.create_app(cartella, config)) as c:
|
||||||
|
assert _imposta(c, True, False).status_code == 200 # stato di partenza: orizzontale
|
||||||
|
def rotto(*a, **k):
|
||||||
|
raise OSError("disco pieno")
|
||||||
|
monkeypatch.setattr(mod.os, "replace", rotto)
|
||||||
|
assert _imposta(c, False, True).status_code == 500
|
||||||
|
j = c.get("/camera/orientamento", params={"source": SORGENTE}).json()
|
||||||
|
assert (j["orizzontale"], j["verticale"]) == (True, False)
|
||||||
|
assert _grab(c) == (0, 3) # ancora solo orizzontale
|
||||||
|
# sorgente che prima non c'era: la voce non resta
|
||||||
|
assert c.put("/camera/orientamento", json={"source": "altra", "orizzontale": True, "verticale": True}).status_code == 500
|
||||||
|
j = c.get("/camera/orientamento", params={"source": "altra"}).json()
|
||||||
|
assert (j["orizzontale"], j["verticale"]) == (False, False)
|
||||||
|
|||||||
Reference in New Issue
Block a user