import { render, screen, waitFor } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { MiniMap } from "../MiniMap"; import type { ParcelAnalyzeResponse } from "@/lib/site-finder-api"; // Stub SiteMap so we can assert the props MiniMap passes through (mapHeight // in particular — #1218: ранее MiniMap клипал layer-панель/легенду через // `overflow: hidden + height: 320`; теперь высота карты задаётся через prop). // Stub does NOT use `unknown` — we capture a typed snapshot of the relevant // props (mapHeight) for the assertion. interface CapturedProps { mapHeight?: number; } const captured: { last: CapturedProps | null } = { last: null }; vi.mock("@/components/site-finder/SiteMap", () => ({ SiteMap: (props: CapturedProps) => { captured.last = { mapHeight: props.mapHeight }; return
map(h={props.mapHeight ?? "?"})
; }, })); // Minimal ParcelAnalyzeResponse — only fields MiniMap touches (toSiteMapData). const FIXTURE: ParcelAnalyzeResponse = { cad_num: "66:41:0000000:1", source: "cad_building", geom_geojson: null, district: null, score: 0, score_breakdown: {}, poi_count: 0, competitors: [], pipeline_24mo: null, nspd_risk_zones: [], nspd_opportunity_parcels: [], nspd_red_lines: [], }; describe("MiniMap (#1218)", () => { it("passes mapHeight=280 to SiteMap (compact tile, controls flow below)", async () => { render(); // SiteMap is dynamically imported (ssr:false) — wait until our stub renders. await waitFor(() => expect(screen.getByTestId("sitemap-stub")).toBeInTheDocument(), ); expect(captured.last?.mapHeight).toBe(280); }); it("wrapper does NOT clip overflow — layer controls must remain visible", async () => { const { container } = render(); await waitFor(() => expect(screen.getByTestId("sitemap-stub")).toBeInTheDocument(), ); // The outer wrapper is the first element child — SiteMap stub lives inside. const wrapper = container.firstElementChild as HTMLElement | null; expect(wrapper).not.toBeNull(); // No fixed height (must be empty so flow children — legend + control panel — // are not clipped to 320px), and no overflow: hidden. expect(wrapper?.style.height).toBe(""); expect(wrapper?.style.overflow).toBe(""); // Width constraint preserved (column slot is 400px in Section 1 grid). expect(wrapper?.style.maxWidth).toBe("400px"); }); });