# 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 скрыты.