import assert from "node:assert/strict"; import { describe, it } from "node:test"; import { deserializeProjectCommand, serializeProjectCommand, type SerializedProjectCommand, } from "../src/domain/models/project-command.model.js"; describe("serialized project commands", () => { it("round-trips a versioned command envelope", () => { const command: SerializedProjectCommand = { schemaVersion: 1, type: "circuit.update", payload: { circuitId: "circuit-1", changes: { displayName: "Werkstatt", protectionRatedCurrent: 16, isReserve: false, remark: null, }, }, }; assert.deepEqual( deserializeProjectCommand(serializeProjectCommand(command)), command ); }); it("rejects values that JSON would lose or silently change", () => { const invalidPayloads: unknown[] = [ { value: undefined }, { value: Number.NaN }, { value: Number.POSITIVE_INFINITY }, { value: new Date() }, ]; for (const payload of invalidPayloads) { assert.throws(() => serializeProjectCommand({ schemaVersion: 1, type: "test.invalid", payload: payload as never, }) ); } }); it("rejects cyclic payloads before persistence", () => { const payload: Record = {}; payload.self = payload; assert.throws( () => serializeProjectCommand({ schemaVersion: 1, type: "test.cyclic", payload: payload as never, }), /must not contain cycles/ ); }); it("rejects malformed serialized envelopes", () => { assert.throws( () => deserializeProjectCommand( JSON.stringify({ schemaVersion: 0, type: "", payload: null }) ), /schema version/ ); }); });