paperclip/packages/db/src/client-options.test.ts

58 lines
2.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { databaseClientOptionsFromEnv, postgresJsOptions } from "./client.js";
describe("databaseClientOptionsFromEnv", () => {
it("returns no options when nothing is set, preserving driver defaults", () => {
expect(databaseClientOptionsFromEnv({})).toEqual({});
expect(postgresJsOptions(databaseClientOptionsFromEnv({}))).toEqual({});
});
it("ignores empty values", () => {
expect(
databaseClientOptionsFromEnv({
DATABASE_PREPARED_STATEMENTS: "",
DATABASE_POOL_MAX: "",
}),
).toEqual({});
});
it("parses prepared-statement toggles", () => {
expect(databaseClientOptionsFromEnv({ DATABASE_PREPARED_STATEMENTS: "false" })).toEqual({ prepare: false });
expect(databaseClientOptionsFromEnv({ DATABASE_PREPARED_STATEMENTS: "0" })).toEqual({ prepare: false });
expect(databaseClientOptionsFromEnv({ DATABASE_PREPARED_STATEMENTS: "true" })).toEqual({ prepare: true });
expect(databaseClientOptionsFromEnv({ DATABASE_PREPARED_STATEMENTS: "TRUE" })).toEqual({ prepare: true });
});
it("parses pool and timeout settings", () => {
expect(
databaseClientOptionsFromEnv({
DATABASE_POOL_MAX: "25",
DATABASE_IDLE_TIMEOUT_SECONDS: "60",
DATABASE_CONNECT_TIMEOUT_SECONDS: "10",
}),
).toEqual({ maxConnections: 25, idleTimeoutSeconds: 60, connectTimeoutSeconds: 10 });
});
it("rejects malformed values instead of silently ignoring them", () => {
expect(() => databaseClientOptionsFromEnv({ DATABASE_PREPARED_STATEMENTS: "maybe" })).toThrow(
/DATABASE_PREPARED_STATEMENTS/,
);
expect(() => databaseClientOptionsFromEnv({ DATABASE_POOL_MAX: "0" })).toThrow(/DATABASE_POOL_MAX/);
expect(() => databaseClientOptionsFromEnv({ DATABASE_POOL_MAX: "-3" })).toThrow(/DATABASE_POOL_MAX/);
expect(() => databaseClientOptionsFromEnv({ DATABASE_CONNECT_TIMEOUT_SECONDS: "1.5" })).toThrow(
/DATABASE_CONNECT_TIMEOUT_SECONDS/,
);
});
it("maps to postgres.js option names", () => {
expect(
postgresJsOptions({
prepare: false,
maxConnections: 25,
idleTimeoutSeconds: 60,
connectTimeoutSeconds: 10,
}),
).toEqual({ prepare: false, max: 25, idle_timeout: 60, connect_timeout: 10 });
});
});