| 1 | import { PgliteClient } from "@effect/sql-pglite" |
| 2 | import { assert, describe, it } from "@effect/vitest" |
| 3 | import { Effect } from "effect" |
| 4 | import * as Reactivity from "effect/reactivity/Reactivity" |
| 5 | import type * as SqlError from "effect/sql/SqlError" |
| 6 | |
| 7 | const 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 | |
| 19 | const queryFailureReasonTag = (cause: unknown) => Effect.map(queryFailureReason(cause), (reason) => reason._tag) |
| 20 | |
| 21 | const 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 | |
| 28 | const makeFailingClient = (cause: unknown) => ({ |
| 29 | query: () => Promise.reject(cause) |
| 30 | }) |
| 31 | |
| 32 | describe("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 | }) |