'use strict'; const assert = require('assert'); const Cursor = require('../'); const pg = require('pg'); const text = 'SELECT generate_series as num FROM generate_series(0, 50)'; function poolQueryPromise(pool, readRowCount) { return new Promise((resolve, reject) => { pool.connect((err, client, done) => { if (err) { done(err); return reject(err); } const cursor = client.query(new Cursor(text)); cursor.read(readRowCount, (err) => { if (err) { done(err); return reject(err); } cursor.close((err) => { if (err) { done(err); return reject(err); } done(); resolve(); }); }); }); }); } describe('pool', function () { beforeEach(function () { this.pool = new pg.Pool({ max: 1 }); }); afterEach(function () { this.pool.end(); }); it('closes cursor early, single pool query', function (done) { poolQueryPromise(this.pool, 25) .then(() => done()) .catch((err) => { assert.ifError(err); done(); }); }); it('closes cursor early, saturated pool', function (done) { const promises = []; for (let i = 0; i < 10; i++) { promises.push(poolQueryPromise(this.pool, 25)); } Promise.all(promises) .then(() => done()) .catch((err) => { assert.ifError(err); done(); }); }); it('closes exhausted cursor, single pool query', function (done) { poolQueryPromise(this.pool, 100) .then(() => done()) .catch((err) => { assert.ifError(err); done(); }); }); it('closes exhausted cursor, saturated pool', function (done) { const promises = []; for (let i = 0; i < 10; i++) { promises.push(poolQueryPromise(this.pool, 100)); } Promise.all(promises) .then(() => done()) .catch((err) => { assert.ifError(err); done(); }); }); it('can close multiple times on a pool', async function () { const pool = new pg.Pool({ max: 1 }); const run = async () => { const cursor = new Cursor(text); const client = await pool.connect(); client.query(cursor); await new Promise((resolve) => { cursor.read(25, function (err) { assert.ifError(err); cursor.close(function (err) { assert.ifError(err); client.release(); resolve(); }); }); }); }; await Promise.all([run(), run(), run()]); await pool.end(); }); });