Files
qun-monitor/tests/keywords.spec.ts
2025-11-08 16:11:21 +08:00

59 lines
1.6 KiB
TypeScript

import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { KeywordStore } from "../src/keywords.js";
describe("KeywordStore", () => {
const tempDir = mkdtempSync(join(tmpdir(), "keywords-test-"));
const keywordsFile = join(tempDir, "keywords.yaml");
beforeAll(() => {
writeFileSync(
keywordsFile,
[
"keywords:",
" - name: promo",
" patterns:",
' - "推广"',
" regex: false",
" - name: regex",
" patterns:",
' - "(?i)验证码"',
" regex: true",
].join("\n"),
"utf-8",
);
});
afterAll(() => {
rmSync(tempDir, { recursive: true, force: true });
});
it("匹配子串与正则,并在文件更新后热加载", async () => {
const store = new KeywordStore(keywordsFile);
const firstHits = store.match("这是一个推广内容");
expect(firstHits.some((hit) => hit.keyword === "promo")).toBe(true);
const regexHits = store.match("验证码123");
expect(regexHits.some((hit) => hit.keyword === "regex")).toBe(true);
await new Promise((resolve) => setTimeout(resolve, 20));
writeFileSync(
keywordsFile,
[
"keywords:",
" - name: new",
" patterns:",
' - "新品"',
].join("\n"),
"utf-8",
);
const updated = store.match("这是一条新品");
expect(updated.some((hit) => hit.keyword === "new")).toBe(true);
});
});