# E2E report: stock-invariant-deep Запущен: 2026-05-26T06:02:08.247Z Длительность: 6.5с **Итог:** 10 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 10) ## ✓ Step step01_bootstrap: Орг + admin + product (стартовый остаток 0) Длительность: 1555мс | Тип | Проверка | Результат | |---|---|---| | api | Bootstrap product создан | ✓ 54af3580-d626-42e0-92b1-cc70bb3fb90d | | 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 Длительность: 969мс | Тип | Проверка | Результат | |---|---|---| | 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 Длительность: 951мс | Тип | Проверка | Результат | |---|---|---| | 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 Длительность: 514мс | Тип | Проверка | Результат | |---|---|---| | 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 Длительность: 527мс | Тип | Проверка | Результат | |---|---|---| | 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 Длительность: 433мс | Тип | Проверка | Результат | |---|---|---| | 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 Длительность: 424мс | Тип | Проверка | Результат | |---|---|---| | 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) Длительность: 182мс | Тип | Проверка | Результат | |---|---|---| | db | StockMovement содержит как минимум 4 строки | ✓ count=6 | | db | StockMovement не более 8 строк (нет лишних дублей) | ✓ count=6 | ## ✓ Step step09_concurrent_sales_serialized: Два POST /post одновременно на один остаток — один 200, второй 409 Длительность: 600мс | Тип | Проверка | Результат | |---|---|---| | 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 после всех операций сохраняется Длительность: 369мс | Тип | Проверка | Результат | |---|---|---| | db | Финальный invariant Stock == Σ Movement | ✓ stock=7 sum=7 | ## Summary - Passed: 10 - Failed: 0 - Warnings: 0 - Skipped: 0 ## Critical bugs Нет.