SPB Git forge

spb/cancerindex

Public
37commits 1branches 0releases
2.9 MBsize
maindefault branch
10 days agolast push
TypeScript 97.2% SQL 1.5% CSS 0.6% JavaScript 0.5%
2.6 KB · 41 lines typescript
Raw Blame History
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