forked from jappel/leistungsbilanz-ts
Integrate print view and document branding
This commit is contained in:
commit
4643c8d11a
59 changed files with 8852 additions and 75 deletions
|
|
@ -377,12 +377,75 @@ describe("project snapshot repository", () => {
|
|||
context.close();
|
||||
}
|
||||
});
|
||||
|
||||
it("restores snapshots stored with an older supported schema version", () => {
|
||||
const context = createTestDatabase();
|
||||
try {
|
||||
const repository = new ProjectSnapshotRepository(context.db);
|
||||
const snapshot = repository.createNamed({
|
||||
projectId: "project-1",
|
||||
expectedRevision: 0,
|
||||
name: "Vor dem Update",
|
||||
});
|
||||
assert.ok(snapshot);
|
||||
// Rewrite the stored payload into the previous (version 5) shape, as it
|
||||
// exists for snapshots created before the current version.
|
||||
const payload = JSON.parse(
|
||||
context.db
|
||||
.select({ payloadJson: projectSnapshots.payloadJson })
|
||||
.from(projectSnapshots)
|
||||
.where(eq(projectSnapshots.id, snapshot.id))
|
||||
.get()!.payloadJson
|
||||
) as {
|
||||
schemaVersion: number;
|
||||
project: Record<string, unknown>;
|
||||
distributionBoards: Array<Record<string, unknown>>;
|
||||
};
|
||||
payload.schemaVersion = 5;
|
||||
for (const field of ["siteAddress", "workStage", "projectLead", "projectEditor"]) {
|
||||
delete payload.project[field];
|
||||
}
|
||||
for (const board of payload.distributionBoards) {
|
||||
for (const field of ["boardNumber", "location", "fedFrom", "remark"]) {
|
||||
delete board[field];
|
||||
}
|
||||
}
|
||||
const payloadJson = JSON.stringify(payload);
|
||||
context.db
|
||||
.update(projectSnapshots)
|
||||
.set({
|
||||
schemaVersion: 5,
|
||||
payloadJson,
|
||||
payloadSha256: crypto
|
||||
.createHash("sha256")
|
||||
.update(payloadJson)
|
||||
.digest("hex"),
|
||||
})
|
||||
.where(eq(projectSnapshots.id, snapshot.id))
|
||||
.run();
|
||||
|
||||
const prepared = repository.prepareRestore("project-1", snapshot.id);
|
||||
assert.ok(prepared);
|
||||
const targetState = prepared.command.payload.targetState;
|
||||
assert.equal(targetState.schemaVersion, projectStateSnapshotSchemaVersion);
|
||||
assert.ok(targetState.distributionBoards.length > 0);
|
||||
assert.ok(
|
||||
targetState.distributionBoards.every(
|
||||
(board) => board.boardNumber === null && board.fedFrom === null
|
||||
)
|
||||
);
|
||||
} finally {
|
||||
context.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("portable project transfer", () => {
|
||||
it("exports and atomically duplicates a complete project with new ids", () => {
|
||||
const context = createTestDatabase();
|
||||
try {
|
||||
context.db.update(projects).set({ siteAddress: "Musterstraße 1", workStage: "LPH 5", projectLead: "Planung", projectEditor: "Test" }).where(eq(projects.id, "project-1")).run();
|
||||
context.db.update(distributionBoards).set({ boardNumber: "UV-01", location: "Technik", fedFrom: "HAK", remark: "Prüfstand" }).where(eq(distributionBoards.projectId, "project-1")).run();
|
||||
const repository = new ProjectTransferRepository(context.db);
|
||||
const transfer = repository.exportProject("project-1");
|
||||
assert.ok(transfer);
|
||||
|
|
@ -398,6 +461,13 @@ describe("portable project transfer", () => {
|
|||
assert.ok(source);
|
||||
assert.ok(copied);
|
||||
assert.equal(copied.currentRevision, 0);
|
||||
assert.equal(copied.state.project.siteAddress, source.state.project.siteAddress);
|
||||
assert.equal(copied.state.project.workStage, "LPH 5");
|
||||
assert.equal(copied.state.project.projectLead, "Planung");
|
||||
assert.equal(copied.state.project.projectEditor, "Test");
|
||||
for (const field of ["boardNumber", "location", "fedFrom", "remark"] as const) {
|
||||
assert.equal(copied.state.distributionBoards[0][field], source.state.distributionBoards[0][field]);
|
||||
}
|
||||
assert.equal(copied.state.circuits.length, source.state.circuits.length);
|
||||
assert.notEqual(
|
||||
copied.state.circuits[0].id,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue