mirror of
https://github.com/brianc/node-postgres.git
synced 2025-12-08 20:16:25 +00:00
108 lines
2.5 KiB
JavaScript
108 lines
2.5 KiB
JavaScript
'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();
|
|
});
|
|
});
|