refactor: 引入 Checker 统一接口与 Runner 抽象机制
定义 Checker 接口(resolve/execute/serialize)和 CheckerRegistry 注册中心,消除 engine/config-loader/store 中硬编码类型分支。 按 checker 类型分子包(runner/http/、runner/command/),提取 共享 expect 到 runner/shared/。超时控制通过引擎注入 AbortSignal。 CheckFailure.phase 从联合类型改为 string。配置校验下沉到各 Checker.resolve() 内部。 新增 checker-runner-abstraction spec,更新 DEVELOPMENT.md。
This commit is contained in:
45
tests/server/checker/runner/shared/text.test.ts
Normal file
45
tests/server/checker/runner/shared/text.test.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { checkTextRules } from "../../../../../src/server/checker/runner/shared/text";
|
||||
|
||||
describe("checkTextRules", () => {
|
||||
test("无规则返回匹配成功", () => {
|
||||
const r = checkTextRules("hello", [], "stdout");
|
||||
expect(r.matched).toBe(true);
|
||||
expect(r.failure).toBeNull();
|
||||
});
|
||||
|
||||
test("单条 contains 规则匹配成功", () => {
|
||||
const r = checkTextRules("build completed successfully", [{ contains: "completed" }], "stdout");
|
||||
expect(r.matched).toBe(true);
|
||||
});
|
||||
|
||||
test("单条 contains 规则匹配失败", () => {
|
||||
const r = checkTextRules("build completed successfully", [{ contains: "failed" }], "stdout");
|
||||
expect(r.matched).toBe(false);
|
||||
expect(r.failure!.phase).toBe("stdout");
|
||||
expect(r.failure!.path).toBe("stdout[0]");
|
||||
});
|
||||
|
||||
test("多条规则全部通过", () => {
|
||||
const r = checkTextRules("version: 3.2.1, build: ok", [{ contains: "version" }, { match: "\\d+\\.\\d+\\.\\d+" }], "stdout");
|
||||
expect(r.matched).toBe(true);
|
||||
});
|
||||
|
||||
test("第一条规则失败立即返回", () => {
|
||||
const r = checkTextRules("error occurred", [{ contains: "success" }, { contains: "error" }], "stdout");
|
||||
expect(r.matched).toBe(false);
|
||||
expect(r.failure!.phase).toBe("stdout");
|
||||
expect(r.failure!.path).toBe("stdout[0]");
|
||||
});
|
||||
|
||||
test("stderr phase", () => {
|
||||
const r = checkTextRules("warning: deprecated", [{ contains: "warning" }], "stderr");
|
||||
expect(r.matched).toBe(true);
|
||||
expect(r.failure).toBeNull();
|
||||
});
|
||||
|
||||
test("empty 操作符", () => {
|
||||
const r = checkTextRules("", [{ empty: true }], "stderr");
|
||||
expect(r.matched).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user