UNPKG

3.41 kBJavaScriptView Raw
1'use strict'
2
3const expect = require('expect.js')
4const EventEmitter = require('events').EventEmitter
5const describe = require('mocha').describe
6const it = require('mocha').it
7const Pool = require('../')
8
9describe('events', function () {
10 it('emits connect before callback', function (done) {
11 const pool = new Pool()
12 let emittedClient = false
13 pool.on('connect', function (client) {
14 emittedClient = client
15 })
16
17 pool.connect(function (err, client, release) {
18 if (err) return done(err)
19 release()
20 pool.end()
21 expect(client).to.be(emittedClient)
22 done()
23 })
24 })
25
26 it('emits "connect" only with a successful connection', function () {
27 const pool = new Pool({
28 // This client will always fail to connect
29 Client: mockClient({
30 connect: function (cb) {
31 process.nextTick(() => {
32 cb(new Error('bad news'))
33 })
34 },
35 }),
36 })
37 pool.on('connect', function () {
38 throw new Error('should never get here')
39 })
40 return pool.connect().catch((e) => expect(e.message).to.equal('bad news'))
41 })
42
43 it('emits acquire every time a client is acquired', function (done) {
44 const pool = new Pool()
45 let acquireCount = 0
46 pool.on('acquire', function (client) {
47 expect(client).to.be.ok()
48 acquireCount++
49 })
50 for (let i = 0; i < 10; i++) {
51 pool.connect(function (err, client, release) {
52 if (err) return done(err)
53 release()
54 })
55 pool.query('SELECT now()')
56 }
57 setTimeout(function () {
58 expect(acquireCount).to.be(20)
59 pool.end(done)
60 }, 100)
61 })
62
63 it('emits release every time a client is released', function (done) {
64 const pool = new Pool()
65 let releaseCount = 0
66 pool.on('release', function (err, client) {
67 expect(err instanceof Error).not.to.be(true)
68 expect(client).to.be.ok()
69 releaseCount++
70 })
71 const promises = []
72 for (let i = 0; i < 10; i++) {
73 pool.connect(function (err, client, release) {
74 if (err) return done(err)
75 release()
76 })
77 promises.push(pool.query('SELECT now()'))
78 }
79 Promise.all(promises).then(() => {
80 pool.end(() => {
81 expect(releaseCount).to.be(20)
82 done()
83 })
84 })
85 })
86
87 it('emits release with an error if client is released due to an error', function (done) {
88 const pool = new Pool()
89 pool.connect(function (err, client, release) {
90 expect(err).to.equal(undefined)
91 const releaseError = new Error('problem')
92 pool.once('release', function (err, errClient) {
93 expect(err).to.equal(releaseError)
94 expect(errClient).to.equal(client)
95 pool.end(done)
96 })
97 release(releaseError)
98 })
99 })
100
101 it('emits error and client if an idle client in the pool hits an error', function (done) {
102 const pool = new Pool()
103 pool.connect(function (err, client) {
104 expect(err).to.equal(undefined)
105 client.release()
106 setImmediate(function () {
107 client.emit('error', new Error('problem'))
108 })
109 pool.once('error', function (err, errClient) {
110 expect(err.message).to.equal('problem')
111 expect(errClient).to.equal(client)
112 done()
113 })
114 })
115 })
116})
117
118function mockClient(methods) {
119 return function () {
120 const client = new EventEmitter()
121 Object.assign(client, methods)
122 return client
123 }
124}