59 lines
1.6 KiB
TypeScript
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);
|
|
});
|
|
});
|