返回 DeepSeek-Reasonix
contract.test.ts
根目录 / desktop / electron / src / main / contract.test.ts
1 import assert from "node:assert/strict";
2 import { test } from "node:test";
3 import { emptyContract, isAllowedCommand, parseContract } from "./contract.js";
4
5 test("parseContract accepts the command list in the shapes the generator may emit", () => {
6 const fromStrings = parseContract({ digest: "sha256:a", commands: ["OpenProjectTab", "Submit"] });
7 const fromObjects = parseContract({ digest: "sha256:a", protocolVersion: 1, commands: [{ name: "OpenProjectTab" }, { name: "Submit" }] });
8 const fromRecord = parseContract({ digest: "sha256:a", commands: { OpenProjectTab: {}, Submit: {} } });
9 for (const contract of [fromStrings, fromObjects, fromRecord]) {
10 assert.deepEqual([...contract.commands], ["OpenProjectTab", "Submit"]);
11 assert.equal(contract.digest, "sha256:a");
12 assert.equal(contract.protocolVersion, 1);
13 }
14 });
15
16 test("parseContract rejects a contract without a digest or without commands", () => {
17 assert.throws(() => parseContract({ commands: ["A"] }), /digest/);
18 assert.throws(() => parseContract({ digest: "sha256:a", commands: [] }), /no commands/);
19 assert.throws(() => parseContract(null), /object/);
20 });
21
22 test("the allowlist admits exact command names only", () => {
23 const contract = parseContract({ digest: "sha256:a", commands: ["OpenProjectTab"] });
24 assert.equal(isAllowedCommand(contract, "OpenProjectTab"), true);
25 assert.equal(isAllowedCommand(contract, "openprojecttab"), false);
26 assert.equal(isAllowedCommand(contract, ""), false);
27 assert.equal(isAllowedCommand(contract, "__proto__"), false);
28 assert.equal(isAllowedCommand(contract, "constructor"), false);
29 assert.equal(isAllowedCommand(contract, "toString"), false);
30 assert.equal(isAllowedCommand(contract, 42), false);
31 assert.equal(isAllowedCommand(emptyContract(), "OpenProjectTab"), false);
32 });
33
33 lines TYPESCRIPT