food-market/tests/e2e/scenarios/multi-tenant-isolation.yml
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

37 lines
2.3 KiB
YAML
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.

name: multi-tenant-isolation
description: |
Multi-tenant изоляция. Создаём две организации, проверяем что данные
одной невидимы и неизменяемы из другой. Проверяем SuperAdmin override
(read-only без reason, edit-mode с reason). Это критическая проверка
безопасности — любая утечка между орг'ами это P0 баг.
preconditions:
reset_db: true
smoke_login_super_admin: true
steps:
- id: step01_create_two_orgs
title: SuperAdmin создаёт две независимые орги Alpha и Beta (каждая со своим админом)
- id: step02_login_both_admins
title: Логин под admin Alpha и admin Beta — получаем два разных org_id в JWT
- id: step03_seed_data_in_alpha
title: Admin Alpha создаёт counterparty + product → запоминаем их ID
- id: step04_beta_cannot_read_alpha
title: Admin Beta GET /api/catalog/counterparties/{alphaId} и /products/{alphaId} → 404
- id: step05_beta_cannot_list_alpha_data
title: Admin Beta GET /api/catalog/counterparties|/products → пустые списки (нет данных Alpha)
- id: step06_beta_cannot_modify_alpha
title: Admin Beta PUT/DELETE /api/catalog/products/{alphaId} → 404 (не 200, не 403)
- id: step07_beta_cannot_link_to_alpha
title: Admin Beta POST product с DefaultSupplierId=alphaCounterpartyId → 400 (FK через query filter)
- id: step08_beta_cannot_forge_org_override
title: Admin Beta с заголовком X-Org-Override:{alphaId} → запрос всё равно идёт от Beta (не SuperAdmin)
- id: step09_superadmin_sees_both
title: SuperAdmin без override GET /api/super-admin/organizations → видит и Alpha и Beta
- id: step10_superadmin_readonly_override
title: SuperAdmin с X-Org-Override:{alphaId} → GET товаров Alpha (200), PUT/POST без reason → 403
- id: step11_superadmin_edit_override_with_reason
title: SuperAdmin с X-Org-Override + X-Org-Override-Reason → PUT 200 + запись в audit_log
- id: step12_stock_isolation
title: Остатки Alpha и Beta не смешиваются — Supply в Alpha не появляется в /inventory/stock у Beta