feat: идемпотентность DTC + prompt учитывает неточности данных
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user