@@ -4,7 +4,7 @@ const mock = require('../../tools/mongodb-mock/index');
4
4
const { expect } = require ( 'chai' ) ;
5
5
const sinon = require ( 'sinon' ) ;
6
6
const net = require ( 'net' ) ;
7
- const { MongoClient, ReadPreference } = require ( '../../../src' ) ;
7
+ const { MongoClient, MongoServerSelectionError , ReadPreference } = require ( '../../../src' ) ;
8
8
const { Topology } = require ( '../../../src/sdam/topology' ) ;
9
9
const { Server } = require ( '../../../src/sdam/server' ) ;
10
10
const { ServerDescription } = require ( '../../../src/sdam/server_description' ) ;
@@ -190,8 +190,73 @@ describe('Topology (unit)', function () {
190
190
191
191
describe ( 'error handling' , function ( ) {
192
192
let mockServer ;
193
- beforeEach ( ( ) => mock . createServer ( ) . then ( server => ( mockServer = server ) ) ) ;
194
- afterEach ( ( ) => mock . cleanup ( ) ) ;
193
+ let secondMockServer ;
194
+ beforeEach ( async ( ) => {
195
+ await mock . createServer ( 27218 ) . then ( server => ( mockServer = server ) ) ;
196
+ await mock . createServer ( 27219 ) . then ( server => ( secondMockServer = server ) ) ;
197
+ } ) ;
198
+ afterEach ( async ( ) => {
199
+ await mock . cleanup ( ) ;
200
+ sinon . restore ( ) ;
201
+ } ) ;
202
+
203
+ context (
204
+ 'when server selection returns a server description but the description is not in the topology' ,
205
+ function ( ) {
206
+ beforeEach ( ( ) => {
207
+ mockServer . setMessageHandler ( request => {
208
+ const doc = request . document ;
209
+ if ( isHello ( doc ) ) {
210
+ request . reply ( Object . assign ( { } , mock . HELLO , { maxWireVersion : 9 } ) ) ;
211
+ } else {
212
+ request . reply ( { ok : 1 } ) ;
213
+ }
214
+ } ) ;
215
+ secondMockServer . setMessageHandler ( request => {
216
+ const doc = request . document ;
217
+ if ( isHello ( doc ) ) {
218
+ request . reply ( Object . assign ( { } , mock . HELLO , { maxWireVersion : 9 } ) ) ;
219
+ } else {
220
+ request . reply ( { ok : 1 } ) ;
221
+ }
222
+ } ) ;
223
+ } ) ;
224
+ context ( 'when the topology originally only contained one server' , function ( ) {
225
+ it ( 'returns a MongoServerSelectionError' , function ( done ) {
226
+ topology = new Topology ( [ mockServer . hostAddress ( ) , secondMockServer . hostAddress ( ) ] ) ;
227
+
228
+ topology . connect ( err => {
229
+ expect ( err ) . to . not . exist ;
230
+ sinon . stub ( topology . s . servers , 'get' ) . callsFake ( ( ) => {
231
+ return undefined ;
232
+ } ) ;
233
+ topology . selectServer ( 'primary' , { } , ( err , server ) => {
234
+ expect ( err ) . to . be . instanceOf ( MongoServerSelectionError ) ;
235
+ expect ( server ) . not . to . exist ;
236
+ done ( ) ;
237
+ } ) ;
238
+ } ) ;
239
+ } ) ;
240
+ } ) ;
241
+ context ( 'when the topology originally contained more than one server' , function ( ) {
242
+ it ( 'returns a MongoServerSelectionError' , function ( done ) {
243
+ topology = new Topology ( [ mockServer . hostAddress ( ) , secondMockServer . hostAddress ( ) ] ) ;
244
+
245
+ topology . connect ( err => {
246
+ expect ( err ) . to . not . exist ;
247
+ sinon . stub ( topology . s . servers , 'get' ) . callsFake ( ( ) => {
248
+ return undefined ;
249
+ } ) ;
250
+ topology . selectServer ( 'primary' , { } , ( err , server ) => {
251
+ expect ( err ) . to . be . instanceOf ( MongoServerSelectionError ) ;
252
+ expect ( server ) . not . to . exist ;
253
+ done ( ) ;
254
+ } ) ;
255
+ } ) ;
256
+ } ) ;
257
+ } ) ;
258
+ }
259
+ ) ;
195
260
196
261
it ( 'should set server to unknown and reset pool on `node is recovering` error' , function ( done ) {
197
262
mockServer . setMessageHandler ( request => {
0 commit comments