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