Skip to content

Commit 315171f

Browse files
authored
GODRIVER-2704 Replace input validation error constants with "InvalidArgumentError". (#1989)
1 parent 31ef273 commit 315171f

File tree

10 files changed

+66
-48
lines changed

10 files changed

+66
-48
lines changed

internal/integration/collection_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package integration
88

99
import (
1010
"context"
11+
"errors"
1112
"strings"
1213
"testing"
1314

@@ -532,7 +533,7 @@ func TestCollection(t *testing.T) {
532533
})
533534
mt.Run("nil id", func(mt *mtest.T) {
534535
_, err := mt.Coll.UpdateByID(context.Background(), nil, bson.D{{"$inc", bson.D{{"x", 1}}}})
535-
assert.Equal(mt, err, mongo.ErrNilValue, "expected %v, got %v", mongo.ErrNilValue, err)
536+
assert.True(mt, errors.Is(err, mongo.ErrNilValue), "expected %v, got %v", mongo.ErrNilValue, err)
536537
})
537538
mt.RunOpts("found", noClientOpts, func(mt *mtest.T) {
538539
testCases := []struct {

mongo/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ func (c *Client) BulkWrite(ctx context.Context, writes []ClientBulkWrite,
889889
}
890890

891891
if len(writes) == 0 {
892-
return nil, ErrEmptySlice
892+
return nil, fmt.Errorf("invalid writes: %w", ErrEmptySlice)
893893
}
894894
bwo, err := mongoutil.NewOptions(opts...)
895895
if err != nil {

mongo/client_bulk_write.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ type clientBulkWrite struct {
5050

5151
func (bw *clientBulkWrite) execute(ctx context.Context) error {
5252
if len(bw.writePairs) == 0 {
53-
return ErrEmptySlice
53+
return fmt.Errorf("invalid writes: %w", ErrEmptySlice)
5454
}
55-
for _, m := range bw.writePairs {
55+
for i, m := range bw.writePairs {
5656
if m.model == nil {
57-
return ErrNilDocument
57+
return fmt.Errorf("error from model at index %d: %w", i, ErrNilDocument)
5858
}
5959
}
6060
batches := &modelBatches{

mongo/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ func TestClient(t *testing.T) {
8181
assert.Equal(t, watchErr, err, "expected error %v, got %v", watchErr, err)
8282

8383
_, err = client.ListDatabases(bgCtx, nil)
84-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
84+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
8585

8686
_, err = client.ListDatabaseNames(bgCtx, nil)
87-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
87+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
8888
})
8989
t.Run("read preference", func(t *testing.T) {
9090
t.Run("absent", func(t *testing.T) {

mongo/collection.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ func (coll *Collection) BulkWrite(ctx context.Context, models []WriteModel,
193193
opts ...options.Lister[options.BulkWriteOptions]) (*BulkWriteResult, error) {
194194

195195
if len(models) == 0 {
196-
return nil, ErrEmptySlice
196+
return nil, fmt.Errorf("invalid models: %w", ErrEmptySlice)
197197
}
198198

199199
if ctx == nil {
@@ -221,9 +221,9 @@ func (coll *Collection) BulkWrite(ctx context.Context, models []WriteModel,
221221

222222
selector := makePinnedSelector(sess, coll.writeSelector)
223223

224-
for _, model := range models {
224+
for i, model := range models {
225225
if model == nil {
226-
return nil, ErrNilDocument
226+
return nil, fmt.Errorf("invalid model at index %d: %w", i, ErrNilDocument)
227227
}
228228
}
229229

@@ -407,10 +407,10 @@ func (coll *Collection) InsertMany(
407407

408408
dv := reflect.ValueOf(documents)
409409
if dv.Kind() != reflect.Slice {
410-
return nil, ErrNotSlice
410+
return nil, fmt.Errorf("invalid documents: %w", ErrNotSlice)
411411
}
412412
if dv.Len() == 0 {
413-
return nil, ErrEmptySlice
413+
return nil, fmt.Errorf("invalid documents: %w", ErrEmptySlice)
414414
}
415415

416416
docSlice := make([]interface{}, 0, dv.Len())
@@ -729,7 +729,7 @@ func (coll *Collection) UpdateByID(
729729
opts ...options.Lister[options.UpdateOneOptions],
730730
) (*UpdateResult, error) {
731731
if id == nil {
732-
return nil, ErrNilValue
732+
return nil, fmt.Errorf("invalid id: %w", ErrNilValue)
733733
}
734734
return coll.UpdateOne(ctx, bson.D{{"_id", id}}, update, opts...)
735735
}

mongo/collection_test.go

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -150,76 +150,76 @@ func TestCollection(t *testing.T) {
150150
doc := bson.D{}
151151

152152
_, err := coll.InsertOne(bgCtx, nil)
153-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
153+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
154154

155155
_, err = coll.InsertMany(bgCtx, nil)
156-
assert.Equal(t, ErrNotSlice, err, "expected error %v, got %v", ErrNotSlice, err)
156+
assert.True(t, errors.Is(err, ErrNotSlice), "expected error %v, got %v", ErrNotSlice, err)
157157

158158
_, err = coll.InsertMany(bgCtx, []interface{}{})
159-
assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
159+
assert.True(t, errors.Is(err, ErrEmptySlice), "expected error %v, got %v", ErrEmptySlice, err)
160160

161161
_, err = coll.InsertMany(bgCtx, "x")
162-
assert.Equal(t, ErrNotSlice, err, "expected error %v, got %v", ErrNotSlice, err)
162+
assert.True(t, errors.Is(err, ErrNotSlice), "expected error %v, got %v", ErrNotSlice, err)
163163

164164
_, err = coll.DeleteOne(bgCtx, nil)
165-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
165+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
166166

167167
_, err = coll.DeleteMany(bgCtx, nil)
168-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
168+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
169169

170170
_, err = coll.UpdateOne(bgCtx, nil, doc)
171-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
171+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
172172

173173
_, err = coll.UpdateOne(bgCtx, doc, nil)
174-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
174+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
175175

176176
_, err = coll.UpdateMany(bgCtx, nil, doc)
177-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
177+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
178178

179179
_, err = coll.UpdateMany(bgCtx, doc, nil)
180-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
180+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
181181

182182
_, err = coll.ReplaceOne(bgCtx, nil, doc)
183-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
183+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
184184

185185
_, err = coll.ReplaceOne(bgCtx, doc, nil)
186-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
186+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
187187

188188
_, err = coll.CountDocuments(bgCtx, nil)
189-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
189+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
190190

191191
err = coll.Distinct(bgCtx, "x", nil).Err()
192-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
192+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
193193

194194
_, err = coll.Find(bgCtx, nil)
195-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
195+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
196196

197197
err = coll.FindOne(bgCtx, nil).Err()
198-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
198+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
199199

200200
err = coll.FindOneAndDelete(bgCtx, nil).Err()
201-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
201+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
202202

203203
err = coll.FindOneAndReplace(bgCtx, nil, doc).Err()
204-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
204+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
205205

206206
err = coll.FindOneAndReplace(bgCtx, doc, nil).Err()
207-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
207+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
208208

209209
err = coll.FindOneAndUpdate(bgCtx, nil, doc).Err()
210-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
210+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
211211

212212
err = coll.FindOneAndUpdate(bgCtx, doc, nil).Err()
213-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
213+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
214214

215215
_, err = coll.BulkWrite(bgCtx, nil)
216-
assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
216+
assert.True(t, errors.Is(err, ErrEmptySlice), "expected error %v, got %v", ErrEmptySlice, err)
217217

218218
_, err = coll.BulkWrite(bgCtx, []WriteModel{})
219-
assert.Equal(t, ErrEmptySlice, err, "expected error %v, got %v", ErrEmptySlice, err)
219+
assert.True(t, errors.Is(err, ErrEmptySlice), "expected error %v, got %v", ErrEmptySlice, err)
220220

221221
_, err = coll.BulkWrite(bgCtx, []WriteModel{nil})
222-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
222+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
223223

224224
aggErr := errors.New("can only marshal slices and arrays into aggregation pipelines, but got invalid")
225225
_, err = coll.Aggregate(bgCtx, nil)

mongo/cursor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func NewCursorFromDocuments(documents []interface{}, preloadedErr error, registr
9797
for i, doc := range documents {
9898
switch t := doc.(type) {
9999
case nil:
100-
return nil, ErrNilDocument
100+
return nil, fmt.Errorf("invalid document at index %d: %w", i, ErrNilDocument)
101101
case []byte:
102102
// Slight optimization so we'll just use MarshalBSON and not go through the codec machinery.
103103
doc = bson.Raw(t)

mongo/database_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,16 +141,16 @@ func TestDatabase(t *testing.T) {
141141
db := setupDb("foo")
142142

143143
err := db.RunCommand(bgCtx, nil).Err()
144-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
144+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
145145

146146
_, err = db.Watch(context.Background(), nil)
147147
watchErr := errors.New("can only marshal slices and arrays into aggregation pipelines, but got invalid")
148148
assert.Equal(t, watchErr, err, "expected error %v, got %v", watchErr, err)
149149

150150
_, err = db.ListCollections(context.Background(), nil)
151-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
151+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
152152

153153
_, err = db.ListCollectionNames(context.Background(), nil)
154-
assert.Equal(t, ErrNilDocument, err, "expected error %v, got %v", ErrNilDocument, err)
154+
assert.True(t, errors.Is(err, ErrNilDocument), "expected error %v, got %v", ErrNilDocument, err)
155155
})
156156
}

mongo/errors.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,35 @@ import (
2424
// ErrClientDisconnected is returned when disconnected Client is used to run an operation.
2525
var ErrClientDisconnected = errors.New("client is disconnected")
2626

27+
// InvalidArgumentError wraps an invalid argument error.
28+
type InvalidArgumentError struct {
29+
wrapped error
30+
}
31+
32+
// Error implements the error interface.
33+
func (e InvalidArgumentError) Error() string {
34+
return e.wrapped.Error()
35+
}
36+
37+
// Unwrap returns the underlying error.
38+
func (e InvalidArgumentError) Unwrap() error {
39+
return e.wrapped
40+
}
41+
42+
// ErrMultipleIndexDrop is returned if multiple indexes would be dropped from a call to IndexView.DropOne.
43+
var ErrMultipleIndexDrop error = InvalidArgumentError{errors.New("multiple indexes would be dropped")}
44+
2745
// ErrNilDocument is returned when a nil document is passed to a CRUD method.
28-
var ErrNilDocument = errors.New("document is nil")
46+
var ErrNilDocument error = InvalidArgumentError{errors.New("document is nil")}
2947

3048
// ErrNilValue is returned when a nil value is passed to a CRUD method.
31-
var ErrNilValue = errors.New("value is nil")
49+
var ErrNilValue error = InvalidArgumentError{errors.New("value is nil")}
3250

3351
// ErrEmptySlice is returned when an empty slice is passed to a CRUD method that requires a non-empty slice.
34-
var ErrEmptySlice = errors.New("must provide at least one element in input slice")
52+
var ErrEmptySlice error = InvalidArgumentError{errors.New("must provide at least one element in input slice")}
3553

3654
// ErrNotSlice is returned when a type other than slice is passed to InsertMany.
37-
var ErrNotSlice = errors.New("must provide a non-empty slice")
55+
var ErrNotSlice error = InvalidArgumentError{errors.New("must provide a non-empty slice")}
3856

3957
// ErrMapForOrderedArgument is returned when a map with multiple keys is passed to a CRUD method for an ordered parameter
4058
type ErrMapForOrderedArgument struct {

mongo/index_view.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,10 @@ import (
2929
var ErrInvalidIndexValue = errors.New("invalid index value")
3030

3131
// ErrNonStringIndexName is returned if an index is created with a name that is not a string.
32+
//
33+
// Deprecated: it will be removed in the next major release
3234
var ErrNonStringIndexName = errors.New("index name must be a string")
3335

34-
// ErrMultipleIndexDrop is returned if multiple indexes would be dropped from a call to IndexView.DropOne.
35-
var ErrMultipleIndexDrop = errors.New("multiple indexes would be dropped")
36-
3736
// IndexView is a type that can be used to create, drop, and list indexes on a collection. An IndexView for a collection
3837
// can be created by a call to Collection.Indexes().
3938
type IndexView struct {

0 commit comments

Comments
 (0)