Skip to content

Commit 93b4630

Browse files
committed
Error handling. Unit test for it. Reduce code dupe. Version bump to 1.1.0.
1 parent 468f769 commit 93b4630

3 files changed

Lines changed: 61 additions & 44 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "simple-pg-client",
3-
"version": "1.0.5",
3+
"version": "1.1.0",
44
"description": "Simplified Javascript PostgreSQL client.",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/dbService.ts

Lines changed: 23 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { randomUUID } from 'crypto'
2+
import { QueryResult } from 'pg'
23
import { truncate } from './common/string'
34
import { DbService, DbServiceOptions } from './types'
45

@@ -10,44 +11,27 @@ const onError = (options: DbServiceOptions, queryId: string, error: any, sql: st
1011
options.events?.onError?.(queryId, `Executing SQL Failed (${queryId}): ${error.message}`, sql, parameters)
1112
}
1213

14+
const queryBase = async <T = any>(
15+
options: DbServiceOptions,
16+
sql: string,
17+
parameters: any,
18+
resultCreator: (result: QueryResult) => T,
19+
) => {
20+
const queryId = randomUUID()
21+
onQuery(options, queryId, sql, parameters)
22+
try {
23+
const result = await options.client.query(sql, parameters)
24+
return resultCreator(result)
25+
}
26+
catch (e) {
27+
onError(options, queryId, e, sql, parameters)
28+
throw e
29+
}
30+
}
31+
1332
export const createDbService = (options: DbServiceOptions): DbService => ({
14-
query: (sql, parameters) => {
15-
const queryId = randomUUID()
16-
onQuery(options, queryId, sql, parameters)
17-
return options.client.query(sql, parameters)
18-
.catch(error => {
19-
onError(options, queryId, error, sql, parameters)
20-
return null
21-
})
22-
},
23-
queryExists: (sql, parameters) => {
24-
const queryId = randomUUID()
25-
onQuery(options, queryId, sql, parameters)
26-
return options.client.query(sql, parameters)
27-
.then(result => result.rowCount > 0)
28-
.catch(error => {
29-
onError(options, queryId, error, sql, parameters)
30-
return null
31-
})
32-
},
33-
queryGetFirstRow: (sql, parameters) => {
34-
const queryId = randomUUID()
35-
onQuery(options, queryId, sql, parameters)
36-
return options.client.query(sql, parameters)
37-
.then(result => result.rows[0])
38-
.catch(error => {
39-
onError(options, queryId, error, sql, parameters)
40-
return null
41-
})
42-
},
43-
queryGetRows: (sql, parameters) => {
44-
const queryId = randomUUID()
45-
onQuery(options, queryId, sql, parameters)
46-
return options.client.query(sql, parameters)
47-
.then(result => result.rows)
48-
.catch(error => {
49-
onError(options, queryId, error, sql, parameters)
50-
return null
51-
})
52-
},
33+
query: async (sql, parameters) => queryBase(options, sql, parameters, r => r),
34+
queryExists: async (sql, parameters) => queryBase(options, sql, parameters, r => r.rows.length > 0),
35+
queryGetFirstRow: async (sql, parameters) => queryBase(options, sql, parameters, r => r.rows[0]),
36+
queryGetRows: async (sql, parameters) => queryBase(options, sql, parameters, r => r.rows),
5337
})

src/index.spec.ts

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable no-console */
22
import { createConsoleLogEventHandlers, createSimplePgClient } from '.'
3-
import { SimplePgClientOptions } from './types'
3+
import { SimplePgClient, SimplePgClientOptions } from './types'
44

55
const DEFAULT_OPTIONS: SimplePgClientOptions = {
66
host: 'localhost',
@@ -34,15 +34,48 @@ CONNECTION LIMIT = -1;`,
3434
describe('createSimplePgClient', () => {
3535
const fn = createSimplePgClient
3636

37+
let simplePgClient: SimplePgClient
38+
39+
afterEach(async () => {
40+
await simplePgClient.client.end()
41+
})
42+
3743
test('basic test of initial values', async () => {
3844
const options: SimplePgClientOptions = {
3945
...DEFAULT_OPTIONS,
4046
events: createConsoleLogEventHandlers(),
4147
}
42-
const simplePgClient = await fn(options)
48+
simplePgClient = await fn(options)
49+
})
4350

44-
expect(simplePgClient).toBeDefined()
51+
test('error handling', async () => {
52+
let onErrorParams: any[]
53+
let e: any
54+
let result: any
4555

46-
await simplePgClient.client.end()
56+
const options: SimplePgClientOptions = {
57+
...DEFAULT_OPTIONS,
58+
events: {
59+
...createConsoleLogEventHandlers(),
60+
onQueryError: (...params) => {
61+
onErrorParams = params
62+
},
63+
},
64+
}
65+
simplePgClient = await fn(options)
66+
67+
try {
68+
result = await simplePgClient.query('not a valid query')
69+
}
70+
catch (_e) {
71+
e = _e
72+
}
73+
74+
expect(e).toBeDefined()
75+
expect(result).toBeUndefined()
76+
const queryId = onErrorParams[0]
77+
expect(onErrorParams[1]).toBe(`Executing SQL Failed (${queryId}): syntax error at or near "not"`)
78+
expect(onErrorParams[2]).toBe('not a valid query')
79+
expect(onErrorParams[3]).toBe(undefined)
4780
})
4881
})

0 commit comments

Comments
 (0)