3.7 KiB
3.7 KiB
2026-07-24 — Отладка API-тестов dummy
Общая логика (как проверено)
Поток: пользователь выбирает сервис → видит операции → выбирает операцию → задаёт параметры → жмёт «Тест» → сервер выполняет → результат.
Цепочка вызовов (полная трассировка)
- GET /api/services → список сервисов (только dummy пока)
- GET /api/operations/1 → операции dummy + инстансы пользователя
- Нет инстансов → только
createактивна
- Нет инстансов → только
- GET /api/params/18 → параметры create (12 шт, 4 обязательных)
- POST /api/test
{serviceId:1, operation:"create", ...} - POST /instances
{serviceId:1, displayName:"autotest-1"}→ 201 + Location header - GET /instances (поллинг) → ждём
operationIsInProgress=false, статус не "creating" - Возврат результата → фронт обновляет 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 скрыты.