| 1 | import { classifySqlState } from "@effect/sql-pg/internal/sqlError" |
| 2 | import { assert, describe, it } from "@effect/vitest" |
| 3 | import type * as SqlError from "effect/sql/SqlError" |
| 4 | |
| 5 | const 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 | |
| 19 | const 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 | |
| 26 | describe("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 | }) |