From 82dfd8d70f40f8f4ced5ff7a1ae542f37d25bf27 Mon Sep 17 00:00:00 2001 From: Siddhant Rai Date: Wed, 13 May 2026 14:10:02 +0530 Subject: [PATCH] fix(mongodb): standardize configuration keys and enhance read preference documentation --- drivers/mongodb/README.md | 8 +- drivers/mongodb/internal/config.go | 12 ++- drivers/mongodb/internal/config_test.go | 102 ++++++++++++++++++ drivers/mongodb/internal/testdata/source.json | 6 +- drivers/mongodb/resources/spec.json | 2 +- 5 files changed, 119 insertions(+), 11 deletions(-) create mode 100644 drivers/mongodb/internal/config_test.go diff --git a/drivers/mongodb/README.md b/drivers/mongodb/README.md index 00f5feca8..0a052eda9 100644 --- a/drivers/mongodb/README.md +++ b/drivers/mongodb/README.md @@ -36,10 +36,10 @@ Add MongoDB credentials in following format in `config.json` file. To check more "username": "test", "password": "test", "authdb": "admin", - "replica-set": "rs0", - "read-preference": "secondaryPreferred", + "replica_set": "rs0", + "read_preference": "secondaryPreferred", "srv": false, - "server-ram": 16, + "server_ram": 16, "database": "database", "max_threads": 50, "backoff_retry_count": 2, @@ -47,6 +47,8 @@ Add MongoDB credentials in following format in `config.json` file. To check more } ``` +`read_preference` applies to both SRV and replica set connections. For SRV-based connections, set `srv` to `true` and leave `replica_set` empty. + ## Commands ### Discover Command The *Discover* command generates json content for `streams.json` file, which defines the schema of the collections to be synced. diff --git a/drivers/mongodb/internal/config.go b/drivers/mongodb/internal/config.go index 774b9bd2a..f1402520c 100644 --- a/drivers/mongodb/internal/config.go +++ b/drivers/mongodb/internal/config.go @@ -51,10 +51,14 @@ func (c *Config) URI() string { if c.ReplicaSet != "" { query.Set("replicaSet", c.ReplicaSet) - if c.ReadPreference == "" { - c.ReadPreference = constants.DefaultReadPreference - } - query.Set("readPreference", c.ReadPreference) + } + + readPreference := c.ReadPreference + if readPreference == "" && (c.ReplicaSet != "" || c.Srv) { + readPreference = constants.DefaultReadPreference + } + if readPreference != "" { + query.Set("readPreference", readPreference) } host := strings.Join(c.Hosts, ",") diff --git a/drivers/mongodb/internal/config_test.go b/drivers/mongodb/internal/config_test.go new file mode 100644 index 000000000..72f1a45a4 --- /dev/null +++ b/drivers/mongodb/internal/config_test.go @@ -0,0 +1,102 @@ +package driver + +import ( + "strings" + "testing" +) + +func TestConfig_URI(t *testing.T) { + tests := []struct { + name string + config *Config + expectedContains []string + notExpected []string + }{ + { + // Leaves read preference unset for standalone non-SRV connections. + name: "without replica set or srv", + config: &Config{ + Hosts: []string{"mongo.internal:27017"}, + Username: "mongodb", + Password: "secret", + AuthDB: "admin", + }, + expectedContains: []string{ + "mongodb://mongodb:secret@mongo.internal:27017/", + "authSource=admin", + }, + notExpected: []string{ + "readPreference=", + "replicaSet=", + }, + }, + { + // Preserves the default read preference for replica set connections. + name: "with replica set and default read preference", + config: &Config{ + Hosts: []string{"mongo-1.internal:27017", "mongo-2.internal:27017"}, + Username: "mongodb", + Password: "secret", + AuthDB: "admin", + ReplicaSet: "rs0", + }, + expectedContains: []string{ + "replicaSet=rs0", + "readPreference=secondaryPreferred", + }, + }, + { + // Applies the default read preference for SRV-based connections. + name: "with srv and default read preference", + config: &Config{ + Hosts: []string{"cluster0.example.mongodb.net"}, + Username: "mongodb", + Password: "secret", + AuthDB: "admin", + Srv: true, + }, + expectedContains: []string{ + "mongodb+srv://mongodb:secret@cluster0.example.mongodb.net/", + "readPreference=secondaryPreferred", + }, + notExpected: []string{ + "replicaSet=", + }, + }, + { + // Honors an explicit read preference without requiring a replica set name. + name: "with explicit read preference and no replica set", + config: &Config{ + Hosts: []string{"mongo.internal:27017"}, + Username: "mongodb", + Password: "secret", + AuthDB: "admin", + ReadPreference: "nearest", + }, + expectedContains: []string{ + "readPreference=nearest", + }, + notExpected: []string{ + "replicaSet=", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + uri := tt.config.URI() + + for _, expected := range tt.expectedContains { + if !strings.Contains(uri, expected) { + t.Errorf("expected URI to contain %q, got %s", expected, uri) + } + } + + for _, notExpected := range tt.notExpected { + if strings.Contains(uri, notExpected) { + t.Errorf("expected URI to not contain %q, got %s", notExpected, uri) + } + } + }) + } +} diff --git a/drivers/mongodb/internal/testdata/source.json b/drivers/mongodb/internal/testdata/source.json index 7274eb09b..14660f7a4 100644 --- a/drivers/mongodb/internal/testdata/source.json +++ b/drivers/mongodb/internal/testdata/source.json @@ -3,10 +3,10 @@ "username": "mongodb", "password": "secure_password123", "authdb": "admin", - "replica-set": "rs0", - "read-preference": "secondaryPreferred", + "replica_set": "rs0", + "read_preference": "secondaryPreferred", "srv": false, - "server-ram": 16, + "server_ram": 16, "database": "olake_mongodb_test", "max_threads": 5, "backoff_retry_count": 4 diff --git a/drivers/mongodb/resources/spec.json b/drivers/mongodb/resources/spec.json index 2a2cd0d17..a1e050ab2 100644 --- a/drivers/mongodb/resources/spec.json +++ b/drivers/mongodb/resources/spec.json @@ -52,7 +52,7 @@ "read_preference": { "type": "string", "title": "Read Preference", - "description": "Read preference for MongoDB (e.g., secondaryPreferred)" + "description": "Read preference for MongoDB (e.g., secondaryPreferred). Applies to both SRV and replica set connections." }, "replica_set": { "type": "string",