1import { PgPool } from "@effect/sql-pg"
2import { assert, it } from "@effect/vitest"
3import { Effect, Redacted } from "effect"
4import { PgContainer } from "./utils.ts"
5
6it.layer(PgContainer.layer, { timeout: "30 seconds" })("PostgreSQL startup defaults", (it) => {
7 it.effect("preserves named and opaque defaults across replacement and RESET ALL", () =>
8 Effect.gen(function*() {
9 const container = yield* PgContainer
10 const pool = yield* PgPool.make({
11 url: Redacted.make(container.getConnectionUri()),
12 startupParameters: { statement_timeout: "1234ms" },
13 startupOptions: "-c lock_timeout=2345",
14 maxConnections: 1
15 })
16 const query = "SELECT current_setting('statement_timeout') AS timeout, " +
17 "current_setting('lock_timeout') AS lock"
18 const defaults = [{ timeout: "1234ms", lock: "2345ms" }]
19 const firstPid = yield* Effect.scoped(Effect.gen(function*() {
20 const connection = yield* pool.get
21 assert.deepStrictEqual((yield* connection.query(query)).rows, defaults)
22 yield* pool.invalidate(connection)
23 return connection.processId
24 }))
25 const replacement = yield* pool.get
26 assert.notStrictEqual(replacement.processId, firstPid)
27 assert.deepStrictEqual((yield* replacement.query(query)).rows, defaults)
28
29 yield* replacement.query("SET statement_timeout = '5678ms'")
30 yield* replacement.query("SET lock_timeout = '6789ms'")
31 assert.deepStrictEqual((yield* replacement.query(query)).rows, [{
32 timeout: "5678ms",
33 lock: "6789ms"
34 }])
35 yield* replacement.query("RESET ALL")
36 assert.deepStrictEqual((yield* replacement.query(query)).rows, defaults)
37 }))
38})