[CL-COVTESTS3] test(api): branch-покрытие p2p execute-trade (batch 3) #437

Merged
andrei merged 2 commits from feature/claude-cl-branch-coverage3-20260607 into master 2026-06-07 18:05:53 +00:00
Owner

Что сделано

Batch 3 branch-coverage hunt (lane #3, продолжение PR #416/#434). Только тесты — production-код не тронут.

Файл branches до branches после
api/src/services/p2p-trade/execute-trade.ts 70% 84%

executeP2PTrade — money-path $transaction с FOR UPDATE локами и SELL/BUY split. Happy-path интеграционные тесты пропускали guard-ветки.

Покрыто (21 test):

  • guards: order not found / inactive / expired / fully-filled / own-order / room-not-found / P2P frozen / locked-account (guardAccountNotLocked rethrow)
  • SELL: insufficient buyer funds, lockedShares < traded (500), partial fill, EURT coinBalance, platformFee==0
  • BUY: seller no shares, lockedBalance < total (500), partial fill, full settlement
  • getRecentTrades: limit clamp (>100→100, 0→1), sellOrder→buyOrder room fallback, GDPR-anonymized parties

$transaction mock с SQL-routed $queryRaw (по содержимому: p2p_orders / riskAcknowledgedAt / coinBalance / share_ownerships), все helpers/services замоканы. Money-assertions точные (buyer decrement/seller increment/fee amount) — ловят неверное поле/сумму.

Зачем

Финальный coverage-hunt из серии #416/#434 (audit residual #3). execute-trade.ts — последний крупный низко-покрытый p2p money-путь. Непокрытые guard/SELL/BUY ветки = регрессии в funds/locked-resource/partial-fill не ловятся до прода.

План тестирования

  • npx vitest run9915 passed, 0 регрессий.
  • Scoped coverage: execute-trade.ts 70%→84% branches.
  • npx tsc --noEmit clean; eslint на изменённом clean.
  • Local code-reviewer: 0 CRITICAL, 3 HIGH (слабые money-assertions) — все усилены до точных сумм в review-fix commit.
  • pre-commit + pre-push (tsc+build) passed.

Где могу ошибаться

  • Непокрыто: lines 136-138 (defensive overshoot guard affordableShares-=1 — практически недостижим детерминированно с round-арифметикой) + несколько micro-branches (optional-chaining). 84% — потолок без искусственных кейсов.
  • $queryRaw router завязан на текущий набор SQL (4 типа запросов); при добавлении нового FOR UPDATE-запроса с пересекающейся подстрокой router нужно обновить.
  • Остаётся последний follow-up таргет: stripePayout.service.ts (50%).
## Что сделано Batch 3 branch-coverage hunt (lane #3, продолжение PR #416/#434). **Только тесты — production-код не тронут.** | Файл | branches до | branches после | |---|---|---| | `api/src/services/p2p-trade/execute-trade.ts` | 70% | **84%** | `executeP2PTrade` — money-path `$transaction` с FOR UPDATE локами и SELL/BUY split. Happy-path интеграционные тесты пропускали guard-ветки. Покрыто (21 test): - **guards:** order not found / inactive / expired / fully-filled / own-order / room-not-found / P2P frozen / locked-account (guardAccountNotLocked rethrow) - **SELL:** insufficient buyer funds, lockedShares < traded (500), partial fill, EURT coinBalance, platformFee==0 - **BUY:** seller no shares, lockedBalance < total (500), partial fill, full settlement - **getRecentTrades:** limit clamp (>100→100, 0→1), sellOrder→buyOrder room fallback, GDPR-anonymized parties `$transaction` mock с SQL-routed `$queryRaw` (по содержимому: `p2p_orders` / `riskAcknowledgedAt` / `coinBalance` / `share_ownerships`), все helpers/services замоканы. Money-assertions точные (buyer decrement/seller increment/fee amount) — ловят неверное поле/сумму. ## Зачем Финальный coverage-hunt из серии #416/#434 (audit residual #3). execute-trade.ts — последний крупный низко-покрытый p2p money-путь. Непокрытые guard/SELL/BUY ветки = регрессии в funds/locked-resource/partial-fill не ловятся до прода. ## План тестирования - `npx vitest run` — **9915 passed**, 0 регрессий. - Scoped coverage: execute-trade.ts 70%→84% branches. - `npx tsc --noEmit` clean; eslint на изменённом clean. - Local code-reviewer: 0 CRITICAL, 3 HIGH (слабые money-assertions) — все усилены до точных сумм в review-fix commit. - pre-commit + pre-push (tsc+build) passed. ## Где могу ошибаться - Непокрыто: lines 136-138 (defensive overshoot guard `affordableShares-=1` — практически недостижим детерминированно с round-арифметикой) + несколько micro-branches (optional-chaining). 84% — потолок без искусственных кейсов. - $queryRaw router завязан на текущий набор SQL (4 типа запросов); при добавлении нового FOR UPDATE-запроса с пересекающейся подстрокой router нужно обновить. - Остаётся последний follow-up таргет: stripePayout.service.ts (50%).
[CL-COVTESTS3] test(api): branch-покрытие p2p execute-trade (batch 3)
Some checks failed
CI / API (pull_request) Has been cancelled
CI / App (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
CI / Prisma Migrate Gate (pull_request) Has been cancelled
732089be89
Тест-only, prod-код не тронут. executeP2PTrade — money-path $transaction с FOR UPDATE
локами и SELL/BUY split; happy-path интеграционные тесты пропускали guard-ветки.

src/services/p2p-trade/execute-trade.ts: 70% -> 84% branches.
Покрыто:
- guards: order not found / inactive / expired / fully-filled / own-order / room-not-found /
  P2P frozen / locked-account (guardAccountNotLocked rethrow)
- SELL: insufficient buyer funds, lockedShares < traded (500), partial fill, EURT coinBalance,
  platformFee==0 (skip fee transfer)
- BUY: seller has no shares, lockedBalance < total (500), partial fill, full settlement
- getRecentTrades: limit clamp (>100 -> 100, 0 -> 1), sellOrder->buyOrder room fallback,
  GDPR-anonymized buyer/seller

$transaction mock с SQL-routed $queryRaw (по содержимому: p2p_orders / riskAcknowledgedAt /
coinBalance / share_ownerships), все helpers/services замоканы.

21 tests. Full suite: 9915 passed, 0 регрессий. tsc + eslint clean.
[CL-COVTESTS3] test(api): harden execute-trade money assertions per review
All checks were successful
CI / Contracts (pull_request) Successful in 1m47s
CI / Secrets Scan (pull_request) Successful in 13s
CI / Python SDK (pull_request) Successful in 44s
CI / Telegram Mini App (pull_request) Successful in 1m55s
CI / Prisma Migrate Gate (pull_request) Successful in 1m40s
CI / API (pull_request) Successful in 7m58s
CI / App (pull_request) Successful in 7m58s
23d7fcd210
Адресованы 3 HIGH local code-reviewer — money-assertions были слишком слабыми
(expect.anything() / без точных сумм, проходили бы при неверном поле/сумме):

- happy SELL: точные buyer decrement 1000, seller increment 980 (fee 2%), system fee 20, txCreate amount 20.
- partial SELL: buyer decrement 500, seller increment 490, txCreate amount 10.
- EURT SELL: coinBalance decrement 1000 / increment 980 (не balance) — ловит неверное поле.
- fee==0: seller получает полные 1000, txCreate не вызван.

20 tests pass, 84% branches, tsc + eslint clean.
Author
Owner

admin-merge reason: solo-dev (Rule 103.1)
local-review: Agent(code-reviewer) — 0 CRITICAL, 3 HIGH (слабые money-assertions) addressed в 23d7fcd21 (точные buyer/seller/fee суммы, EURT coinBalance поле)
ci-status: дождусь 9/9 green
copilot-review: бот отсутствует на Forgejo → fallback на local code-reviewer
scope: test-only, prod-код не тронут
evidence: GitNexus context executeP2PTrade (execute-trade.ts:23-344) + full suite 9915 passed

admin-merge reason: solo-dev (Rule 103.1) local-review: Agent(code-reviewer) — 0 CRITICAL, 3 HIGH (слабые money-assertions) addressed в 23d7fcd21 (точные buyer/seller/fee суммы, EURT coinBalance поле) ci-status: дождусь 9/9 green copilot-review: бот отсутствует на Forgejo → fallback на local code-reviewer scope: test-only, prod-код не тронут evidence: GitNexus context executeP2PTrade (execute-trade.ts:23-344) + full suite 9915 passed
andrei merged commit 1feafb32e7 into master 2026-06-07 18:05:53 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech!437
No description provided.