db-pool-config.test.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
  2. type EnvSnapshot = Partial<Record<string, string | undefined>>;
  3. function snapshotEnv(keys: string[]): EnvSnapshot {
  4. const snapshot: EnvSnapshot = {};
  5. for (const key of keys) {
  6. snapshot[key] = process.env[key];
  7. }
  8. return snapshot;
  9. }
  10. function restoreEnv(snapshot: EnvSnapshot) {
  11. for (const [key, value] of Object.entries(snapshot)) {
  12. if (value === undefined) {
  13. delete process.env[key];
  14. } else {
  15. process.env[key] = value;
  16. }
  17. }
  18. }
  19. describe("drizzle/db 连接池配置", () => {
  20. const envKeys = [
  21. "NODE_ENV",
  22. "DSN",
  23. "DB_POOL_MAX",
  24. "DB_POOL_IDLE_TIMEOUT",
  25. "DB_POOL_CONNECT_TIMEOUT",
  26. "MESSAGE_REQUEST_WRITE_MODE",
  27. ];
  28. const postgresMock = vi.fn();
  29. const drizzleMock = vi.fn(() => ({ __db: true }));
  30. const originalEnv = snapshotEnv(envKeys);
  31. beforeEach(() => {
  32. vi.resetModules();
  33. postgresMock.mockReset();
  34. drizzleMock.mockReset();
  35. // 确保每个用例有一致的基础环境
  36. process.env.DSN = "postgres://postgres:postgres@localhost:5432/claude_code_hub_test";
  37. process.env.MESSAGE_REQUEST_WRITE_MODE = "async";
  38. delete process.env.DB_POOL_MAX;
  39. delete process.env.DB_POOL_IDLE_TIMEOUT;
  40. delete process.env.DB_POOL_CONNECT_TIMEOUT;
  41. vi.doMock("postgres", () => ({ default: postgresMock }));
  42. vi.doMock("drizzle-orm/postgres-js", () => ({
  43. drizzle: drizzleMock,
  44. }));
  45. });
  46. afterEach(() => {
  47. restoreEnv(originalEnv);
  48. });
  49. it("生产环境默认 max=20、idle_timeout=20、connect_timeout=10", async () => {
  50. process.env.NODE_ENV = "production";
  51. const { getDb } = await import("@/drizzle/db");
  52. getDb();
  53. expect(postgresMock).toHaveBeenCalledWith(
  54. process.env.DSN,
  55. expect.objectContaining({
  56. max: 20,
  57. idle_timeout: 20,
  58. connect_timeout: 10,
  59. })
  60. );
  61. });
  62. it("开发环境默认 max=10", async () => {
  63. process.env.NODE_ENV = "development";
  64. const { getDb } = await import("@/drizzle/db");
  65. getDb();
  66. expect(postgresMock).toHaveBeenCalledWith(
  67. process.env.DSN,
  68. expect.objectContaining({
  69. max: 10,
  70. })
  71. );
  72. });
  73. it("支持通过 env 覆盖连接池参数", async () => {
  74. process.env.NODE_ENV = "production";
  75. process.env.DB_POOL_MAX = "50";
  76. process.env.DB_POOL_IDLE_TIMEOUT = "30";
  77. process.env.DB_POOL_CONNECT_TIMEOUT = "5";
  78. const { getDb } = await import("@/drizzle/db");
  79. getDb();
  80. expect(postgresMock).toHaveBeenCalledWith(
  81. process.env.DSN,
  82. expect.objectContaining({
  83. max: 50,
  84. idle_timeout: 30,
  85. connect_timeout: 5,
  86. })
  87. );
  88. });
  89. });