1import { PgliteClient } from "@effect/sql-pglite"
2import { assert, describe, it } from "@effect/vitest"
3import { Effect } from "effect"
4import * as Reactivity from "effect/reactivity/Reactivity"
5import type * as SqlError from "effect/sql/SqlError"
6
7const queryFailureReason = (cause: unknown) =>
8 Effect.gen(function*() {
9 const client = yield* PgliteClient.fromClient({
10 liveClient: makeFailingClient(cause) as any
11 })
12 const error = yield* Effect.flip(client`SELECT 1`)
13 return error.reason
14 }).pipe(
15 Effect.scoped,
16 Effect.provide(Reactivity.layer)
17 )
18
19const queryFailureReasonTag = (cause: unknown) => Effect.map(queryFailureReason(cause), (reason) => reason._tag)
20
21const assertUniqueViolation = (reason: SqlError.SqlErrorReason, constraint: string) => {
22 assert.strictEqual(reason._tag, "UniqueViolation")
23 if (reason._tag === "UniqueViolation") {
24 assert.strictEqual(reason.constraint, constraint)
25 }
26}
27
28const makeFailingClient = (cause: unknown) => ({
29 query: () => Promise.reject(cause)
30})
31
32describe("PgliteClient SqlError classification", () => {
33 it.effect("classifies 23505 as UniqueViolation and trims the constraint name", () =>
34 Effect.gen(function*() {
35 const reason = yield* queryFailureReason({ code: "23505", constraint: " users_email_key " })
36 assertUniqueViolation(reason, "users_email_key")
37 }))
38
39 it.effect("uses unknown for missing, non-string, or blank unique violation constraints", () =>
40 Effect.gen(function*() {
41 const missing = yield* queryFailureReason({ code: "23505" })
42 assertUniqueViolation(missing, "unknown")
43
44 const nonString = yield* queryFailureReason({ code: "23505", constraint: 123 })
45 assertUniqueViolation(nonString, "unknown")
46
47 const blank = yield* queryFailureReason({ code: "23505", constraint: " " })
48 assertUniqueViolation(blank, "unknown")
49 }))
50
51 it.effect("keeps non-unique integrity constraints classified as ConstraintError", () =>
52 Effect.gen(function*() {
53 const tag = yield* queryFailureReasonTag({ code: "23503", constraint: "orders_user_id_fkey" })
54 assert.strictEqual(tag, "ConstraintError")
55 }))
56})