# 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` если нет).
