| 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 |