...

Source file src/go.mongodb.org/mongo-driver/mongo/collection_test.go

Documentation: go.mongodb.org/mongo-driver/mongo

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     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