# 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/-.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/.yml` — мета + список `steps[].id`. 2. `scenarios/.steps.ts` — экспортируй функции с теми же id (`async function stepXX_foo({ ctx, step, report })`). 3. Запусти `tests/e2e/run.sh `. `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` если нет).