Files
watermaps/apps/web/tests/status-bar.test.tsx
BuTzZ 2e84f4eae4
Test and publish container images / test (push) Successful in 2m25s
Test and publish container images / publish (push) Failing after 4s
GPS Geschwindigkeitsanzeige
2026-07-28 16:39:35 +02:00

90 lines
2.6 KiB
TypeScript

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(
<StatusBar
gps={idleGps}
forecast={forecast}
tide={null}
routeWarningCount={0}
mode="planning"
/>
);
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(
<StatusBar
gps={{ ...idleGps, status: "tracking", speedKn: 6.2 }}
forecast={null}
tide={null}
routeWarningCount={2}
mode="guidance"
guidance={guidance}
/>
);
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(
<StatusBar
gps={{ ...idleGps, status: "tracking", position: { lat: 53.2, lon: 7.1 }, accuracyM: 5 }}
forecast={null}
tide={null}
routeWarningCount={0}
mode="anchor"
anchor={{
distanceFromAnchorM: 11.5,
alarmRadiusM: 40,
alarm: false,
maximumTideRiseM: 1.3
}}
/>
);
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();
});
});