emit-event.test.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
  2. const mocks = vi.hoisted(() => {
  3. return {
  4. emitErrorRulesUpdated: vi.fn(),
  5. emitSensitiveWordsUpdated: vi.fn(),
  6. emitRequestFiltersUpdated: vi.fn(),
  7. publishCacheInvalidation: vi.fn(async () => {}),
  8. };
  9. });
  10. vi.mock("@/lib/event-emitter", () => ({
  11. eventEmitter: {
  12. emitErrorRulesUpdated: mocks.emitErrorRulesUpdated,
  13. emitSensitiveWordsUpdated: mocks.emitSensitiveWordsUpdated,
  14. emitRequestFiltersUpdated: mocks.emitRequestFiltersUpdated,
  15. },
  16. }));
  17. vi.mock("@/lib/redis/pubsub", () => ({
  18. CHANNEL_ERROR_RULES_UPDATED: "cch:cache:error_rules:updated",
  19. CHANNEL_REQUEST_FILTERS_UPDATED: "cch:cache:request_filters:updated",
  20. publishCacheInvalidation: mocks.publishCacheInvalidation,
  21. }));
  22. describe.sequential("emit-event", () => {
  23. const prevRuntime = process.env.NEXT_RUNTIME;
  24. beforeEach(() => {
  25. vi.clearAllMocks();
  26. process.env.NEXT_RUNTIME = "nodejs";
  27. });
  28. afterEach(() => {
  29. process.env.NEXT_RUNTIME = prevRuntime;
  30. });
  31. test("emitErrorRulesUpdated:Node.js runtime 下应触发本地事件并广播缓存失效", async () => {
  32. const { emitErrorRulesUpdated } = await import("@/lib/emit-event");
  33. await emitErrorRulesUpdated();
  34. expect(mocks.emitErrorRulesUpdated).toHaveBeenCalledTimes(1);
  35. expect(mocks.publishCacheInvalidation).toHaveBeenCalledTimes(1);
  36. expect(mocks.publishCacheInvalidation).toHaveBeenCalledWith("cch:cache:error_rules:updated");
  37. });
  38. test("emitSensitiveWordsUpdated:Node.js runtime 下仅触发本地事件", async () => {
  39. const { emitSensitiveWordsUpdated } = await import("@/lib/emit-event");
  40. await emitSensitiveWordsUpdated();
  41. expect(mocks.emitSensitiveWordsUpdated).toHaveBeenCalledTimes(1);
  42. expect(mocks.publishCacheInvalidation).not.toHaveBeenCalled();
  43. });
  44. test("emitRequestFiltersUpdated:Node.js runtime 下应触发本地事件并广播缓存失效", async () => {
  45. const { emitRequestFiltersUpdated } = await import("@/lib/emit-event");
  46. await emitRequestFiltersUpdated();
  47. expect(mocks.emitRequestFiltersUpdated).toHaveBeenCalledTimes(1);
  48. expect(mocks.publishCacheInvalidation).toHaveBeenCalledTimes(1);
  49. expect(mocks.publishCacheInvalidation).toHaveBeenCalledWith(
  50. "cch:cache:request_filters:updated"
  51. );
  52. });
  53. test("Edge runtime 下应静默跳过(不触发任何事件/广播)", async () => {
  54. process.env.NEXT_RUNTIME = "edge";
  55. const { emitErrorRulesUpdated, emitSensitiveWordsUpdated, emitRequestFiltersUpdated } =
  56. await import("@/lib/emit-event");
  57. await emitErrorRulesUpdated();
  58. await emitSensitiveWordsUpdated();
  59. await emitRequestFiltersUpdated();
  60. expect(mocks.emitErrorRulesUpdated).not.toHaveBeenCalled();
  61. expect(mocks.emitSensitiveWordsUpdated).not.toHaveBeenCalled();
  62. expect(mocks.emitRequestFiltersUpdated).not.toHaveBeenCalled();
  63. expect(mocks.publishCacheInvalidation).not.toHaveBeenCalled();
  64. });
  65. });