Files
autotest/HISTORY/2026-07-24-session-2.md
T

3.7 KiB
Raw Blame History

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