Сводный отчёт 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>
60 lines
2.4 KiB
Markdown
60 lines
2.4 KiB
Markdown
# E2E report: stock-concurrency
|
||
|
||
Запущен: 2026-05-26T06:28:48.064Z
|
||
Длительность: 4.9с
|
||
|
||
**Итог:** 4 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 4)
|
||
|
||
## ✓ Step step01_bootstrap: Орг + товар + стартовая приёмка qty=5 @100 (Stock=5, Cost=100)
|
||
|
||
Длительность: 2198мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Bootstrap product создан | ✓ 1903eb84-9c8c-4335-9439-6d8fa6bd2102 |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=5 sum=5 |
|
||
| db | Стартовый Stock == 5 | ✓ stock=5 |
|
||
| db | Стартовый Cost == 100 | ✓ cost=100 |
|
||
|
||
## ✓ Step step02_concurrent_distinct_supplies: Две разные приёмки (10@100 и 10@120) одновременно → Stock=25, инвариант, Cost=108
|
||
|
||
Длительность: 903мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Две приёмки-черновика созданы | ✓ |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=25 sum=25 |
|
||
| db | Stock == 25 (5 + 10 + 10, без потери приёмки) | ✓ stock=25 sum=25 statuses=204,409 |
|
||
| db | Cost == 108 (взвешенное среднее по всем трём приёмкам) | ✓ cost=108 |
|
||
|
||
## ✓ Step step03_double_post_same_supply: Двойное проведение ОДНОЙ приёмки (7@100) одновременно → применяется один раз
|
||
|
||
Длительность: 1378мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| api | Приёмка-черновик 7@100 создана | ✓ |
|
||
| api | Не более одного успешного проведения | ✓ statuses=204,409 |
|
||
| db | Stock вырос ровно на 7 (приёмка применена один раз) | ✓ before=25 after=32 |
|
||
| db | Добавлено ровно одно StockMovement | ✓ +1 movements |
|
||
| db | Stock.Quantity == Σ StockMovement (invariant) | ✓ stock=32 sum=32 |
|
||
|
||
## ✓ Step step04_final_invariant: Финальный инвариант Stock == Σ StockMovement
|
||
|
||
Длительность: 441мс
|
||
|
||
| Тип | Проверка | Результат |
|
||
|---|---|---|
|
||
| db | Финальный invariant Stock == Σ StockMovement | ✓ stock=32 sum=32 |
|
||
|
||
## Summary
|
||
|
||
- Passed: 4
|
||
- Failed: 0
|
||
- Warnings: 0
|
||
- Skipped: 0
|
||
|
||
## Critical bugs
|
||
|
||
Нет.
|