Files
leistungsbilanz-ts/tests/circuit-section-reorder-command.test.ts
2026-07-25 21:22:10 +02:00

191 lines
4.8 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import {
createCircuitSectionsReorderProjectCommand,
} from "../src/domain/models/circuit-sections-reorder-project-command.model.js";
import {
buildCircuitSectionReorderAssignments,
} from "../src/frontend/utils/circuit-section-reorder-command.js";
import {
reorderCircuitSectionCommand,
reorderCircuitSectionsCommand,
} from "../src/frontend/utils/api.js";
import type { CircuitTreeCircuitDto } from "../src/frontend/types.js";
function circuit(
id: string,
sortOrder: number
): CircuitTreeCircuitDto {
return {
id,
circuitListId: "list-1",
sectionId: "section-1",
equipmentIdentifier: id,
sortOrder,
isReserve: true,
circuitTotalPower: 0,
deviceRows: [],
};
}
describe("circuit section reorder command adapters", () => {
it("builds complete exact assignments for a requested order", () => {
const circuits = [
circuit("circuit-1", 10),
circuit("circuit-2", 20),
circuit("circuit-3", 30),
];
assert.deepEqual(
buildCircuitSectionReorderAssignments(circuits, [
"circuit-3",
"circuit-1",
"circuit-2",
]),
[
{
circuitId: "circuit-3",
expectedSortOrder: 30,
targetSortOrder: 10,
},
{
circuitId: "circuit-1",
expectedSortOrder: 10,
targetSortOrder: 20,
},
{
circuitId: "circuit-2",
expectedSortOrder: 20,
targetSortOrder: 30,
},
]
);
});
it("omits unchanged orders and rejects incomplete orders", () => {
const circuits = [
circuit("circuit-1", 10),
circuit("circuit-2", 20),
];
assert.deepEqual(
buildCircuitSectionReorderAssignments(circuits, [
"circuit-1",
"circuit-2",
]),
[]
);
assert.throws(
() =>
buildCircuitSectionReorderAssignments(circuits, [
"circuit-1",
]),
/jeden Stromkreis/
);
});
it("validates atomic multi-section reorder envelopes", () => {
const assignments = [
{
circuitId: "circuit-1",
expectedSortOrder: 10,
targetSortOrder: 20,
},
{
circuitId: "circuit-2",
expectedSortOrder: 20,
targetSortOrder: 10,
},
];
const command = createCircuitSectionsReorderProjectCommand([
{ sectionId: "section-1", assignments },
{
sectionId: "section-2",
assignments: assignments.map((assignment) => ({
...assignment,
circuitId: `${assignment.circuitId}-other`,
})),
},
]);
assert.equal(command.type, "circuit.reorder-sections");
assert.throws(
() =>
createCircuitSectionsReorderProjectCommand([
{ sectionId: "section-1", assignments },
{ sectionId: "section-1", assignments },
]),
/duplicate section ids/
);
});
it("sends single and multi-section commands through project history", async () => {
const requests: Array<Record<string, unknown>> = [];
const originalFetch = globalThis.fetch;
globalThis.fetch = async (_input, init) => {
requests.push(
JSON.parse(String(init?.body)) as Record<string, unknown>
);
return new Response(
JSON.stringify({
revision: {
revisionId: "revision-1",
changeSetId: "change-1",
projectId: "project-1",
revisionNumber: requests.length,
createdAtIso: "2026-07-25T00:00:00.000Z",
},
history: {
projectId: "project-1",
currentRevision: requests.length,
undoDepth: requests.length,
redoDepth: 0,
undoChangeSetId: "change-1",
redoChangeSetId: null,
},
}),
{ status: 200, headers: { "Content-Type": "application/json" } }
);
};
const assignments = [
{
circuitId: "circuit-1",
expectedSortOrder: 10,
targetSortOrder: 20,
},
{
circuitId: "circuit-2",
expectedSortOrder: 20,
targetSortOrder: 10,
},
];
try {
await reorderCircuitSectionCommand(
"project-1",
0,
"section-1",
assignments,
"single"
);
await reorderCircuitSectionsCommand(
"project-1",
1,
[{ sectionId: "section-1", assignments }],
"multiple"
);
} finally {
globalThis.fetch = originalFetch;
}
assert.deepEqual(
requests.map((request) => {
const command = request.command as { type: string };
return [request.expectedRevision, command.type];
}),
[
[0, "circuit.reorder-section"],
[1, "circuit.reorder-sections"],
]
);
});
});