import "@testing-library/jest-dom/vitest"; import { cleanup, render, screen } from "@testing-library/react"; import { afterEach, describe, expect, it } from "vitest"; import type { MarineForecast, RouteGuidanceResult } from "@watermaps/shared"; import { StatusBar } from "../src/components/StatusBar"; import type { GpsState } from "../src/hooks/useGeolocation"; afterEach(cleanup); const idleGps: GpsState = { status: "idle", position: null, accuracyM: null, speedKn: null, courseDeg: null, timestampMs: null, message: null }; describe("StatusBar", () => { it("always includes GPS speed in planning mode without claiming that a route is safe", () => { const forecast = { windSpeed: 12, waveHeightM: 0.8 } as MarineForecast; const { container } = render( ); expect(container.querySelectorAll(".status-item")).toHaveLength(4); expect(screen.getByText("12 kn · 0.8 m")).toBeVisible(); expect(screen.getByText("-- km/h · -- kn")).toBeVisible(); expect(screen.queryByText("Route OK")).not.toBeInTheDocument(); }); it("prioritizes course, cross-track error and open warnings during guidance", () => { const guidance = { desiredCourseDeg: 87, distanceToRouteM: 24, crossTrackSide: "starboard" } as RouteGuidanceResult; render( ); expect(screen.getByText("087°T")).toBeVisible(); expect(screen.getByText("24 m Stb")).toBeVisible(); expect(screen.getByText("2 offen")).toBeVisible(); expect(screen.getByText("11,5 km/h · 6,2 kn")).toBeVisible(); }); it("shows anchor drift, GPS and the expected tide rise in anchor mode", () => { render( ); expect(screen.getByText("12 / 40 m")).toBeVisible(); expect(screen.getByText("±5 m")).toBeVisible(); expect(screen.getByText("+1.3 m")).toBeVisible(); expect(screen.getByText("-- km/h · -- kn")).toBeVisible(); }); });