fix(tradein): guard деления на median=0 в ListingsCard/DealsCard (#741) #744

Merged
bot-reviewer merged 1 commit from feat/741-divzero-guards into main 2026-05-30 15:40:02 +00:00
Collaborator

Summary

  • ListingsCard.tsx: CV-рендер обёрнут в guard m > 0 ? ...% : "—" — при median_price_rub<=0 больше нет «Infinity%».
  • DealsCard.tsx: «ниже рынка»-процент обёрнут в guard median_price_rub > 0 ? ... : "—" — нет «NaN%»/«Infinity%». Доп: знак подбирается по diff — ниже если сделки дешевле asking, выше если дороже (Math.abs).
  • Happy-path (median>0) без изменений; guard'ы аддитивны.

Why

При пустой оценке (median_price_rub=0, см. #697/#740) клиент видел «Infinity%»/«NaN%» в client-facing карточках. Milestone Praktika demo 2026-06-01.

Test plan

  • npx tsc --noEmit → 0 ошибок
  • npm run build (next build, incl. ESLint + types) → ✓ Compiled, 10/10 pages
  • grep 'выше рынка' DealsCard.tsx → 1; guard'ы m > 0/median_price_rub > 0 на месте
  • Smoke: пустая оценка → «—» вместо Infinity/NaN (qa)

Refs #741

## Summary - `ListingsCard.tsx`: CV-рендер обёрнут в guard `m > 0 ? ...% : "—"` — при `median_price_rub<=0` больше нет «Infinity%». - `DealsCard.tsx`: «ниже рынка»-процент обёрнут в guard `median_price_rub > 0 ? ... : "—"` — нет «NaN%»/«Infinity%». Доп: знак подбирается по diff — `ниже` если сделки дешевле asking, `выше` если дороже (`Math.abs`). - Happy-path (median>0) без изменений; guard'ы аддитивны. ## Why При пустой оценке (`median_price_rub=0`, см. #697/#740) клиент видел «Infinity%»/«NaN%» в client-facing карточках. Milestone Praktika demo 2026-06-01. ## Test plan - [x] `npx tsc --noEmit` → 0 ошибок - [x] `npm run build` (next build, incl. ESLint + types) → ✓ Compiled, 10/10 pages - [x] `grep 'выше рынка' DealsCard.tsx` → 1; guard'ы `m > 0`/`median_price_rub > 0` на месте - [ ] Smoke: пустая оценка → «—» вместо Infinity/NaN (qa) Refs #741
bot-frontend added 1 commit 2026-05-30 15:37:59 +00:00
При пустой оценке (median_price_rub<=0) CV и «ниже рынка» делились на 0 →
клиент видел «Infinity%»/«NaN%». Обёрнуто в guard m>0 ? ... : «—».
Доп: знак сравнения сделок к рынку — «ниже»/«выше» по знаку diff.

Refs #741
bot-reviewer approved these changes 2026-05-30 15:39:51 +00:00
bot-reviewer left a comment
Collaborator

APPROVE

Div-by-zero guards (Praktika #741, finding #19 того же аудита что #740).

Correctness

  • ListingsCard: CV {m > 0 ? ${…}% : "—"} — guard m<=0, «Infinity%» устранён.
  • DealsCard: median_price_rub > 0 ? на ${Math.abs(…)}% ${diff>=0?"ниже":"выше"} рынка : "—" — guard нуля (нет NaN/Infinity) + правильный знак: сделки дешевле asking (diff>0) → «ниже», дороже (diff<0) → «выше», Math.abs для модуля. Логика проверена — верна.
  • Happy-path (median>0) не изменён; guard'ы аддитивны. tsc 0, build ✓ 10/10.

Scope/security — только 2 frontend-карточки; backend/median-calc не тронуты, нет self-extending триггера, нет secrets. Соответствует контракту issue + DoD («выше рынка» есть, оба guard'а на месте). Smoke → qa.

<!-- gendesign-review-bot: sha=7f46d67 verdict=approve --> ✅ APPROVE Div-by-zero guards (Praktika #741, finding #19 того же аудита что #740). **Correctness** - ListingsCard: `CV {m > 0 ? `${…}%` : "—"}` — guard `m<=0`, «Infinity%» устранён. - DealsCard: `median_price_rub > 0 ? `на ${Math.abs(…)}% ${diff>=0?"ниже":"выше"} рынка` : "—"` — guard нуля (нет NaN/Infinity) + правильный знак: сделки дешевле asking (`diff>0`) → «ниже», дороже (`diff<0`) → «выше», `Math.abs` для модуля. Логика проверена — верна. - Happy-path (median>0) не изменён; guard'ы аддитивны. tsc 0, build ✓ 10/10. **Scope/security** — только 2 frontend-карточки; backend/median-calc не тронуты, нет self-extending триггера, нет secrets. Соответствует контракту issue + DoD («выше рынка» есть, оба guard'а на месте). Smoke → qa.
bot-reviewer merged commit 2390c49d12 into main 2026-05-30 15:40:02 +00:00
bot-reviewer deleted branch feat/741-divzero-guards 2026-05-30 15:40:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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: lekss361/gendesign#744
No description provided.