radroots_sdk_artifact.test.mjs (1452B)
1 import assert from "node:assert/strict"; 2 import { mkdtempSync, mkdirSync, symlinkSync, writeFileSync } from "node:fs"; 3 import { tmpdir } from "node:os"; 4 import { join } from "node:path"; 5 import test from "node:test"; 6 7 import { 8 ARTIFACT_ROUTES, 9 artifactRoute, 10 resolveCanonicalSourceRoot, 11 validateConsumerRoot, 12 } from "./radroots_sdk_artifact_lib.mjs"; 13 14 test("consumer marker fails closed", () => { 15 const root = mkdtempSync(join(tmpdir(), "radroots-sdk-consumer-")); 16 writeFileSync(join(root, ".radroots-consumer-root"), "mobile\n"); 17 assert.throws(() => validateConsumerRoot(root), /exactly sdk/); 18 }); 19 20 test("source root rejects relative and symlink paths", () => { 21 const root = mkdtempSync(join(tmpdir(), "radroots-sdk-source-")); 22 const source = join(root, "source"); 23 const link = join(root, "source-link"); 24 mkdirSync(source); 25 symlinkSync(source, link); 26 assert.throws(() => resolveCanonicalSourceRoot("relative"), /absolute/); 27 assert.throws(() => resolveCanonicalSourceRoot(link), /real directory/); 28 }); 29 30 test("artifact routes own fixed safe outputs", () => { 31 assert.deepEqual(Object.keys(ARTIFACT_ROUTES), [ 32 "typescript", 33 "wasm", 34 "swift", 35 "kotlin", 36 ]); 37 for (const route of Object.values(ARTIFACT_ROUTES)) { 38 assert.match(route.output, /^contracts\/provenance\/sdk\/[a-z]+\.json$/); 39 assert.ok(!route.output.includes("..")); 40 } 41 assert.throws(() => artifactRoute("../swift"), /unsupported/); 42 });