Практикум — проверка в Postman
Практикум, шаг 8 из 8. E2E-проверка OrderDesk. Сервисы из шага 4 и 5 должны быть запущены. Ожидаемые статусы можно заранее посмотреть в интерактивной песочнице.
Pre-request на уровне коллекции
Чтобы каждый запрос нёс трассировку, в Collection → Pre-request Script:
if (!pm.environment.get("request_id")) {
pm.environment.set("request_id", pm.variables.replaceIn("{{$guid}}"));
}
pm.request.headers.add({ key: "X-Request-Id", value: pm.environment.get("request_id") });
Окружение Postman
Создайте environment OrderDesk Local:
| Переменная | Начальное значение |
|---|---|
catalog_base | http://localhost:8100 |
orders_base | http://localhost:5200 |
api_key | dev-catalog-key-change-me |
access_token | (пусто, заполнит тест) |
product_id | (пусто) |
order_id | (пусто) |
Порядок запросов в коллекции
1. Catalog — создать товар
POST {{catalog_base}}/api/v1/products
Body (raw JSON):
{
"sku": "POSTMAN-1",
"name": "Demo product",
"price": 19.5,
"stockAvailable": 25
}
Tests (вкладка Tests):
pm.test("201 Created", () => pm.response.to.have.status(201));
const body = pm.response.json();
pm.environment.set("product_id", body.id);
2. Orders — получить JWT
POST {{orders_base}}/api/v1/auth/token
{ "username": "demo", "password": "demo" }
Tests:
pm.test("token issued", () => pm.response.to.have.status(200));
pm.environment.set("access_token", pm.response.json().access_token);
Authorization для следующих запросов: Bearer Token → {{access_token}}.
3. Orders — создать заказ
POST {{orders_base}}/api/v1/orders
{
"lines": [
{ "productId": "{{product_id}}", "quantity": 2 }
]
}
Tests:
pm.test("order reserved", () => {
pm.response.to.have.status(201);
pm.expect(pm.response.json().status).to.eql("reserved");
});
pm.environment.set("order_id", pm.response.json().id);
4. Catalog — проверить остаток
GET {{catalog_base}}/api/v1/products/{{product_id}}
Ожидание: stockAvailable уменьшился на 2 (было 25 → стало 23).
5. Orders — подтвердить заказ
POST {{orders_base}}/api/v1/orders/{{order_id}}/confirm
Ожидание: 200, status: confirmed.
6. WebSocket — подписка на события
В Postman New → WebSocket Request:
ws://localhost:5200/ws/orders?access_token={{access_token}}
После подключения отправьте:
{ "v": 1, "type": "ping" }
Ответ: { "v": 1, "type": "pong" }.
Повторите запрос Confirm или Cancel в REST — в WebSocket должно прийти order.status_changed.
Негативные сценарии
| # | Действие | Ожидание |
|---|---|---|
| A | POST /orders с quantity: 9999 | 409 Conflict |
| B | POST /reservations без X-Api-Key (отдельный raw-запрос к catalog) | 401 |
| C | GET /orders без Bearer | 401 |
| D | Остановить catalog-api, создать заказ | 502 |
Зафиксируйте результаты в Postman Collection Runner — прогон всей цепочки одной кнопкой.
Экспорт и CI
- Export коллекции и environment в JSON — положите в
OrderDesk/postman/. - Newman:
newman run OrderDesk.postman_collection.json -e OrderDesk.local.json
REST-часть войдёт в CI; WebSocket — вручную или через отдельный скрипт (k6, websockets в Python).
Сверка с локальными сервисами
| Шаг Postman | Песочница (intro) | Локальный вызов |
|---|---|---|
| Создать товар | POST product | POST :8100/api/v1/products |
| JWT | POST token | POST :5200/api/v1/auth/token |
| Заказ | POST order | POST :5200/api/v1/orders + Bearer |
| 502 | Catalog down | Остановить uvicorn, повторить заказ |
| WS event | Лента после confirm | Postman WebSocket |
Collection Runner
- Выберите environment OrderDesk Local.
- Порядок папок: Catalog → Auth → Orders → Negative.
- В отчёте Runner все тесты должны быть зелёными; при
409/502в негативной папке — ожидаемый красный статус с assert в Tests.
Итог практикума
Вы прошли полный цикл:
- Архитектура и границы сервисов
- Контракт API и OpenAPI
- Маппинг DTO
- catalog-api на Python
- orders-api на C#
- Безопасность
- WebSocket
- Postman — проверка сквозного сценария
Дальше — контейнеры (8.06), интеграционные тесты (1012) и нагрузочное тестирование (1014).
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Два сервиса OrderDesk: каталог на Python и заказы на C#, границы ответственности, потоки REST и WebSocket. Ресурсы OrderDesk, таблица методов HTTP, коды ответов и фрагмент OpenAPI для catalog-api и orders-api. Доменные сущности OrderDesk, DTO для REST, маппинг Python (Pydantic) и C# (record + ручной маппер). FastAPI, SQLite, эндпоинты товаров и резервирования, Pydantic и проверка через uvicorn. ASP.NET Core 8, Minimal API, HttpClient к catalog-api, SQLite и создание заказа с резервом. JWT, API-ключ между сервисами, HTTPS, таймауты, идемпотентность и заголовок X-Request-Id в OrderDesk. Протокол JSON-сообщений, hub в ASP.NET Core, heartbeat и подписка клиента на статусы OrderDesk.Практикум — сценарий и архитектура OrderDesk
Практикум — проектирование контракта API
Практикум — модели данных и маппинг DTO
Практикум — сервис каталога на Python
Практикум — сервис заказов на C#
Практикум — безопасность и устойчивость
Практикум — WebSocket и события заказов