Files
UHD_Media_Tool/packages/tasks/test/registry.test.ts
T
rootandClaude Fable 5.1 304feea141 chore(deno): migrate toolchain from Node 24 + pnpm to Deno 2.9.7 + TypeScript 7.0.2 (W1.5)
- root deno.json workspace (nodeModulesDir auto), npm versions registered once in imports, deno.lock;
  remove pnpm-lock/pnpm-workspace/root package.json; members keep minimal package.json (name/type/exports)
- tasks: dev, typecheck (tsc 7.0.2 per member + deno check), lint/fmt (biome, useImportExtensions),
  test (vitest via deno), check:tokens, build (web + deno compile), ci, db:migrate/reset, gen:types
- tsconfig base moved to config/ (no root tsconfig.json); deno types -> types/deno.d.ts; web drops baseUrl
- server: Deno.serve entry with graceful shutdown, --role migrate|preflight|probe, WEB_ROOT static SPA hosting;
  drop @hono/node-server, tsx, esbuild build.mjs
- logger: redact child() bindings and serialize err by message/stack; sync stdout destination; tests
- relative imports get explicit extensions (sites/mp-sync paths left for follow-up)
- crash-recovery tests spawn `deno run -A`; tasks tests use unique per-file schemas
- single-container Dockerfile + entrypoint (migrate -> preflight -> api+worker watchdog), docker-compose.yml
- docs: README, runbook, ADR-001 superseded, plan §1 validation row

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-27 18:53:06 +08:00

50 lines
2.2 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { z } from "zod";
import { createDefaultRegistry, defineTask, redact, TASK_NAMES, TaskRegistry, UnknownTaskError } from "../src/index.ts";
describe("TaskRegistry", () => {
it("注册任务书 §3.1-8 的九个空壳任务", () => {
const reg = createDefaultRegistry();
expect(reg.names()).toEqual([...TASK_NAMES].sort());
for (const n of TASK_NAMES) expect(reg.latest(n).version).toBe(1);
});
it("latest 取最高版本;select 按 name@version / @version 过滤", () => {
const mk = (name: string, version: number) =>
defineTask({ name, version, inputSchema: z.object({}), handler: async () => null });
const reg = new TaskRegistry().register(mk("a", 1), mk("a", 2), mk("b", 1));
expect(reg.latest("a").version).toBe(2);
expect(reg.select(["a@1"]).map((d) => `${d.name}@${d.version}`)).toEqual(["a@1"]);
expect(reg.select(["@1"]).map((d) => `${d.name}@${d.version}`)).toEqual(["a@1", "b@1"]);
expect(reg.select(["a"])).toHaveLength(2);
expect(reg.select()).toHaveLength(3);
expect(() => reg.register(mk("a", 1))).toThrow(/already registered/);
expect(() => reg.latest("zzz")).toThrow(UnknownTaskError);
expect(() => mk("a", 0)).toThrow(/invalid task version/);
});
it("空壳 handler 回显输入", async () => {
const def = createDefaultRegistry().latest("submitDownload");
const input = def.inputSchema.parse({ acquisitionPlanId: "p1" });
const out = await def.handler({ input, logger: { info() {} } } as never);
expect(out).toEqual({ todo: true, task: "submitDownload", input: { acquisitionPlanId: "p1" } });
expect(() => def.inputSchema.parse({})).toThrow();
});
});
describe("redact", () => {
it("敏感键与 URL 凭证参数脱敏", () => {
expect(
redact({
url: "https://pt.example/download.php?id=1&passkey=abcdef123",
nested: { apiKey: "k", password: "p", ok: 1 },
list: ["http://x/rss?sign=zz&x=1"],
}),
).toEqual({
url: "https://pt.example/download.php?id=1&passkey=***",
nested: { apiKey: "***", password: "***", ok: 1 },
list: ["http://x/rss?sign=***&x=1"],
});
});
});