Bootssymbol hinzugefügt
This commit is contained in:
@@ -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");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user