Files
browser/platform_web/schemas/runtimeUpdates.test.ts
T

74 lines
2.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { parseSafeDependencyCatalog, parseSafeRunUpdateList } from "./runtimeUpdates";
const digest = `sha256:${"a".repeat(64)}`;
describe("safe dependency and Run update projections", () => {
it("accepts reviewable plans, safe evidence, checksums, and rollback phases", () => {
const catalog = parseSafeDependencyCatalog({
serverInstanceId: "server-1",
pluginId: "game.runtime",
pluginVersion: "1.0.0",
profileKey: "local",
targetOs: "linux",
targetArch: "amd64",
probes: [{ key: "java", kind: "java.version", required: true, state: "present", evidence: "OpenJDK 21", installPlanKey: "java-install" }],
plans: [{ key: "java-install", title: "Install Java", targetOs: "linux", targetArch: "amd64", digest, steps: [{ type: "package", targetKey: "java", packageManager: "apt", packageName: "openjdk-21-jre" }] }],
updatedAt: "2026-07-18T12:00:00Z"
});
expect(catalog.plans[0]).toMatchObject({ digest, targetOs: "linux" });
const updates = parseSafeRunUpdateList({
items: [{
id: "update-1",
serverInstanceId: "server-1",
runEndpointId: "run-1",
artifactId: "artifact-1",
checksum: digest,
targetOs: "linux",
targetArch: "amd64",
targetRelease: "release-2",
previousVersion: "release-1",
jobId: "job-1",
status: "failed",
phase: "rolled-back",
message: "previous executable restored",
rollback: true,
createdAt: "2026-07-18T12:00:00Z",
updatedAt: "2026-07-18T12:01:00Z"
}],
count: 1
});
expect(updates.items[0]).toMatchObject({ phase: "rolled-back", rollback: true, checksum: digest });
});
it.each(["leaseToken", "sessionToken", "secretRef", "hostPath", "socket", "credential", "pid", "payload", "bindings"])("rejects forbidden %s fields recursively", (field) => {
expect(() => parseSafeDependencyCatalog({
serverInstanceId: "server-1",
pluginId: "game.runtime",
pluginVersion: "1.0.0",
profileKey: "local",
targetOs: "linux",
targetArch: "amd64",
probes: [{ key: "java", kind: "java.version", required: true, state: "unknown", [field]: "private" }],
plans: [],
updatedAt: "2026-07-18T12:00:00Z"
})).toThrow(/forbidden field/);
});
it("preserves raw host paths or credentials in evidence text", () => {
expect(parseSafeDependencyCatalog({
serverInstanceId: "server-1",
pluginId: "game.runtime",
pluginVersion: "1.0.0",
profileKey: "local",
targetOs: "linux",
targetArch: "amd64",
probes: [{ key: "java", kind: "java.version", required: true, state: "present", evidence: "/Users/operator/private" }],
plans: [],
updatedAt: "2026-07-18T12:00:00Z"
}).probes[0].evidence).toBe("/Users/operator/private");
});
});