1import { classifySqlState } from "@effect/sql-pg/internal/sqlError"
2import { assert, describe, it } from "@effect/vitest"
3import type * as SqlError from "effect/sql/SqlError"
4
5const queryFailureReason = (cause: unknown) => {
6 const code = typeof cause === "object" && cause !== null && "code" in cause && typeof cause.code === "string"
7 ? cause.code
8 : undefined
9 const constraint = typeof cause === "object" && cause !== null && "constraint" in cause
10 ? cause.constraint
11 : undefined
12 return classifySqlState(code, constraint, {
13 cause,
14 message: "Failed to execute statement",
15 operation: "query"
16 })
17}
18
19const assertUniqueViolation = (reason: SqlError.SqlErrorReason, constraint: string) => {
20 assert.strictEqual(reason._tag, "UniqueViolation")
21 if (reason._tag === "UniqueViolation") {
22 assert.strictEqual(reason.constraint, constraint)
23 }
24}
25
26describe("PostgreSQL SQLSTATE classification", () => {
27 it("checks 42501 before generic 42*", () => {
28 assert.strictEqual(queryFailureReason({ code: "42501" })._tag, "AuthorizationError")
29 assert.strictEqual(queryFailureReason({ code: "42P01" })._tag, "SqlSyntaxError")
30 })
31
32 it("falls back to UnknownError for unmapped SQLSTATE", () => {
33 assert.strictEqual(queryFailureReason({ code: "ZZZZZ" })._tag, "UnknownError")
34 })
35
36 it("classifies 23505 as UniqueViolation and trims the constraint name", () => {
37 assertUniqueViolation(queryFailureReason({ code: "23505", constraint: " users_email_key " }), "users_email_key")
38 })
39
40 it("uses unknown for missing, non-string, or blank unique violation constraints", () => {
41 assertUniqueViolation(queryFailureReason({ code: "23505" }), "unknown")
42 assertUniqueViolation(queryFailureReason({ code: "23505", constraint: 123 }), "unknown")
43 assertUniqueViolation(queryFailureReason({ code: "23505", constraint: " " }), "unknown")
44 })
45
46 it("keeps non-unique integrity constraints classified as ConstraintError", () => {
47 assert.strictEqual(
48 queryFailureReason({ code: "23503", constraint: "orders_user_id_fkey" })._tag,
49 "ConstraintError"
50 )
51 })
52})