Add serializable project commands
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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<string, unknown> = {};
|
||||
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/
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user