feat: идемпотентность DTC + prompt учитывает неточности данных

This commit is contained in:
Repinoid
2026-06-06 07:02:56 +04:00
parent 1e8fd62039
commit 4c71d7a4c9
3 changed files with 73 additions and 1 deletions
+48
View File
@@ -441,3 +441,51 @@ test("MAP parsed", len(r["parameters"]) == 1)
# ACK ответ
r = parse_batch([{"cmd": "ATSP0", "raw": "OK", "decoded": "OK"}])
test("AT OK — не данные", r["parameters"] == [])
# ── 13. Идемпотентность ─────────────────────────────────────────
print("\n═══ 13. Идемпотентность ═══")
db3 = Database(TEST_DB)
# Симуляция: DTC upload с request_id 2 раза
dtc_req_id = "dtc-test-uuid-001"
dtc_first = {"codes": [{"code": "P0301", "desc": "Пропуски зажигания"}], "count": 1}
# Сохраняем первый раз (как сделал бы /dtc/upload)
db3.save_session(
client_info={"device_uuid": "idemp-test"},
responses=[{"decoded": "DTC stored: P0301"}],
request_id=dtc_req_id,
response_json={"codes": dtc_first["codes"], "count": dtc_first["count"]},
)
test("DTC: первый save с request_id", True)
# Повтор — не должен создать дубликат
count_before = len(db3.get_recent_sessions(100))
db3.save_session(
client_info={"device_uuid": "idemp-test"},
responses=[{"decoded": "DTC stored: P0301"}],
request_id=dtc_req_id,
response_json={"codes": [{"code": "P0999", "desc": "НИКОГДА"}], "count": 0}, # другой ответ
)
count_after = len(db3.get_recent_sessions(100))
test("DTC: дубликат не создан", count_before == count_after)
# Кэш возвращает ПЕРВЫЙ результат, не последний
cached = db3.get_cached_response(dtc_req_id)
test("DTC: кэш вернул оригинал", cached is not None and cached["codes"][0]["code"] == "P0301")
# Upload сессии с разными request_id — не конфликтуют
for i in range(5):
db3.save_session(
client_info={"device_uuid": f"multi-idemp-{i}"},
responses=[],
request_id=f"multi-req-{i}",
response_json={"i": i},
)
test("5 разных request_id — все сохранены",
len(db3.get_recent_sessions(10)) == count_after + 5)
db3.close()
if TEST_DB.exists():
TEST_DB.unlink()