diff --git a/tradein-mvp/frontend/src/components/trade-in/__tests__/HeroSummaryCorridorNote.test.tsx b/tradein-mvp/frontend/src/components/trade-in/__tests__/HeroSummaryCorridorNote.test.tsx new file mode 100644 index 00000000..54009c31 --- /dev/null +++ b/tradein-mvp/frontend/src/components/trade-in/__tests__/HeroSummaryCorridorNote.test.tsx @@ -0,0 +1,53 @@ +/** + * #3466 — подпись «цена по дому, коридор её не ограничивает» на корневой /trade-in. + * + * corridorAdvisoryNote проверена сама по себе и через v2 mapResultPanel + * (v2/__tests__/corridorAdvisoryNote.test.ts). Вызов в v1 HeroSummary — отдельный: + * без аргумента estimate.analog_tier функция молча вернёт null при n ≥ порога, + * и vitest этого не видел (ревью #3554, мутация F2). Здесь проверяется то, что + * реально стоит на экране hero. + */ +import { render } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; + +import { HeroSummary } from "../HeroSummary"; +import { FIXTURE_ESTIMATE, FIXTURE_INPUT } from "@/app/ui-preview/estimate/fixture"; +import type { AggregatedEstimate, AnalogTier } from "@/types/trade-in"; + +// Как в thinMarketBadge.test.tsx: бренд и блок прозрачности ходят в сеть. +vi.mock("@/lib/useBrand", () => ({ + useActiveBrandSlug: () => null, + useBrand: () => ({ data: null }), +})); +vi.mock("../HeroTransparency", () => ({ HeroTransparency: () => null })); + +const SAME_BUILDING = + "справочно: цена посчитана по аналогам в этом же доме — коридор её не ограничивает"; + +function heroText(analog_tier: AnalogTier | null): string { + const estimate: AggregatedEstimate = { + ...FIXTURE_ESTIMATE, + analog_tier, + // n=20 ≥ порога: advisory_only=false, подпись может дать только тир. + dkp_corridor: { ...FIXTURE_ESTIMATE.dkp_corridor!, count: 20, advisory_only: false }, + }; + const { container } = render( + {}} />, + ); + return container.textContent ?? ""; +} + +describe("#3466 подпись коридора в v1 HeroSummary", () => { + it("same_building + n=20 → подпись про дом стоит в hero", () => { + const text = heroText("same_building"); + // Коридор отрисован (20 ДКП) и рядом — подпись, а не просто число. + expect(text).toContain("20 сд."); + expect(text).toContain(SAME_BUILDING); + }); + + it("micro_radius + n=20 → подписи нет: коридор цену держит", () => { + const text = heroText("micro_radius"); + expect(text).toContain("20 сд."); + expect(text).not.toContain("коридор её не ограничивает"); + }); +});