fix(mera): подпись тонкого рынка доезжает до карточки оценочной модели
All checks were successful
CI Trade-In / changes (pull_request) Successful in 13s
CI / changes (pull_request) Successful in 17s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 2m3s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 13s
CI / changes (pull_request) Successful in 17s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 2m3s
Карточка печатает тот же recommended_price, что и hero, но берёт его из своего endpoint и подписи не имела — рядом с итогом стояла неподписанная копия величины, исключённой из расчёта (ровно то, что #3339 чинил в hero). Проп note + проброс thinMarketNote(estimate.avito_imv) со страницы; подпись тем же классом .bench-chip__sub, ему же дан max-width, чтобы длинная строка не растягивала чип. Тест падает при снятии рендера подписи (проверено: 1 failed / 5 passed).
This commit is contained in:
parent
5356d564e6
commit
d953899d92
4 changed files with 43 additions and 3 deletions
|
|
@ -16,7 +16,7 @@ import { HTTPError } from "@/lib/api";
|
|||
import { EstimateForm } from "@/components/trade-in/EstimateForm";
|
||||
import { Topbar } from "@/components/trade-in/Topbar";
|
||||
import { SourcesProgress } from "@/components/trade-in/SourcesProgress";
|
||||
import { HeroSummary } from "@/components/trade-in/HeroSummary";
|
||||
import { HeroSummary, thinMarketNote } from "@/components/trade-in/HeroSummary";
|
||||
import { IMVBenchmark } from "@/components/trade-in/IMVBenchmark";
|
||||
import { CianValuationCard } from "@/components/trade-in/CianValuationCard";
|
||||
import { HouseInfoCard } from "@/components/trade-in/HouseInfoCard";
|
||||
|
|
@ -276,6 +276,7 @@ export default function TradeInPage() {
|
|||
<IMVBenchmark
|
||||
benchmark={imvBenchmark.data}
|
||||
isLoading={imvBenchmark.isPending}
|
||||
note={thinMarketNote(resultData.estimate.avito_imv)}
|
||||
/>
|
||||
<CianValuationCard data={resultData.estimate.cian_valuation} />
|
||||
<HouseInfoCard
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@ import { sourcePublicLabel } from "@/lib/source-registry";
|
|||
interface Props {
|
||||
benchmark: IMVBenchmarkResponse | undefined;
|
||||
isLoading: boolean;
|
||||
/**
|
||||
* #3339 — подпись «тонкого рынка» от thinMarketNote(). Это же число стоит в
|
||||
* hero, и там оно уже подписано; здесь оно печатается второй раз, поэтому
|
||||
* подпись обязана доехать и сюда — иначе рядом с итогом остаётся неподписанная
|
||||
* копия величины, исключённой из расчёта.
|
||||
*/
|
||||
note?: string | null;
|
||||
}
|
||||
|
||||
const SRC_LABEL = sourcePublicLabel("avito_imv");
|
||||
|
|
@ -16,7 +23,7 @@ function formatRub(n: number | null | undefined): string {
|
|||
return new Intl.NumberFormat("ru-RU").format(n) + " ₽";
|
||||
}
|
||||
|
||||
export function IMVBenchmark({ benchmark, isLoading }: Props) {
|
||||
export function IMVBenchmark({ benchmark, isLoading, note }: Props) {
|
||||
if (isLoading) {
|
||||
return (
|
||||
<div className="imv-benchmark imv-benchmark--loading">
|
||||
|
|
@ -59,6 +66,7 @@ export function IMVBenchmark({ benchmark, isLoading }: Props) {
|
|||
<div className="imv-benchmark__metric-value">
|
||||
{formatRub(recommended_price)}
|
||||
</div>
|
||||
{note && <div className="bench-chip__sub">{note}</div>}
|
||||
</div>
|
||||
<div className="imv-benchmark__metric">
|
||||
<div className="imv-benchmark__metric-label">Диапазон</div>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,12 @@ import { render, screen } from "@testing-library/react";
|
|||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { HeroSummary, thinMarketNote } from "../HeroSummary";
|
||||
import { FIXTURE_ESTIMATE, FIXTURE_INPUT } from "@/app/ui-preview/estimate/fixture";
|
||||
import { IMVBenchmark } from "../IMVBenchmark";
|
||||
import {
|
||||
FIXTURE_ESTIMATE,
|
||||
FIXTURE_IMV,
|
||||
FIXTURE_INPUT,
|
||||
} from "@/app/ui-preview/estimate/fixture";
|
||||
import type { AggregatedEstimate, AvitoImvSummary } from "@/types/trade-in";
|
||||
|
||||
// Бренд и блок прозрачности ходят в сеть (TanStack Query) — к подписи отношения
|
||||
|
|
@ -81,3 +86,28 @@ describe("thin_market — подпись у числа оценочной мод
|
|||
);
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* То же число печатается второй раз в отдельной карточке под hero. Подпись в
|
||||
* hero её не покрывает: у карточки свой источник данных (imv-benchmark endpoint),
|
||||
* и без проброса note рядом с итогом остаётся неподписанная копия величины.
|
||||
*/
|
||||
describe("IMVBenchmark — подпись доезжает до второго места с тем же числом", () => {
|
||||
const NOTE = "рынок из 3 объявлений — в расчёт не входит";
|
||||
|
||||
it("note передан → подпись стоит под числом", () => {
|
||||
const { container } = render(
|
||||
<IMVBenchmark benchmark={FIXTURE_IMV} isLoading={false} note={NOTE} />,
|
||||
);
|
||||
|
||||
expect(container.textContent).toContain(NOTE);
|
||||
});
|
||||
|
||||
it("note не передан (рынок не тонкий) → подписи нет", () => {
|
||||
const { container } = render(
|
||||
<IMVBenchmark benchmark={FIXTURE_IMV} isLoading={false} />,
|
||||
);
|
||||
|
||||
expect(container.textContent).not.toContain("в расчёт не входит");
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -846,6 +846,7 @@
|
|||
.bench-chip__sub {
|
||||
font-size: 10px;
|
||||
color: var(--muted);
|
||||
max-width: 240px;
|
||||
}
|
||||
|
||||
/* ── empty-state headline (без данных) ── */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue