[Test] Решить тестовую инъекцию сбоя для rollback и claimed-fence в Portfolio publish #105

Closed
opened 2026-10-15 22:19:12 +03:00 by codex-bot · 2 comments
Owner

Остаток из #63 (см. её комментарий).

Проблема

  1. Rollback fault после первой Portfolio write: в PortfolioRepository.publish (транзакция: claimed → tbankPortfolio.upsert → valueHistory → valuePoint) нет честного сбоя посередине. Текущие mockRejectedValueOnce(new Error('db')) падают до транзакции. FK и upsert не дают сбоя внутри без подмены.
  2. Доказательство claimed-fence: мутант на отключение claimed не ловится ни одним тестом. Прямой тест на отказ при устаревшем attempt не моделируется: FK tbankSyncWork -> tbankConnection и каскад put не допускают состояния «работа есть, соединение уже сменилось».

Решение, которое нужно принять

Разрешена ли тестовая инъекция сбоя (spy на делегаты транзакции, test-only seam в репозитории или внедрение фабрики клиента)? В проекте прецедента spy на делегаты $transaction нет. Issue #63 запрещает новый fixture framework, поэтому вариант должен быть минимальным.

Критерии готовности (после решения)

  • Сбой после первой записи tbankPortfolio откатывает snapshot и points (проверка по БД).
  • Мутант на отключение claimed ловится тестом.
  • Без изменения продакшен-логики ради тестов, либо явное согласование seam.
Остаток из #63 (см. её комментарий). ## Проблема 1. Rollback fault после первой Portfolio write: в `PortfolioRepository.publish` (транзакция: claimed → tbankPortfolio.upsert → valueHistory → valuePoint) нет честного сбоя посередине. Текущие `mockRejectedValueOnce(new Error('db'))` падают до транзакции. FK и upsert не дают сбоя внутри без подмены. 2. Доказательство `claimed`-fence: мутант на отключение `claimed` не ловится ни одним тестом. Прямой тест на отказ при устаревшем attempt не моделируется: FK `tbankSyncWork -> tbankConnection` и каскад `put` не допускают состояния «работа есть, соединение уже сменилось». ## Решение, которое нужно принять Разрешена ли тестовая инъекция сбоя (spy на делегаты транзакции, test-only seam в репозитории или внедрение фабрики клиента)? В проекте прецедента spy на делегаты `$transaction` нет. Issue #63 запрещает новый fixture framework, поэтому вариант должен быть минимальным. ## Критерии готовности (после решения) - Сбой после первой записи `tbankPortfolio` откатывает snapshot и points (проверка по БД). - Мутант на отключение `claimed` ловится тестом. - Без изменения продакшен-логики ради тестов, либо явное согласование seam.
codex-bot added the Kind/Investigation
Priority
Medium
3
audit/2026-10-11
labels 2026-10-17 20:57:33 +03:00
codex-bot self-assigned this 2026-10-17 20:57:44 +03:00
codex-bot added this to the Technical Audit Remediation — 2026-10-11 milestone 2026-10-17 20:57:44 +03:00
Author
Owner

Решение владельца: тестовая инъекция сбоя через jest.spyOn в integration-тесте (обёртка $transaction/делегата внутри tx), без изменения production-кода и без нового fixture framework.

Решение владельца: тестовая инъекция сбоя через `jest.spyOn` в integration-тесте (обёртка `$transaction`/делегата внутри tx), без изменения production-кода и без нового fixture framework.
Author
Owner

Сделано в #146 (squash в develop): rollback после первой записи point проверяется по БД; claimed fence — на реальной БД (stale attemptId, complete, invalidToken). Мутанты описаны в PR. Production-код не менялся.

Сделано в #146 (squash в develop): rollback после первой записи point проверяется по БД; claimed fence — на реальной БД (stale attemptId, complete, invalidToken). Мутанты описаны в PR. Production-код не менялся.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#105