From b657c8c4f3f86018cc4824f84cb22e1527d9f9af Mon Sep 17 00:00:00 2001 From: Eric Adum Date: Mon, 25 Jan 2021 09:11:25 -0500 Subject: [PATCH] fix: respect readPreference and writeConcern from connection string (#2711) NODE-2965 --- lib/operations/connect.js | 4 ++++ test/functional/readpreference.test.js | 32 +++++++++++++++++++++++++- test/functional/write_concern.test.js | 24 +++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/lib/operations/connect.js b/lib/operations/connect.js index 0d7825d4d6..2f3bff96bf 100644 --- a/lib/operations/connect.js +++ b/lib/operations/connect.js @@ -308,6 +308,10 @@ function connect(mongoClient, url, options, callback) { // Store the merged options object mongoClient.s.options = _finalOptions; + // Apply read and write concern from parsed url + mongoClient.s.readPreference = ReadPreference.fromOptions(_finalOptions); + mongoClient.s.writeConcern = WriteConcern.fromOptions(_finalOptions); + // Failure modes if (object.servers.length === 0) { return callback(new Error('connection string must contain at least one seed host')); diff --git a/test/functional/readpreference.test.js b/test/functional/readpreference.test.js index 89bce62b66..c51e4c8efc 100644 --- a/test/functional/readpreference.test.js +++ b/test/functional/readpreference.test.js @@ -4,9 +4,12 @@ const Topology = require('../../lib/core/sdam/topology').Topology; const test = require('./shared').assert; const setupDatabase = require('./shared').setupDatabase; const withMonitoredClient = require('./shared').withMonitoredClient; -const expect = require('chai').expect; + const ReadPreference = require('../../lib/core/topologies/read_preference'); const withClient = require('./shared').withClient; +const chai = require('chai'); +chai.use(require('chai-subset')); +const expect = chai.expect; describe('ReadPreference', function() { before(function() { @@ -729,4 +732,31 @@ describe('ReadPreference', function() { }); }); }); + + it('should respect readPreference from uri', { + metadata: { requires: { topology: 'replicaset', mongodb: '>=3.6' } }, + test: withMonitoredClient('find', { queryOptions: { readPreference: 'secondary' } }, function( + client, + events, + done + ) { + expect(client.readPreference.mode).to.equal('secondary'); + client + .db('test') + .collection('test') + .findOne({ a: 1 }, err => { + expect(err).to.not.exist; + expect(events) + .to.be.an('array') + .with.lengthOf(1); + expect(events[0]).to.containSubset({ + commandName: 'find', + command: { + $readPreference: { mode: 'secondary' } + } + }); + done(); + }); + }) + }); }); diff --git a/test/functional/write_concern.test.js b/test/functional/write_concern.test.js index e7c2b954ca..0f73d5396a 100644 --- a/test/functional/write_concern.test.js +++ b/test/functional/write_concern.test.js @@ -21,6 +21,30 @@ describe('Write Concern', function() { generateTopologyTests(testSuites, testContext); }); + it( + 'should respect writeConcern from uri', + withMonitoredClient('insert', { queryOptions: { w: 0 } }, function(client, events, done) { + expect(client.writeConcern).to.eql({ w: 0 }); + client + .db('test') + .collection('test') + .insertOne({ a: 1 }, (err, result) => { + expect(err).to.not.exist; + expect(result).to.exist; + expect(events) + .to.be.an('array') + .with.lengthOf(1); + expect(events[0]).to.containSubset({ + commandName: 'insert', + command: { + writeConcern: { w: 0 } + } + }); + done(); + }); + }) + ); + // TODO: once `read-write-concern/connection-string` spec tests are implemented these can likely be removed describe('test journal connection string option', function() { function journalOptionTest(client, events, done) {