food-market/tests/e2e
nns ae88a16fd2 test(e2e): scenario multi-tenant-isolation — 12 шагов проверки изоляции
Новый E2E-сценарий покрывает критичную для multi-tenant SaaS поверхность:

1. Создание двух независимых организаций (Alpha и Beta) через SuperAdmin.
2. Логин под admin'ами Alpha и Beta, проверка разных org_id в JWT.
3. Alpha seed'ит counterparty + product.
4. Beta GET по прямым ID Alpha → 404 (не 200, не 403, не 500).
5. Beta GET листинги — Alpha-записей нет.
6. Beta PUT/DELETE по ID Alpha с валидным телом → 404.
7. Beta POST product со ссылкой на supplier Alpha → 4xx.
8. Beta-admin подделывает X-Org-Override:{alphaId} → запрос
   игнорирует заголовок (только SuperAdmin может override).
9. SuperAdmin без override видит обе организации.
10. SuperAdmin + X-Org-Override без reason → read-only (PUT 403).
11. SuperAdmin + X-Org-Override + Reason ≥10 → PUT 200, audit_log растёт.
12. Stock + StockMovements Alpha не видны Beta.

Применение: `bash tests/e2e/run.sh multi-tenant-isolation --api-only`.
Использует ту же runner-инфраструктуру что и full-cycle.yml.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 12:25:05 +05:00
..
lib test(e2e): починка контрактов supply/sale + EAN-13 + bug-hunt + full-pass отчёт 2026-05-08 11:01:56 +05:00
reports e2e: bugs-fixed отчёт — все 12 шагов зелёные после fix HIGH+MEDIUM+2 gap'а 2026-05-08 12:16:17 +05:00
scenarios test(e2e): scenario multi-tenant-isolation — 12 шагов проверки изоляции 2026-05-23 12:25:05 +05:00
.gitignore feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
package.json feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
pnpm-lock.yaml feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
README.md feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
run.sh feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
runner.ts feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00
tsconfig.json feat(e2e): infrastructure + first full-cycle scenario + baseline report 2026-05-08 00:05:52 +05:00

tests/e2e

Декларативные end-to-end сценарии. Один YAML описывает шаги, TypeScript-handler — конкретные API/UI/DB-проверки. Отчёт в Markdown.

Запуск

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