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); }); });