Brian C 4fde8b78f1
Fix double readyForQuery (#2420)
This is fixing a double readyForQuery message being sent from the backend (because we were calling sync after an error, which I already fixed in the main driver).  Also closes #2333
2020-11-30 09:25:01 -06:00

93 lines
2.9 KiB
TypeScript

import assert from 'assert'
import helper from './helper'
import QueryStream from '../src'
import { Pool, Client } from 'pg'
helper('error', function (client) {
it('receives error on stream', function (done) {
const stream = new QueryStream('SELECT * FROM asdf num', [])
const query = client.query(stream)
query
.on('error', function (err) {
assert(err)
assert.equal(err.code, '42P01')
done()
})
.on('data', function () {
// noop to kick of reading
})
})
it('continues to function after stream', function (done) {
client.query('SELECT NOW()', done)
})
})
describe('error recovery', () => {
// created from https://github.com/chrisdickinson/pg-test-case
it('recovers from a streaming error in a transaction', async () => {
const pool = new Pool()
const client = await pool.connect()
await client.query(`CREATE TEMP TABLE frobnicators (
id serial primary key,
updated timestamp
)`)
await client.query(`BEGIN;`)
const query = new QueryStream(`INSERT INTO frobnicators ("updated") VALUES ($1) RETURNING "id"`, [Date.now()])
let error: Error | undefined = undefined
query.on('data', console.log).on('error', (e) => {
error = e
})
client.query(query) // useless callback necessitated by an older version of honeycomb-beeline
await client.query(`ROLLBACK`)
assert(error, 'Error should not be undefined')
const { rows } = await client.query('SELECT NOW()')
assert.strictEqual(rows.length, 1)
client.release()
const client2 = await pool.connect()
await client2.query(`BEGIN`)
client2.release()
pool.end()
})
// created from https://github.com/brianc/node-postgres/pull/2333
it('handles an error on a stream after a plain text non-stream error', async () => {
const client = new Client()
const stmt = 'SELECT * FROM goose;'
await client.connect()
return new Promise((resolve, reject) => {
client.query(stmt).catch((e) => {
assert(e, 'Query should have rejected with an error')
const stream = new QueryStream('SELECT * FROM duck')
client.query(stream)
stream.on('data', () => {})
stream.on('error', () => {
client.end((err) => {
err ? reject(err) : resolve()
})
})
})
})
})
it('does not crash when closing a connection with a queued stream', async () => {
const client = new Client()
const stmt = 'SELECT * FROM goose;'
await client.connect()
return new Promise(async (resolve) => {
let queryError: Error | undefined
client.query(stmt).catch((e) => {
queryError = e
})
const stream = client.query(new QueryStream(stmt))
stream.on('data', () => {})
stream.on('error', () => {
assert(queryError, 'query should have errored due to client ending')
resolve()
})
await client.end()
})
})
})