Skip to content

Commit

Permalink
Merge 01c348d into b06f72b
Browse files Browse the repository at this point in the history
  • Loading branch information
mmkal committed Nov 22, 2020
2 parents b06f72b + 01c348d commit c55b66f
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 37 deletions.
64 changes: 27 additions & 37 deletions src/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,18 @@
import ExtendableError from 'es6-error';

export class SlonikError extends ExtendableError {
originalError!: Error
}

export class WrappedPGError extends SlonikError {
readonly message!: string;

readonly originalError: Error

constructor (originalError: Error, message: string) {
super(`${message}: ${originalError.message}`);

this.originalError = originalError;
}
}

export class InvalidConfigurationError extends SlonikError {}
Expand All @@ -14,51 +25,42 @@ export class UnexpectedStateError extends SlonikError {}

export class ConnectionError extends SlonikError {}

export class StatementCancelledError extends SlonikError {
constructor (error: Error) {
super();

this.originalError = error;
this.message = 'Statement has been cancelled.';
export class StatementCancelledError extends WrappedPGError {
constructor (error: Error, message = 'Statement has been cancelled') {
super(error, message);
}
}

export class StatementTimeoutError extends StatementCancelledError {
constructor (error: Error) {
super(error);

this.message = 'Statement has been cancelled due to a statement_timeout.';
super(error, 'Statement has been cancelled due to a statement_timeout');
}
}

export class BackendTerminatedError extends SlonikError {
export class BackendTerminatedError extends WrappedPGError {
constructor (error: Error) {
super();

this.originalError = error;
this.message = 'Backend has been terminated.';
super(error, 'Backend has been terminated');
}
}

export class NotFoundError extends SlonikError {
constructor () {
super('Resource not found.');
super('Resource not found');
}
}

export class DataIntegrityError extends SlonikError {
constructor () {
super('Query returns an unexpected result.');
super('Query returns an unexpected result');
}
}

export class IntegrityConstraintViolationError extends SlonikError {
export class IntegrityConstraintViolationError extends WrappedPGError {
constraint: string;

constructor (error: Error, constraint: string) {
super();
constructor (error: Error, constraint: string, message = 'Query violates an integrity constraint') {
super(error, message);

this.originalError = error;
this.constraint = constraint;
}
}
Expand All @@ -68,36 +70,24 @@ export class IntegrityConstraintViolationError extends SlonikError {

export class NotNullIntegrityConstraintViolationError extends IntegrityConstraintViolationError {
constructor (error: Error, constraint: string) {
super(error, constraint);

this.originalError = error;
this.message = 'Query violates a not NULL integrity constraint.';
super(error, constraint, 'Query violates a not NULL integrity constraint');
}
}

export class ForeignKeyIntegrityConstraintViolationError extends IntegrityConstraintViolationError {
constructor (error: Error, constraint: string) {
super(error, constraint);

this.originalError = error;
this.message = 'Query violates a foreign key integrity constraint.';
super(error, constraint, 'Query violates a foreign key integrity constraint');
}
}

export class UniqueIntegrityConstraintViolationError extends IntegrityConstraintViolationError {
constructor (error: Error, constraint: string) {
super(error, constraint);

this.originalError = error;
this.message = 'Query violates a unique integrity constraint.';
super(error, constraint, 'Query violates a unique integrity constraint');
}
}

export class CheckIntegrityConstraintViolationError extends IntegrityConstraintViolationError {
constructor (error: Error, constraint: string) {
super(error, constraint);

this.originalError = error;
this.message = 'Query violates a check integrity constraint.';
super(error, constraint, 'Query violates a check integrity constraint');
}
}
17 changes: 17 additions & 0 deletions test/slonik/integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,23 @@ test('throw error with notices', async (t) => {
t.assert(error.notices.length = 5);
}
}
await pool.end();
});

test('error messages include original pg error', async (t) => {
const pool = createPool(t.context.dsn);
const createPerson123 = sql`insert into person(id) values (123)`;

await pool.query(createPerson123);

const error = await t.throwsAsync(async () => {
return pool.query(createPerson123);
});

t.regex(
error.message,
/^Query violates a unique integrity constraint: duplicate key value violates unique constraint "person_pkey"$/,
);

await pool.end();
});

0 comments on commit c55b66f

Please sign in to comment.