1
2
3
4
5
6
7 package mongo
8
9 import (
10 "errors"
11 "testing"
12
13 "go.mongodb.org/mongo-driver/bson"
14 "go.mongodb.org/mongo-driver/internal/assert"
15 "go.mongodb.org/mongo-driver/mongo/options"
16 "go.mongodb.org/mongo-driver/mongo/readconcern"
17 "go.mongodb.org/mongo-driver/mongo/readpref"
18 "go.mongodb.org/mongo-driver/mongo/writeconcern"
19 )
20
21 const (
22 testDbName = "unitTestDb"
23 )
24
25 func setupColl(name string, opts ...*options.CollectionOptions) *Collection {
26 db := setupDb(testDbName)
27 return db.Collection(name, opts...)
28 }
29
30 func compareColls(t *testing.T, expected *Collection, got *Collection) {
31 assert.Equal(t, expected.readPreference, got.readPreference,
32 "mismatch; expected read preference %v, got %v", expected.readPreference, got.readPreference)
33 assert.Equal(t, expected.readConcern, got.readConcern,
34 "mismatch; expected read concern %v, got %v", expected.readConcern, got.readConcern)
35 assert.Equal(t, expected.writeConcern, got.writeConcern,
36 "mismatch; expected write concern %v, got %v", expected.writeConcern, got.writeConcern)
37 }
38
39 func TestCollection(t *testing.T) {
40 t.Run("initialize", func(t *testing.T) {
41 name := "foo"
42 coll := setupColl(name)
43 assert.Equal(t, name, coll.Name(), "expected coll name %v, got %v", name, coll.Name())
44 assert.NotNil(t, coll.Database(), "expected valid database, got nil")
45 })
46 t.Run("specified options", func(t *testing.T) {
47 rpPrimary := readpref.Primary()
48 rpSecondary := readpref.Secondary()
49 wc1 := writeconcern.New(writeconcern.W(5))
50 wc2 := writeconcern.New(writeconcern.W(10))
51 rcLocal := readconcern.Local()
52 rcMajority := readconcern.Majority()
53
54 opts := options.Collection().SetReadPreference(rpPrimary).SetReadConcern(rcLocal).SetWriteConcern(wc1).
55 SetReadPreference(rpSecondary).SetReadConcern(rcMajority).SetWriteConcern(wc2)
56 expected := &Collection{
57 readConcern: rcMajority,
58 readPreference: rpSecondary,
59 writeConcern: wc2,
60 }
61 got := setupColl("foo", opts)
62 compareColls(t, expected, got)
63 })
64 t.Run("inherit options", func(t *testing.T) {
65 rpPrimary := readpref.Primary()
66 rcLocal := readconcern.Local()
67 wc1 := writeconcern.New(writeconcern.W(10))
68
69 db := setupDb("foo", options.Database().SetReadPreference(rpPrimary).SetReadConcern(rcLocal))
70 coll := db.Collection("bar", options.Collection().SetWriteConcern(wc1))
71 expected := &Collection{
72 readPreference: rpPrimary,
73 readConcern: rcLocal,
74 writeConcern: wc1,
75 }
76 compareColls(t, expected, coll)
77 })
78 t.Run("replace topology error", func(t *testing.T) {
79 coll := setupColl("foo")
80 doc := bson.D{}
81 update := bson.D{{"$update", bson.D{{"x", 1}}}}
82
83 _, err := coll.InsertOne(bgCtx, doc)
84 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
85
86 _, err = coll.InsertMany(bgCtx, []interface{}{doc})
87 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
88
89 _, err = coll.DeleteOne(bgCtx, doc)
90 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
91
92 _, err = coll.DeleteMany(bgCtx, doc)
93 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
94
95 _, err = coll.UpdateOne(bgCtx, doc, update)
96 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
97
98 _, err = coll.UpdateMany(bgCtx, doc, update)
99 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
100
101 _, err = coll.ReplaceOne(bgCtx, doc, doc)
102 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
103
104 _, err = coll.Aggregate(bgCtx, Pipeline{})
105 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
106
107 _, err = coll.EstimatedDocumentCount(bgCtx)
108 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
109
110 _, err = coll.CountDocuments(bgCtx, doc)
111 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
112
113 _, err = coll.Distinct(bgCtx, "x", doc)
114 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
115
116 _, err = coll.Find(bgCtx, doc)
117 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
118
119 err = coll.FindOne(bgCtx, doc).Err()
120 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
121
122 err = coll.FindOneAndDelete(bgCtx, doc).Err()
123 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
124
125 err = coll.FindOneAndReplace(bgCtx, doc, doc).Err()
126 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
127
128 err = coll.FindOneAndUpdate(bgCtx, doc, update).Err()
129 assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
130 })
131 t.Run("database accessor", func(t *testing.T) {
132 coll := setupColl("bar")
133 dbName := coll.Database().Name()
134 assert.Equal(t, testDbName, dbName, "expected db name %v, got %v", testDbName, dbName)
135 })
136 t.Run("nil document error", func(t *testing.T) {
137 coll := setupColl("foo")
138 doc := bson.D{}
139
140 _, err := coll.InsertOne(bgCtx, nil)
141 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
142
143 _, err = coll.InsertMany(bgCtx, nil)
144 assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
145
146 _, err = coll.InsertMany(bgCtx, []interface{}{})
147 assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
148
149 _, err = coll.DeleteOne(bgCtx, nil)
150 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
151
152 _, err = coll.DeleteMany(bgCtx, nil)
153 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
154
155 _, err = coll.UpdateOne(bgCtx, nil, doc)
156 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
157
158 _, err = coll.UpdateOne(bgCtx, doc, nil)
159 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
160
161 _, err = coll.UpdateMany(bgCtx, nil, doc)
162 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
163
164 _, err = coll.UpdateMany(bgCtx, doc, nil)
165 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
166
167 _, err = coll.ReplaceOne(bgCtx, nil, doc)
168 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
169
170 _, err = coll.ReplaceOne(bgCtx, doc, nil)
171 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
172
173 _, err = coll.CountDocuments(bgCtx, nil)
174 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
175
176 _, err = coll.Distinct(bgCtx, "x", nil)
177 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
178
179 _, err = coll.Find(bgCtx, nil)
180 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
181
182 err = coll.FindOne(bgCtx, nil).Err()
183 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
184
185 err = coll.FindOneAndDelete(bgCtx, nil).Err()
186 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
187
188 err = coll.FindOneAndReplace(bgCtx, nil, doc).Err()
189 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
190
191 err = coll.FindOneAndReplace(bgCtx, doc, nil).Err()
192 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
193
194 err = coll.FindOneAndUpdate(bgCtx, nil, doc).Err()
195 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
196
197 err = coll.FindOneAndUpdate(bgCtx, doc, nil).Err()
198 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
199
200 _, err = coll.BulkWrite(bgCtx, nil)
201 assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
202
203 _, err = coll.BulkWrite(bgCtx, []WriteModel{})
204 assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
205
206 _, err = coll.BulkWrite(bgCtx, []WriteModel{nil})
207 assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
208
209 aggErr := errors.New("can only marshal slices and arrays into aggregation pipelines, but got invalid")
210 _, err = coll.Aggregate(bgCtx, nil)
211 assert.Equal(t, aggErr, err, "expected error %v, got %v", aggErr, err)
212
213 _, err = coll.Watch(bgCtx, nil)
214 assert.Equal(t, aggErr, err, "expected error %v, got %v", aggErr, err)
215 })
216 }
217
View as plain text