Сводный отчёт systemic-2026-05-26.md + зелёные прогоны всех сценариев (82 шага, 0 падений). За сессию исправлено: refresh-rotation (TokenId + zero reuse-leeway), сериализуемое проведение приёмки против lost update, MoySklad BaseUrl в конфиг. Покрыты впервые: конкурентность приёмок, дашбордная выручка, импорт MoySklad (идемпотентность/маппинг). Зафиксированы gap'ы по нереализованным отчётам (профит/ABC/экспорт, ТЗ 2.12). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
134 lines
5.8 KiB
Markdown
134 lines
5.8 KiB
Markdown
# E2E report: multi-tenant-isolation
|
||
|
||
Запущен: 2026-05-26T06:28:08.807Z
|
||
Длительность: 3.6с
|
||
|
||
**Итог:** 12 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 12)
|
||
|
||
## ✓ Step step01_create_two_orgs: SuperAdmin создаёт две независимые орги Alpha и Beta (каждая со своим админом)
|
||
|
||
Длительность: 1218мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Создана Alpha | ✓ f37d8c51-9934-4d18-a285-7ba25dfc60be |
|
||
| api | Создана Beta | ✓ c372ef64-2328-4a19-af3c-90a058f44012 |
|
||
| api | orgId Alpha ≠ orgId Beta | ✓ |
|
||
|
||
## ✓ Step step02_login_both_admins: Логин под admin Alpha и admin Beta — получаем два разных org_id в JWT
|
||
|
||
Длительность: 792мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Login Alpha admin → 200 | ✓ |
|
||
| api | Login Beta admin → 200 | ✓ |
|
||
| api | Alpha orgId == ctx.alpha.orgId | ✓ claim=f37d8c51-9934-4d18-a285-7ba25dfc60be |
|
||
| api | Beta orgId == ctx.beta.orgId | ✓ claim=c372ef64-2328-4a19-af3c-90a058f44012 |
|
||
|
||
## ✓ Step step03_seed_data_in_alpha: Admin Alpha создаёт counterparty + product → запоминаем их ID
|
||
|
||
Длительность: 160мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Alpha создаёт counterparty | ✓ 8103d4ec-e35c-4fd4-8214-931921a86783 |
|
||
| api | Alpha создаёт product | ✓ 647f7992-3df1-460c-845c-6ed68bc1903b |
|
||
|
||
## ✓ Step step04_beta_cannot_read_alpha: Admin Beta GET /api/catalog/counterparties/{alphaId} и /products/{alphaId} → 404
|
||
|
||
Длительность: 159мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Beta GET counterparties/{alphaId} → 404 | ✓ actual=404 |
|
||
| api | Beta GET products/{alphaId} → 404 | ✓ actual=404 |
|
||
|
||
## ✓ Step step05_beta_cannot_list_alpha_data: Admin Beta GET /api/catalog/counterparties|/products → пустые списки (нет данных Alpha)
|
||
|
||
Длительность: 207мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Beta GET counterparties не содержит Alpha counterparty | ✓ всего=0, утечек=0 |
|
||
| api | Beta GET products не содержит Alpha product | ✓ всего=0, утечек=0 |
|
||
|
||
## ✓ Step step06_beta_cannot_modify_alpha: Admin Beta PUT/DELETE /api/catalog/products/{alphaId} → 404 (не 200, не 403)
|
||
|
||
Длительность: 172мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Beta PUT products/{alphaId} с валидным телом → 404/403 | ✓ actual=404 {"type":"https://tools.ietf.org/html/rfc9110#section-15.5.5","title":"Not Found","status":404,"trace |
|
||
| api | Beta DELETE products/{alphaId} → 404/403 | ✓ actual=404 |
|
||
|
||
## ✓ Step step07_beta_cannot_link_to_alpha: Admin Beta POST product с DefaultSupplierId=alphaCounterpartyId → 400 (FK через query filter)
|
||
|
||
Длительность: 38мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Beta POST product с supplierId Alpha → 4xx | ✓ actual=400 |
|
||
|
||
## ✓ Step step08_beta_cannot_forge_org_override: Admin Beta с заголовком X-Org-Override:{alphaId} → запрос всё равно идёт от Beta (не SuperAdmin)
|
||
|
||
Длительность: 21мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Beta admin + X-Org-Override → 404/403 | ✓ actual=404 |
|
||
|
||
## ✓ Step step09_superadmin_sees_both: SuperAdmin без override GET /api/super-admin/organizations → видит и Alpha и Beta
|
||
|
||
Длительность: 18мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | SuperAdmin видит Alpha в списке орг | ✓ total=2 |
|
||
| api | SuperAdmin видит Beta в списке орг | ✓ |
|
||
|
||
## ✓ Step step10_superadmin_readonly_override: SuperAdmin с X-Org-Override:{alphaId} → GET товаров Alpha (200), PUT/POST без reason → 403
|
||
|
||
Длительность: 30мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | SuperAdmin+override GET → 200 | ✓ actual=200 |
|
||
| api | SuperAdmin+override PUT без reason → 403 | ✓ actual=403 |
|
||
|
||
## ✓ Step step11_superadmin_edit_override_with_reason: SuperAdmin с X-Org-Override + X-Org-Override-Reason → PUT 200 + запись в audit_log
|
||
|
||
Длительность: 504мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | SuperAdmin+override+reason PUT counterparty → 200/204 | ✓ actual=204 |
|
||
| db | Counterparty.Name изменено в БД | ✓ name=edited-by-superadmin-1779776888807 |
|
||
| db | super_admin_audit_log выросло | ✓ before=2 after=3 |
|
||
|
||
## ✓ Step step12_stock_isolation: Остатки Alpha и Beta не смешиваются — Supply в Alpha не появляется в /inventory/stock у Beta
|
||
|
||
Длительность: 267мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Alpha создаёт supply | ✓ actual=201 {"id":"0aacfaea-1785-4761-8524-bc5bde177f0b","number":"П-2026-000001","date":"2026-05-26T06:28:13.685Z","status":0,"supp |
|
||
| api | Alpha проводит supply | ✓ actual=204 |
|
||
| api | Beta /inventory/stock не содержит Alpha product | ✓ total=0, утечка=нет |
|
||
| api | Beta /inventory/movements не содержит Alpha movement | ✓ total=0, утечка=нет |
|
||
|
||
## Summary
|
||
|
||
- Passed: 12
|
||
- Failed: 0
|
||
- Warnings: 0
|
||
- Skipped: 0
|
||
|
||
## Critical bugs
|
||
|
||
Нет.
|
||
|
||
## Logic gaps
|
||
|
||
- ProductsController.Put в режиме X-Org-Override роняет DbUpdateConcurrencyException при пересылке prices/barcodes — merge-логика не учитывает override-режим. Ремонт PUT product через override-консоль невозможен.
|