pool.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. 'use strict'
  2. const assert = require('assert')
  3. const Cursor = require('../')
  4. const pg = require('pg')
  5. const text = 'SELECT generate_series as num FROM generate_series(0, 50)'
  6. function poolQueryPromise(pool, readRowCount) {
  7. return new Promise((resolve, reject) => {
  8. pool.connect((err, client, done) => {
  9. if (err) {
  10. done(err)
  11. return reject(err)
  12. }
  13. const cursor = client.query(new Cursor(text))
  14. cursor.read(readRowCount, (err) => {
  15. if (err) {
  16. done(err)
  17. return reject(err)
  18. }
  19. cursor.close((err) => {
  20. if (err) {
  21. done(err)
  22. return reject(err)
  23. }
  24. done()
  25. resolve()
  26. })
  27. })
  28. })
  29. })
  30. }
  31. describe('pool', function () {
  32. beforeEach(function () {
  33. this.pool = new pg.Pool({ max: 1 })
  34. })
  35. afterEach(function () {
  36. this.pool.end()
  37. })
  38. it('closes cursor early, single pool query', function (done) {
  39. poolQueryPromise(this.pool, 25)
  40. .then(() => done())
  41. .catch((err) => {
  42. assert.ifError(err)
  43. done()
  44. })
  45. })
  46. it('closes cursor early, saturated pool', function (done) {
  47. const promises = []
  48. for (let i = 0; i < 10; i++) {
  49. promises.push(poolQueryPromise(this.pool, 25))
  50. }
  51. Promise.all(promises)
  52. .then(() => done())
  53. .catch((err) => {
  54. assert.ifError(err)
  55. done()
  56. })
  57. })
  58. it('closes exhausted cursor, single pool query', function (done) {
  59. poolQueryPromise(this.pool, 100)
  60. .then(() => done())
  61. .catch((err) => {
  62. assert.ifError(err)
  63. done()
  64. })
  65. })
  66. it('closes exhausted cursor, saturated pool', function (done) {
  67. const promises = []
  68. for (let i = 0; i < 10; i++) {
  69. promises.push(poolQueryPromise(this.pool, 100))
  70. }
  71. Promise.all(promises)
  72. .then(() => done())
  73. .catch((err) => {
  74. assert.ifError(err)
  75. done()
  76. })
  77. })
  78. it('can close multiple times on a pool', async function () {
  79. const pool = new pg.Pool({ max: 1 })
  80. const run = async () => {
  81. const cursor = new Cursor(text)
  82. const client = await pool.connect()
  83. client.query(cursor)
  84. await new Promise((resolve) => {
  85. cursor.read(25, function (err) {
  86. assert.ifError(err)
  87. cursor.close(function (err) {
  88. assert.ifError(err)
  89. client.release()
  90. resolve()
  91. })
  92. })
  93. })
  94. }
  95. await Promise.all([run(), run(), run()])
  96. await pool.end()
  97. })
  98. })