spb/cancerindex
Public
TypeScript 97.2%
SQL 1.5%
CSS 0.6%
JavaScript 0.5%
1import { describe, it, expect } from 'vitest';2import { isConnectionError } from '@/lib/db-errors';34const err = (props: Record<string, unknown>) => Object.assign(new Error(typeof props.message === 'string' ? props.message : 'boom'), props);56describe('isConnectionError', () => {7 it('recognises Node socket errors', () => {8 expect(isConnectionError(err({ code: 'ECONNREFUSED', message: 'connect ECONNREFUSED 127.0.0.1:5433' }))).toBe(true);9 expect(isConnectionError(err({ code: 'ECONNRESET' }))).toBe(true);10 expect(isConnectionError(err({ code: 'ETIMEDOUT' }))).toBe(true);11 expect(isConnectionError(err({ errno: 'ENOTFOUND' }))).toBe(true);12 });13 it('recognises postgres.js connection-level errors', () => {14 expect(isConnectionError(err({ code: 'CONNECT_TIMEOUT', message: 'write CONNECT_TIMEOUT 127.0.0.1:5433' }))).toBe(true);15 expect(isConnectionError(err({ code: 'CONNECTION_CLOSED' }))).toBe(true);16 expect(isConnectionError(err({ code: 'CONNECTION_ENDED' }))).toBe(true);17 });18 it('recognises SQLSTATE classes for connection, auth, bad database, resources and shutdown', () => {19 expect(isConnectionError(err({ code: '08006' }))).toBe(true);20 expect(isConnectionError(err({ code: '28P01', message: 'password authentication failed' }))).toBe(true);21 expect(isConnectionError(err({ code: '3D000', message: 'database "nope" does not exist' }))).toBe(true);22 expect(isConnectionError(err({ code: '53300', message: 'too many connections' }))).toBe(true);23 expect(isConnectionError(err({ code: '57P01', message: 'terminating connection due to administrator command' }))).toBe(true);24 });25 it('does NOT flag query-level errors (missing table / column / bad cast) — those become empty states', () => {26 expect(isConnectionError(err({ code: '42P01', message: 'relation "foo" does not exist' }))).toBe(false);27 expect(isConnectionError(err({ code: '42703', message: 'column "bar" does not exist' }))).toBe(false);28 expect(isConnectionError(err({ code: '22P02', message: 'invalid input syntax for type integer' }))).toBe(false);29 expect(isConnectionError(new Error('some application bug'))).toBe(false);30 });31 it('looks through `cause` chains and message text', () => {32 expect(isConnectionError(err({ message: 'query failed', cause: err({ code: 'ECONNREFUSED' }) }))).toBe(true);33 expect(isConnectionError(err({ message: 'connection terminated unexpectedly' }))).toBe(true);34 });35 it('ignores non-objects', () => {36 expect(isConnectionError(null)).toBe(false);37 expect(isConnectionError('ECONNREFUSED')).toBe(false);38 expect(isConnectionError(undefined)).toBe(false);39 });40});41