87 lines
2.4 KiB
TypeScript
87 lines
2.4 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("shows only three planning values 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(3);
|
|
expect(screen.getByText("12 kn · 0.8 m")).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();
|
|
});
|
|
|
|
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();
|
|
});
|
|
});
|