import { render } from "@testing-library/react"; import type { ReactNode } from "react"; import { describe, expect, it, vi } from "vitest"; import LocationPicker from "@/components/map/LocationPicker"; const setView = vi.fn(); const zoomIn = vi.fn(); const zoomOut = vi.fn(); const eventMap = { setView }; const controlMap = { zoomIn, zoomOut }; vi.mock("leaflet", () => { class LatLng { lat: number; lng: number; constructor(lat: number, lng: number) { this.lat = lat; this.lng = lng; } } class Control { addTo() { return this; } remove() {} } return { default: { Control, DomUtil: { create: () => ({ style: {} }), }, DomEvent: { disableClickPropagation: () => {}, disableScrollPropagation: () => {}, }, }, LatLng, }; }); vi.mock("react-leaflet", () => ({ MapContainer: ({ children, attributionControl }: { children: ReactNode; attributionControl?: boolean }) => (
{children}
), Marker: ({ position, interactive, keyboard }: { position: { lat: number; lng: number }; interactive?: boolean; keyboard?: boolean }) => (
{`${position.lat},${position.lng}`}
), useMap: () => controlMap, useMapEvents: () => eventMap, })); vi.mock("@/components/map/map-utils", () => ({ defaultMarkerIcon: {}, MinimalAttributionControl: () =>
, OpenStreetMapTileLayer: () =>
, })); describe("LocationPicker", () => { it("uses the explicit minimal attribution control", () => { const { getByTestId } = render(); expect(getByTestId("map")).toHaveAttribute("data-attribution-control", "false"); expect(getByTestId("attribution")).toBeInTheDocument(); expect(getByTestId("map-layer")).toBeInTheDocument(); }); it("does not recenter when rerendered with the same coordinates", () => { const { rerender } = render(); expect(setView).toHaveBeenCalledTimes(1); rerender(); expect(setView).toHaveBeenCalledTimes(1); rerender(); expect(setView).toHaveBeenCalledTimes(2); }); it("does not show a fake marker at the default map center", () => { const { queryByTestId, rerender, getByTestId } = render(); expect(queryByTestId("marker")).not.toBeInTheDocument(); rerender(); expect(getByTestId("marker")).toHaveTextContent("1,2"); expect(getByTestId("marker")).toHaveAttribute("data-interactive", "false"); expect(getByTestId("marker")).toHaveAttribute("data-keyboard", "false"); }); });