emit-event.test.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. CHANNEL_SENSITIVE_WORDS_UPDATED: "cch:cache:sensitive_words:updated",
  21. publishCacheInvalidation: mocks.publishCacheInvalidation,
  22. }));
  23. describe.sequential("emit-event", () => {
  24. const prevRuntime = process.env.NEXT_RUNTIME;
  25. beforeEach(() => {
  26. vi.clearAllMocks();
  27. process.env.NEXT_RUNTIME = "nodejs";
  28. });
  29. afterEach(() => {
  30. process.env.NEXT_RUNTIME = prevRuntime;
  31. });
  32. test("emitErrorRulesUpdated:Node.js runtime 下应触发本地事件并广播缓存失效", async () => {
  33. const { emitErrorRulesUpdated } = await import("@/lib/emit-event");
  34. await emitErrorRulesUpdated();
  35. expect(mocks.emitErrorRulesUpdated).toHaveBeenCalledTimes(1);
  36. expect(mocks.publishCacheInvalidation).toHaveBeenCalledTimes(1);
  37. expect(mocks.publishCacheInvalidation).toHaveBeenCalledWith("cch:cache:error_rules:updated");
  38. });
  39. test("emitSensitiveWordsUpdated:Node.js runtime 下应触发本地事件并广播缓存失效", async () => {
  40. const { emitSensitiveWordsUpdated } = await import("@/lib/emit-event");
  41. await emitSensitiveWordsUpdated();
  42. expect(mocks.emitSensitiveWordsUpdated).toHaveBeenCalledTimes(1);
  43. expect(mocks.publishCacheInvalidation).toHaveBeenCalledTimes(1);
  44. expect(mocks.publishCacheInvalidation).toHaveBeenCalledWith(
  45. "cch:cache:sensitive_words:updated"
  46. );
  47. });
  48. test("emitRequestFiltersUpdated:Node.js runtime 下应触发本地事件并广播缓存失效", async () => {
  49. const { emitRequestFiltersUpdated } = await import("@/lib/emit-event");
  50. await emitRequestFiltersUpdated();
  51. expect(mocks.emitRequestFiltersUpdated).toHaveBeenCalledTimes(1);
  52. expect(mocks.publishCacheInvalidation).toHaveBeenCalledTimes(1);
  53. expect(mocks.publishCacheInvalidation).toHaveBeenCalledWith(
  54. "cch:cache:request_filters:updated"
  55. );
  56. });
  57. test("Edge runtime 下应静默跳过(不触发任何事件/广播)", async () => {
  58. process.env.NEXT_RUNTIME = "edge";
  59. const { emitErrorRulesUpdated, emitSensitiveWordsUpdated, emitRequestFiltersUpdated } =
  60. await import("@/lib/emit-event");
  61. await emitErrorRulesUpdated();
  62. await emitSensitiveWordsUpdated();
  63. await emitRequestFiltersUpdated();
  64. expect(mocks.emitErrorRulesUpdated).not.toHaveBeenCalled();
  65. expect(mocks.emitSensitiveWordsUpdated).not.toHaveBeenCalled();
  66. expect(mocks.emitRequestFiltersUpdated).not.toHaveBeenCalled();
  67. expect(mocks.publishCacheInvalidation).not.toHaveBeenCalled();
  68. });
  69. });