Bootssymbol hinzugefügt
Test and publish container images / test (push) Successful in 2m20s
Test and publish container images / publish (push) Failing after 4s

This commit is contained in:
BuTzZ
2026-07-26 12:31:49 +02:00
parent c9a20aacd7
commit 55ce94066e
19 changed files with 1969 additions and 122 deletions
+83
View File
@@ -0,0 +1,83 @@
import { afterEach, describe, expect, it } from "vitest";
import type { BoatProfile } from "@watermaps/shared";
import {
BOAT_PROFILE_COOKIE_NAME,
DEFAULT_BOAT_PROFILE,
readBoatProfileCookie,
serializeBoatProfileCookie,
toVesselProfile,
validateBoatProfile,
writeBoatProfileCookie
} from "../src/lib/boat-profile";
afterEach(() => {
document.cookie = `${BOAT_PROFILE_COOKIE_NAME}=; Path=/; Max-Age=0`;
});
describe("boat profile cookie", () => {
it("round-trips a validated Unicode profile", () => {
const profile: BoatProfile = {
...DEFAULT_BOAT_PROFILE,
name: "Möwe ⛵; 50%=gut",
category: "sailboat",
lengthM: 9.4,
airDraftM: 13.2
};
expect(writeBoatProfileCookie(profile)).toBe(true);
expect(readBoatProfileCookie()).toEqual(profile);
});
it("uses a versioned host cookie with safe attributes", () => {
const serialized = serializeBoatProfileCookie(DEFAULT_BOAT_PROFILE, {
secure: true,
updatedAt: "2026-07-26T12:00:00.000Z"
});
expect(serialized).toContain(`${BOAT_PROFILE_COOKIE_NAME}=`);
expect(serialized).toContain("Path=/");
expect(serialized).toContain("Max-Age=31536000");
expect(serialized).toContain("SameSite=Lax");
expect(serialized).toContain("Secure");
expect(serialized).not.toContain("Domain=");
});
it("rejects damaged, unknown-version and out-of-range data", () => {
expect(readBoatProfileCookie(`${BOAT_PROFILE_COOKIE_NAME}=%E0%A4%A`)).toBeNull();
expect(
readBoatProfileCookie(
`${BOAT_PROFILE_COOKIE_NAME}=${encodeURIComponent(JSON.stringify({
v: 2,
updatedAt: new Date().toISOString(),
profile: DEFAULT_BOAT_PROFILE
}))}`
)
).toBeNull();
expect(
validateBoatProfile({ ...DEFAULT_BOAT_PROFILE, draughtM: Number.NaN }).valid
).toBe(false);
expect(
validateBoatProfile({ ...DEFAULT_BOAT_PROFILE, airDraftM: 81 }).valid
).toBe(false);
});
it("maps only routing-relevant fields to the API profile", () => {
const vessel = toVesselProfile({
...DEFAULT_BOAT_PROFILE,
name: "Seestern",
category: "motorboat",
lengthM: 12
});
expect(vessel).toEqual({
draughtM: 1.4,
safetyReserveM: 0.5,
airDraftM: 2.5,
beamM: 3.2,
cruiseSpeedKn: 6
});
expect(vessel).not.toHaveProperty("name");
expect(vessel).not.toHaveProperty("category");
expect(vessel).not.toHaveProperty("lengthM");
});
});