From a130e1e7e8d41692af214337a14a2974d336c26f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 24 Jul 2026 08:26:27 +0400 Subject: [PATCH] Debug log: 4 bugs found and fixed, full trace documented --- HISTORY/2026-07-24-session-2.md | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 HISTORY/2026-07-24-session-2.md diff --git a/HISTORY/2026-07-24-session-2.md b/HISTORY/2026-07-24-session-2.md new file mode 100644 index 0000000..71468df --- /dev/null +++ b/HISTORY/2026-07-24-session-2.md @@ -0,0 +1,46 @@ +# 2026-07-24 — Отладка API-тестов dummy + +## Общая логика (как проверено) + +Поток: пользователь выбирает сервис → видит операции → выбирает операцию → задаёт параметры → жмёт «Тест» → сервер выполняет → результат. + +### Цепочка вызовов (полная трассировка) + +1. **GET /api/services** → список сервисов (только dummy пока) +2. **GET /api/operations/1** → операции dummy + инстансы пользователя + - Нет инстансов → только `create` активна +3. **GET /api/params/18** → параметры create (12 шт, 4 обязательных) +4. **POST /api/test** `{serviceId:1, operation:"create", ...}` +5. **POST /instances** `{serviceId:1, displayName:"autotest-1"}` → 201 + Location header +6. **GET /instances** (поллинг) → ждём `operationIsInProgress=false`, статус не "creating" +7. Возврат результата → фронт обновляет UI + +## Баги (найдены и исправлены) + +### Баг 1: `HttpClient.post` не существовал (v1.0.7) +- **Симптом:** `'HttpClient' object has no attribute 'post'` +- **Причина:** в `http_client.py` был только метод `get()`. Новый `api_test.py` использовал `client.post()`. +- **Исправление:** добавлен метод `post()` в `HttpClient`. + +### Баг 2: `r.json()` падал на пустом ответе (v1.0.8) +- **Симптом:** `'str' object has no attribute 'get'` +- **Причина:** POST /instances возвращает 201 с пустым телом. `r.json()` на пустой строке падает, а не возвращает dict. +- **Исправление:** `try: r.json() except: return {}`. Плюс Location header сохраняется в `result["_location"]`. + +### Баг 3: instanceUid не извлекался (v1.0.9) +- **Симптом:** `_find_uid(resp)` не находил UUID +- **Причина:** POST /instances возвращает instanceUid в заголовке `Location`, не в теле. `_find_uid` искал UUID в значениях dict, но там была только строка пути. +- **Исправление:** парсинг Location: `loc.rstrip("/").split("/")[-1]` → UUID. + +### Баг 4: cfsParams отправлялись в POST /instances (v1.0.10) +- **Симптом:** параметры не применялись, возможна ошибка API +- **Причина:** cfsParams — отдельный шаг после создания инстанса (POST /instanceOperations). Нельзя передавать их в POST /instances. +- **Исправление:** create шлёт только `{serviceId, displayName}`. Параметры пока не устанавливаются (будут позже через modify). + +## Что ещё поверено + +- `get_instances()` → `client.get("/instances", params={"pageSize":200})` → `requests.Session.get()` принимает `params` + `timeout` одновременно — корректно. +- Поллинг: цикл `while time.time() < deadline` с `time.sleep(5)` — корректно. +- После успешного create: `selectService(svcId)` перезагружает инстансы → create становится серым, другие операции активируются. +- `reconcile` исключён из списка операций (не тестируемая операция). +- Все сервисы кроме dummy скрыты.