Новый 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>
37 lines
2.3 KiB
YAML
37 lines
2.3 KiB
YAML
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
|