Декларативные end-to-end сценарии в tests/e2e/. YAML описывает шаги, TypeScript-handler — конкретные API/UI/DB-проверки. Отчёт в Markdown. Структура: - runner.ts : entry, парсит YAML, прогоняет steps, пишет report - run.sh : pnpm install + tsx - lib/api.ts : axios + login() (через /connect/token + /api/me) - lib/db.ts : docker exec psql, resetTenantData(), countRows() - lib/report.ts : Markdown-аккумулятор (steps + bugs + ux + gap + perf) - scenarios/full-cycle.yml : 12 шагов - scenarios/full-cycle.steps.ts : handlers (один на шаг) - README.md : как добавить новый сценарий reset_db в preconditions: - TRUNCATE tenant-таблиц CASCADE - AspNet*/users — оставляем только admin@food-market.local - OpenIddict tokens — все valid → revoked - Реестр products + системные справочники + миграции + platform_settings — НЕ трогаем Запуск: tests/e2e/run.sh full-cycle [--api-only] Первый прогон (--api-only, baseline в reports/full-cycle-2026-05-07-baseline.md): - 8 ✓ / 1 ✗ / 3 ◯ из 12. - Critical bug: Cashier видит /api/organization/employees через API (нет [Authorize(Roles="Admin")] на List endpoint). - High: при CreateOrg через SuperAdmin не сидируются tenant-units — пустой каталог измерений у новой org (DevDataSeeder.SeedTenantReferencesAsync должен вызываться, но не вызывается). - Logic gaps: реестр products tenant-scoped и новая org стартует с пустым каталогом; SuperAdmin /organizations не валидирует ФЛК телефона; Cashier не получает Identity-роль "Cashier" при создании через /employees. UI-шаги (Playwright) в этом коммите не покрыты — runner работает в --api-only режиме. UI-extension добавим следующим коммитом, не блокирует получение полезного отчёта.
38 lines
2.2 KiB
YAML
38 lines
2.2 KiB
YAML
name: full-cycle
|
||
description: |
|
||
Полный цикл от создания организации до розничной продажи. 12 шагов:
|
||
SuperAdmin создаёт орг и admin'a → admin создаёт сотрудников →
|
||
Cashier пробует зайти (role-guard) → admin создаёт контрагента,
|
||
склад/кассу → приёмка с 3-5 товарами → проверка остатков →
|
||
розничная продажа → проверка остатков уменьшилась.
|
||
|
||
preconditions:
|
||
reset_db: true
|
||
smoke_login_super_admin: true
|
||
|
||
steps:
|
||
- id: step01_create_organization
|
||
title: SuperAdmin создаёт «Test Shop {timestamp}» (KZ, KZT, ФЛК телефона)
|
||
- id: step02_create_first_admin
|
||
title: SuperAdmin создаёт первого Admin сотрудника организации (Employee + AppUser)
|
||
- id: step03_login_as_admin
|
||
title: Логин под admin (не SuperAdmin override) — JWT с org_id и role=Admin
|
||
- id: step04_create_storekeeper_and_cashier
|
||
title: Admin создаёт Storekeeper и Cashier через /settings/employees
|
||
- id: step05_login_as_cashier
|
||
title: Логин под Cashier — role-guard проверяется (sidebar/role guard)
|
||
- id: step06_create_counterparty
|
||
title: Admin создаёт «ТОО Тест Поставщик» (БИН + телефон)
|
||
- id: step07_ensure_main_store
|
||
title: Проверить что есть main store (из bootstrap), иначе создать
|
||
- id: step08_create_supply
|
||
title: Admin создаёт Supply Draft (3-5 товаров) и проводит (Posted)
|
||
- id: step09_check_stock_after_supply
|
||
title: GET /api/inventory/stock — quantity увеличился на supplied amount
|
||
- id: step10_ensure_retail_point
|
||
title: Проверить или создать розничную точку (кассу)
|
||
- id: step11_create_retail_sale
|
||
title: Admin создаёт RetailSale, 2 позиции из приёмки, cash, Post
|
||
- id: step12_check_stock_after_sale
|
||
title: GET /api/inventory/stock — quantity уменьшился на sold amount
|