error-handling.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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, 4)'
  6. describe('error handling', function () {
  7. it('can continue after error', function (done) {
  8. const client = new pg.Client()
  9. client.connect()
  10. const cursor = client.query(new Cursor('asdfdffsdf'))
  11. cursor.read(1, function (err) {
  12. assert(err)
  13. client.query('SELECT NOW()', function (err) {
  14. assert.ifError(err)
  15. client.end()
  16. done()
  17. })
  18. })
  19. })
  20. it('errors queued reads', async () => {
  21. const client = new pg.Client()
  22. await client.connect()
  23. const cursor = client.query(new Cursor('asdfdffsdf'))
  24. const immediateRead = cursor.read(1)
  25. const queuedRead1 = cursor.read(1)
  26. const queuedRead2 = cursor.read(1)
  27. assert(
  28. await immediateRead.then(
  29. () => null,
  30. (err) => err
  31. )
  32. )
  33. assert(
  34. await queuedRead1.then(
  35. () => null,
  36. (err) => err
  37. )
  38. )
  39. assert(
  40. await queuedRead2.then(
  41. () => null,
  42. (err) => err
  43. )
  44. )
  45. client.end()
  46. })
  47. })
  48. describe('read callback does not fire sync', () => {
  49. it('does not fire error callback sync', (done) => {
  50. const client = new pg.Client()
  51. client.connect()
  52. const cursor = client.query(new Cursor('asdfdffsdf'))
  53. let after = false
  54. cursor.read(1, function (err) {
  55. assert(err, 'error should be returned')
  56. assert.strictEqual(after, true, 'should not call read sync')
  57. after = false
  58. cursor.read(1, function (err) {
  59. assert(err, 'error should be returned')
  60. assert.strictEqual(after, true, 'should not call read sync')
  61. client.end()
  62. done()
  63. })
  64. after = true
  65. })
  66. after = true
  67. })
  68. it('does not fire result sync after finished', (done) => {
  69. const client = new pg.Client()
  70. client.connect()
  71. const cursor = client.query(new Cursor('SELECT NOW()'))
  72. let after = false
  73. cursor.read(1, function (err) {
  74. assert(!err)
  75. assert.strictEqual(after, true, 'should not call read sync')
  76. cursor.read(1, function (err) {
  77. assert(!err)
  78. after = false
  79. cursor.read(1, function (err) {
  80. assert(!err)
  81. assert.strictEqual(after, true, 'should not call read sync')
  82. client.end()
  83. done()
  84. })
  85. after = true
  86. })
  87. })
  88. after = true
  89. })
  90. })
  91. describe('proper cleanup', function () {
  92. it('can issue multiple cursors on one client', function (done) {
  93. const client = new pg.Client()
  94. client.connect()
  95. const cursor1 = client.query(new Cursor(text))
  96. cursor1.read(8, function (err, rows) {
  97. assert.ifError(err)
  98. assert.strictEqual(rows.length, 5)
  99. const cursor2 = client.query(new Cursor(text))
  100. cursor2.read(8, function (err, rows) {
  101. assert.ifError(err)
  102. assert.strictEqual(rows.length, 5)
  103. client.end()
  104. done()
  105. })
  106. })
  107. })
  108. })