@@ -3,6 +3,7 @@ const test = require('./shared').assert;
3
3
const setupDatabase = require ( './shared' ) . setupDatabase ;
4
4
const expect = require ( 'chai' ) . expect ;
5
5
const Buffer = require ( 'safe-buffer' ) . Buffer ;
6
+ const sinon = require ( 'sinon' ) ;
6
7
7
8
describe ( 'Find' , function ( ) {
8
9
before ( function ( ) {
@@ -3121,4 +3122,45 @@ describe('Find', function() {
3121
3122
} ) ;
3122
3123
}
3123
3124
} ) ;
3125
+
3126
+ it ( 'should respect client-level read preference' , {
3127
+ metadata : { requires : { topology : [ 'replicaset' ] } } ,
3128
+
3129
+ test : function ( done ) {
3130
+ const config = this . configuration ;
3131
+ const client = config . newClient ( { } , { monitorCommands : true , readPreference : 'secondary' } ) ;
3132
+
3133
+ if ( ! config . usingUnifiedTopology ( ) ) {
3134
+ this . skip ( ) ;
3135
+ return ;
3136
+ }
3137
+
3138
+ client . connect ( ( err , client ) => {
3139
+ expect ( err ) . to . not . exist ;
3140
+
3141
+ let selectedServer ;
3142
+ const selectServerStub = sinon . stub ( client . topology , 'selectServer' ) . callsFake ( function ( ) {
3143
+ const args = Array . prototype . slice . call ( arguments ) ;
3144
+ const originalCallback = args . pop ( ) ;
3145
+ args . push ( ( err , server ) => {
3146
+ selectedServer = server ;
3147
+ originalCallback ( err , server ) ;
3148
+ } ) ;
3149
+
3150
+ return client . topology . selectServer . wrappedMethod . apply ( this , args ) ;
3151
+ } ) ;
3152
+
3153
+ const collection = client . db ( ) . collection ( 'test_read_preference' ) ;
3154
+ collection . find ( ) . toArray ( err => {
3155
+ expect ( err ) . to . not . exist ;
3156
+ expect ( selectedServer . description . type ) . to . eql ( 'RSSecondary' ) ;
3157
+
3158
+ client . close ( err => {
3159
+ selectServerStub . restore ( ) ;
3160
+ done ( err ) ;
3161
+ } ) ;
3162
+ } ) ;
3163
+ } ) ;
3164
+ }
3165
+ } ) ;
3124
3166
} ) ;
0 commit comments