import { describe, expect, it, vi } from "vitest"; const poolConstructor = vi.hoisted(() => vi.fn()); vi.mock("pg", () => ({ Pool: poolConstructor })); import { createIdentityDrizzleDatabase, IdentityDatabaseError } from "../src/identity/database.js"; describe("Core identity Drizzle database composition", () => { it("does not construct a pool merely because the module is imported", () => { expect(poolConstructor).not.toHaveBeenCalled(); }); it.each([ "", " ", "not-a-database-url", "https://admin:do-not-log@db.example.test/database", ])("rejects an invalid connection string without exposing it (%s)", (connectionString) => { let captured: unknown; try { createIdentityDrizzleDatabase(connectionString); } catch (error) { captured = error; } expect(captured).toBeInstanceOf(IdentityDatabaseError); expect(captured).toMatchObject({ code: "IDENTITY_DATABASE_CONFIGURATION_INVALID" }); const publicText = `${String(captured)}\n${ captured instanceof Error ? (captured.stack ?? "") : "" }`; if (connectionString) { expect(publicText).not.toContain(connectionString); } expect(poolConstructor).not.toHaveBeenCalled(); }); it("explicitly constructs the pool only when called, with the identity schema attached", () => { poolConstructor.mockImplementation(function fakePool() { return { end: async () => undefined }; }); const handle = createIdentityDrizzleDatabase( "postgresql://operator:do-not-log@example.test/ekklesia", ); expect(poolConstructor).toHaveBeenCalledTimes(1); expect(handle.db).toBeDefined(); expect(typeof handle.close).toBe("function"); expect(Object.isFrozen(handle)).toBe(true); }); it("passes the connection timeout through to the pool configuration", () => { poolConstructor.mockImplementation(function fakePool() { return { end: async () => undefined }; }); poolConstructor.mockClear(); createIdentityDrizzleDatabase("postgresql://example.test/ekklesia", { connectionTimeoutMs: 5_000, }); expect(poolConstructor).toHaveBeenCalledWith( expect.objectContaining({ connectionTimeoutMillis: 5_000 }), ); }); });