Декларативные 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 добавим следующим коммитом, не блокирует получение полезного отчёта.
64 lines
3.1 KiB
Markdown
64 lines
3.1 KiB
Markdown
# 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` если нет).
|