food-market/tests/e2e/README.md
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

64 lines
3.1 KiB
Markdown
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.

# tests/e2e
Декларативные end-to-end сценарии. Один YAML описывает шаги, TypeScript-handler — конкретные API/UI/DB-проверки. Отчёт в Markdown.
## Запуск
```bash
tests/e2e/run.sh full-cycle # полный прогон (API + UI)
tests/e2e/run.sh full-cycle --api-only # без Playwright, только axios + DB
```
Первый запуск установит `node_modules/` (axios, pg, playwright, js-yaml, tsx).
Отчёт: `tests/e2e/reports/<scenario>-<timestamp>.md`.
## Структура
```
tests/e2e/
├── runner.ts # entry: парсит YAML, прогоняет steps, пишет report
├── run.sh # wrapper: pnpm install + tsx
├── lib/
│ ├── api.ts # axios + login()
│ ├── db.ts # docker exec psql, resetTenantData(), countRows()
│ └── report.ts # markdown-аккумулятор
└── scenarios/
├── full-cycle.yml # декларация шагов
└── full-cycle.steps.ts # код handler'ов
```
## Preconditions
Поле `reset_db: true` в YAML вызывает `resetTenantData()` в `lib/db.ts`. Что чистится:
- Tenant-таблицы (organizations, employees, supplies, retail_sales, …) — TRUNCATE … CASCADE.
- AspNetUsers / users / AspNetUserRoles — оставляем только `admin@food-market.local`.
- OpenIddict tokens — все valid → revoked.
Что **НЕ** чистится (берегём как baseline):
- Реестр товаров: `products`, `product_groups`, `units_of_measure`, `product_packagings`, `product_barcodes`, `product_prices`, `product_images`.
- Системные справочники: `countries`, `currencies`, `price_types`, `employee_roles`.
- `__EFMigrationsHistory`, `OpenIddict*` таблицы (структура), `platform_settings`, `system_settings`.
После TRUNCATE — smoke `login(admin@food-market.local)`. Если падает — runner выходит с кодом 3.
## Добавление сценария
1. `scenarios/<name>.yml` — мета + список `steps[].id`.
2. `scenarios/<name>.steps.ts` — экспортируй функции с теми же id (`async function stepXX_foo({ ctx, step, report })`).
3. Запусти `tests/e2e/run.sh <name>`.
`ctx` — общий объект между шагами для прокидывания id'ов созданных сущностей и токенов сессий.
`step.checks` — массив проверок (api/ui/db). Если хоть одна `ok=false` — шаг помечен как fail.
`report.bug()` / `report.ux()` / `report.gap()` / `report.perf()` — категоризованные находки в финальной секции.
## Зависимости
- Postgres контейнер `food-market-postgres` (psql вызывается через docker exec).
- API на `https://admin.food-market.kz` (или `E2E_ADMIN_URL` env).
- Playwright headless chromium для UI-проверок (`pnpm exec playwright install chromium` если нет).