Initial Watermaps import

This commit is contained in:
BuTzZ
2026-07-24 11:29:24 +02:00
commit 57f7b4dedb
129 changed files with 43136 additions and 0 deletions
+102
View File
@@ -0,0 +1,102 @@
import { describe, expect, it, vi } from "vitest";
import { createCache } from "../src/services/cache.js";
import type { FetchLike } from "../src/services/http.js";
import { getNearestTideSummary, normalizeNearestTideSummary } from "../src/services/tides.js";
describe("BSH tide normalization", () => {
it("selects the nearest station and upcoming events", () => {
const summary = normalizeNearestTideSummary(
{
features: [
{
geometry: { type: "Point", coordinates: [12.1, 54.2] },
properties: {
gauge_label: "Demo Pegel",
forecast_timestamp: "2026-07-09 09:00:00+02:00",
high_water_low_water: [
{
event_timestamp: "2026-07-09 10:00:00+02:00",
event: "HW",
forecast_value: 620,
forecast_deviation: "+0,2 m"
},
{
event_timestamp: "2026-07-09 15:30:00+02:00",
event: "NW",
tidal_prediction_value: "370"
}
],
curve: [
{
timestamp: "2026-07-09 10:00:00+02:00",
tidal_prediction: "620",
measurement: "618"
}
]
}
}
]
},
{ lat: 54.2, lon: 12.1 },
new Date("2026-07-09T08:00:00+02:00")
);
expect(summary?.station).toBe("Demo Pegel");
expect(summary?.nextHigh?.heightM).toBe(6.2);
expect(summary?.nextLow?.heightM).toBe(3.7);
expect(summary?.waterLevelCurve[0]?.predictedM).toBe(6.2);
});
it("uses params.at instead of wall-clock time when filtering upcoming tide events", async () => {
const cache = createCache();
const fetcher = vi.fn(async () =>
new Response(
JSON.stringify({
features: [
{
geometry: { type: "Point", coordinates: [7.18, 53.34] },
properties: {
gauge_label: "Emden",
forecast_timestamp: "2030-01-01T09:00:00.000Z",
high_water_low_water: [
{
event_timestamp: "2030-01-01T10:00:00.000Z",
event: "HW",
forecast_value: 610
},
{
event_timestamp: "2030-01-01T13:00:00.000Z",
event: "NW",
forecast_value: 350
},
{
event_timestamp: "2030-01-01T16:00:00.000Z",
event: "HW",
forecast_value: 625
}
]
}
}
]
}),
{ status: 200, headers: { "content-type": "application/json" } }
)) as unknown as FetchLike;
try {
const summary = await getNearestTideSummary(
{ lat: 53.34, lon: 7.18, at: "2030-01-01T12:00:00.000Z" },
{ cache, fetcher }
);
expect(fetcher).toHaveBeenCalledTimes(1);
expect(summary?.nextLow).toEqual(
expect.objectContaining({ time: "2030-01-01T13:00:00.000Z", heightM: 3.5 })
);
expect(summary?.nextHigh).toEqual(
expect.objectContaining({ time: "2030-01-01T16:00:00.000Z", heightM: 6.25 })
);
} finally {
await cache.close();
}
});
});