- 迁移 examples/rules/ 到 src/rules/,resources/devices.json 到 src/devices.json
- 迁移 resources/fetch-devlist.js 到 src/tools/fetch-devlist.ts 并改造为 ESM
- CLI 简化为零参数:bun run pack 自动编译并输出 dist/miot_{timestamp}.bak
- 移除备份合并能力:删除 mergeCompiledRules、RuleReplaceStrategy、dry-run、replace 参数
- 编译器简化为从零生成,不再支持 baseBackup 合并
- 新增 fetch-devices 命令用于从中枢网关更新设备清单
- 新增 bn.js、elliptic 依赖
- 更新测试路径引用,移除依赖合并逻辑的测试用例
- 更新 README.md 反映新项目结构和命令
43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { compileRule, validateBackup } from "../src/index.ts";
|
|
import { eventTurnOn } from "../src/rules/index.ts";
|
|
|
|
const now = 1_760_000_000_000;
|
|
|
|
describe("备份校验", () => {
|
|
test("非法节点 ID 会失败", () => {
|
|
const backup = backupFromRule();
|
|
backup.rules[0]!.nodes[0]!.id = "bad-id";
|
|
const codes = validateBackup(backup).map((diagnostic) => diagnostic.code);
|
|
expect(codes).toContain("node-id-invalid");
|
|
});
|
|
|
|
test("非法连接目标会失败", () => {
|
|
const backup = backupFromRule();
|
|
backup.rules[0]!.nodes[0]!.outputs.output = ["DO1.missing"];
|
|
const codes = validateBackup(backup).map((diagnostic) => diagnostic.code);
|
|
expect(codes).toContain("connection-port-missing");
|
|
});
|
|
|
|
test("缺失设备会按严格模式报错", () => {
|
|
const backup = backupFromRule();
|
|
const diagnostics = validateBackup(backup, { devices: { devList: {} } });
|
|
expect(diagnostics.filter((diagnostic) => diagnostic.code === "device-not-found")).toHaveLength(2);
|
|
});
|
|
|
|
test("真实设备清单可通过设备校验", async () => {
|
|
const backup = backupFromRule();
|
|
const devices = (await import("../src/devices.json")).default;
|
|
const diagnostics = validateBackup(backup, { devices });
|
|
expect(diagnostics.filter((diagnostic) => diagnostic.severity === "error")).toEqual([]);
|
|
});
|
|
});
|
|
|
|
function backupFromRule() {
|
|
return {
|
|
version: 2 as const,
|
|
rules: [compileRule(eventTurnOn, { now }).rule],
|
|
variables: { global: {} },
|
|
};
|
|
}
|