Полная регрессия всех сценариев + 6 новых областей этой сессии (employees, roles, superadmin-console, platform-smtp, auth-password, security-edge). За день исправлено 4 бага: уволенный сотрудник логинится (P0), конкурентное проведение приёмки ломает инвариант (critical), refresh не гасится после ротации (high), change-owner принимал короткий reason (medium). Нереализованный по ТЗ функционал (отчёты/склад-документы/POS/permission-authz/login-ratelimit) зафиксирован как Logic gaps. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
116 lines
4.1 KiB
Markdown
116 lines
4.1 KiB
Markdown
# E2E report: stock-invariant-deep
|
||
|
||
Запущен: 2026-05-26T07:02:38.469Z
|
||
Длительность: 5.7с
|
||
|
||
**Итог:** 10 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 10)
|
||
|
||
## ✓ Step step01_bootstrap: Орг + admin + product (стартовый остаток 0)
|
||
|
||
Длительность: 1829мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Bootstrap product создан | ✓ e873c3b8-a3dd-4b32-a17a-91a09364f54d |
|
||
| db | Stock.Quantity == 0 | ✓ actual=0 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=0 sum=0 |
|
||
|
||
## ✓ Step step02_supply_a_qty_20: Supply A qty=20 → invariant stock=20, Σ movement=20
|
||
|
||
Длительность: 463мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Supply A qty=20 проведена | ✓ |
|
||
| db | Stock.Quantity == 20 | ✓ actual=20 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=20 sum=20 |
|
||
|
||
## ✓ Step step03_sale_a_qty_5: RetailSale A qty=5 → invariant stock=15, Σ movement=15
|
||
|
||
Длительность: 442мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Sale A qty=5 проведена | ✓ |
|
||
| db | Stock.Quantity == 15 | ✓ actual=15 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=15 sum=15 |
|
||
|
||
## ✓ Step step04_supply_b_qty_10: Supply B qty=10 → invariant stock=25, Σ movement=25
|
||
|
||
Длительность: 452мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Supply B qty=10 проведена | ✓ |
|
||
| db | Stock.Quantity == 25 | ✓ actual=25 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=25 sum=25 |
|
||
|
||
## ✓ Step step05_sale_b_qty_8: RetailSale B qty=8 → invariant stock=17, Σ movement=17
|
||
|
||
Длительность: 455мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Sale B qty=8 проведена | ✓ |
|
||
| db | Stock.Quantity == 17 | ✓ actual=17 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=17 sum=17 |
|
||
|
||
## ✓ Step step06_unpost_sale_a: Unpost RetailSale A → invariant stock=22, Σ movement=22
|
||
|
||
Длительность: 447мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Unpost Sale A → 200/204 | ✓ status=204 |
|
||
| db | Stock.Quantity == 22 | ✓ actual=22 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=22 sum=22 |
|
||
|
||
## ✓ Step step07_repost_sale_a: Re-post RetailSale A → invariant stock=17, Σ movement=17
|
||
|
||
Длительность: 447мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Re-post Sale A → 200/204 | ✓ status=204 |
|
||
| db | Stock.Quantity == 17 | ✓ actual=17 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=17 sum=17 |
|
||
|
||
## ✓ Step step08_movement_count_correct: Всего StockMovement по продукту = 6 строк (2 supply + 2 sale + reverse sale + repost sale)
|
||
|
||
Длительность: 202мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| db | StockMovement содержит как минимум 4 строки | ✓ count=6 |
|
||
| db | StockMovement не более 8 строк (нет лишних дублей) | ✓ count=6 |
|
||
|
||
## ✓ Step step09_concurrent_sales_serialized: Два POST /post одновременно на один остаток — один 200, второй 409
|
||
|
||
Длительность: 584мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Два Draft созданы | ✓ |
|
||
| api | Ровно один post 2xx, второй 4xx (5xx) | ✓ statuses=204,409 |
|
||
| db | Stock >= 0 (не минус из-за гонки) | ✓ stock=7 |
|
||
| db | Stock == Σ Movement после гонки | ✓ stock=7 sum=7 |
|
||
|
||
## ✓ Step step10_final_invariant: Финальный invariant после всех операций сохраняется
|
||
|
||
Длительность: 396мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| db | Финальный invariant Stock == Σ Movement | ✓ stock=7 sum=7 |
|
||
|
||
## Summary
|
||
|
||
- Passed: 10
|
||
- Failed: 0
|
||
- Warnings: 0
|
||
- Skipped: 0
|
||
|
||
## Critical bugs
|
||
|
||
Нет.
|