food-market/tests/e2e/scenarios/full-cycle.yml
nns 7bb941259a
Some checks are pending
CI / POS (WPF, Windows) (push) Waiting to run
CI / Backend (.NET 8) (push) Successful in 1m20s
CI / Web (React + Vite) (push) Successful in 42s
feat(e2e): infrastructure + first full-cycle scenario + baseline report
Декларативные 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 добавим следующим коммитом, не блокирует
получение полезного отчёта.
2026-05-08 00:05:52 +05:00

38 lines
2.2 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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