github.com/lingyao2333/mo-zero@v1.4.1/core/stores/monc/cachedmodel_test.go (about)

     1  package monc
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"sync/atomic"
     7  	"testing"
     8  
     9  	"github.com/alicebob/miniredis/v2"
    10  	"github.com/lingyao2333/mo-zero/core/stores/cache"
    11  	"github.com/lingyao2333/mo-zero/core/stores/mon"
    12  	"github.com/lingyao2333/mo-zero/core/stores/redis"
    13  	"github.com/stretchr/testify/assert"
    14  	"go.mongodb.org/mongo-driver/bson"
    15  	"go.mongodb.org/mongo-driver/mongo/integration/mtest"
    16  )
    17  
    18  func TestNewModel(t *testing.T) {
    19  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
    20  	defer mt.Close()
    21  
    22  	mt.Run("test", func(mt *mtest.T) {
    23  		_, err := newModel("foo", mt.DB.Name(), mt.Coll.Name(), nil)
    24  		assert.NotNil(mt, err)
    25  	})
    26  }
    27  
    28  func TestModel_DelCache(t *testing.T) {
    29  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
    30  	defer mt.Close()
    31  
    32  	mt.Run("test", func(mt *mtest.T) {
    33  		m := createModel(t, mt)
    34  		assert.Nil(t, m.cache.Set("foo", "bar"))
    35  		assert.Nil(t, m.cache.Set("bar", "baz"))
    36  		assert.Nil(t, m.DelCache(context.Background(), "foo", "bar"))
    37  		var v string
    38  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
    39  		assert.True(t, m.cache.IsNotFound(m.cache.Get("bar", &v)))
    40  	})
    41  }
    42  
    43  func TestModel_DeleteOne(t *testing.T) {
    44  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
    45  	defer mt.Close()
    46  
    47  	mt.Run("test", func(mt *mtest.T) {
    48  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
    49  		m := createModel(t, mt)
    50  		assert.Nil(t, m.cache.Set("foo", "bar"))
    51  		val, err := m.DeleteOne(context.Background(), "foo", bson.D{{Key: "foo", Value: "bar"}})
    52  		assert.Nil(t, err)
    53  		assert.Equal(t, int64(1), val)
    54  		var v string
    55  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
    56  		_, err = m.DeleteOne(context.Background(), "foo", bson.D{{Key: "foo", Value: "bar"}})
    57  		assert.NotNil(t, err)
    58  
    59  		m.cache = mockedCache{m.cache}
    60  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
    61  		_, err = m.DeleteOne(context.Background(), "foo", bson.D{{Key: "foo", Value: "bar"}})
    62  		assert.Equal(t, errMocked, err)
    63  	})
    64  }
    65  
    66  func TestModel_DeleteOneNoCache(t *testing.T) {
    67  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
    68  	defer mt.Close()
    69  
    70  	mt.Run("test", func(mt *mtest.T) {
    71  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
    72  		m := createModel(t, mt)
    73  		assert.Nil(t, m.cache.Set("foo", "bar"))
    74  		val, err := m.DeleteOneNoCache(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
    75  		assert.Nil(t, err)
    76  		assert.Equal(t, int64(1), val)
    77  		var v string
    78  		assert.Nil(t, m.cache.Get("foo", &v))
    79  	})
    80  }
    81  
    82  func TestModel_FindOne(t *testing.T) {
    83  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
    84  	defer mt.Close()
    85  
    86  	mt.Run("test", func(mt *mtest.T) {
    87  		resp := mtest.CreateCursorResponse(
    88  			1,
    89  			"DBName.CollectionName",
    90  			mtest.FirstBatch,
    91  			bson.D{
    92  				{Key: "foo", Value: "bar"},
    93  			})
    94  		mt.AddMockResponses(resp)
    95  		m := createModel(t, mt)
    96  		var v struct {
    97  			Foo string `bson:"foo"`
    98  		}
    99  		assert.Nil(t, m.FindOne(context.Background(), "foo", &v, bson.D{}))
   100  		assert.Equal(t, "bar", v.Foo)
   101  		assert.Nil(t, m.cache.Set("foo", "bar"))
   102  	})
   103  }
   104  
   105  func TestModel_FindOneNoCache(t *testing.T) {
   106  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   107  	defer mt.Close()
   108  
   109  	mt.Run("test", func(mt *mtest.T) {
   110  		resp := mtest.CreateCursorResponse(
   111  			1,
   112  			"DBName.CollectionName",
   113  			mtest.FirstBatch,
   114  			bson.D{
   115  				{Key: "foo", Value: "bar"},
   116  			})
   117  		mt.AddMockResponses(resp)
   118  		m := createModel(t, mt)
   119  		v := struct {
   120  			Foo string `bson:"foo"`
   121  		}{}
   122  		assert.Nil(t, m.FindOneNoCache(context.Background(), &v, bson.D{}))
   123  		assert.Equal(t, "bar", v.Foo)
   124  	})
   125  }
   126  
   127  func TestModel_FindOneAndDelete(t *testing.T) {
   128  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   129  	defer mt.Close()
   130  
   131  	mt.Run("test", func(mt *mtest.T) {
   132  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   133  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   134  		}...))
   135  		m := createModel(t, mt)
   136  		assert.Nil(t, m.cache.Set("foo", "bar"))
   137  		v := struct {
   138  			Foo string `bson:"foo"`
   139  		}{}
   140  		assert.Nil(t, m.FindOneAndDelete(context.Background(), "foo", &v, bson.D{}))
   141  		assert.Equal(t, "bar", v.Foo)
   142  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   143  		assert.NotNil(t, m.FindOneAndDelete(context.Background(), "foo", &v, bson.D{}))
   144  
   145  		m.cache = mockedCache{m.cache}
   146  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   147  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   148  		}...))
   149  		assert.Equal(t, errMocked, m.FindOneAndDelete(context.Background(), "foo", &v, bson.D{}))
   150  	})
   151  }
   152  
   153  func TestModel_FindOneAndDeleteNoCache(t *testing.T) {
   154  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   155  	defer mt.Close()
   156  
   157  	mt.Run("test", func(mt *mtest.T) {
   158  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   159  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   160  		}...))
   161  		m := createModel(t, mt)
   162  		v := struct {
   163  			Foo string `bson:"foo"`
   164  		}{}
   165  		assert.Nil(t, m.FindOneAndDeleteNoCache(context.Background(), &v, bson.D{}))
   166  		assert.Equal(t, "bar", v.Foo)
   167  	})
   168  }
   169  
   170  func TestModel_FindOneAndReplace(t *testing.T) {
   171  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   172  	defer mt.Close()
   173  
   174  	mt.Run("test", func(mt *mtest.T) {
   175  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   176  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   177  		}...))
   178  		m := createModel(t, mt)
   179  		assert.Nil(t, m.cache.Set("foo", "bar"))
   180  		v := struct {
   181  			Foo string `bson:"foo"`
   182  		}{}
   183  		assert.Nil(t, m.FindOneAndReplace(context.Background(), "foo", &v, bson.D{}, bson.D{
   184  			{Key: "name", Value: "Mary"},
   185  		}))
   186  		assert.Equal(t, "bar", v.Foo)
   187  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   188  		assert.NotNil(t, m.FindOneAndReplace(context.Background(), "foo", &v, bson.D{}, bson.D{
   189  			{Key: "name", Value: "Mary"},
   190  		}))
   191  
   192  		m.cache = mockedCache{m.cache}
   193  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   194  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   195  		}...))
   196  		assert.Equal(t, errMocked, m.FindOneAndReplace(context.Background(), "foo", &v, bson.D{}, bson.D{
   197  			{Key: "name", Value: "Mary"},
   198  		}))
   199  	})
   200  }
   201  
   202  func TestModel_FindOneAndReplaceNoCache(t *testing.T) {
   203  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   204  	defer mt.Close()
   205  
   206  	mt.Run("test", func(mt *mtest.T) {
   207  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   208  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   209  		}...))
   210  		m := createModel(t, mt)
   211  		v := struct {
   212  			Foo string `bson:"foo"`
   213  		}{}
   214  		assert.Nil(t, m.FindOneAndReplaceNoCache(context.Background(), &v, bson.D{}, bson.D{
   215  			{Key: "name", Value: "Mary"},
   216  		}))
   217  		assert.Equal(t, "bar", v.Foo)
   218  	})
   219  }
   220  
   221  func TestModel_FindOneAndUpdate(t *testing.T) {
   222  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   223  	defer mt.Close()
   224  
   225  	mt.Run("test", func(mt *mtest.T) {
   226  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   227  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   228  		}...))
   229  		m := createModel(t, mt)
   230  		assert.Nil(t, m.cache.Set("foo", "bar"))
   231  		v := struct {
   232  			Foo string `bson:"foo"`
   233  		}{}
   234  		assert.Nil(t, m.FindOneAndUpdate(context.Background(), "foo", &v, bson.D{}, bson.D{
   235  			{Key: "$set", Value: bson.D{{Key: "name", Value: "Mary"}}},
   236  		}))
   237  		assert.Equal(t, "bar", v.Foo)
   238  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   239  		assert.NotNil(t, m.FindOneAndUpdate(context.Background(), "foo", &v, bson.D{}, bson.D{
   240  			{Key: "$set", Value: bson.D{{Key: "name", Value: "Mary"}}},
   241  		}))
   242  
   243  		m.cache = mockedCache{m.cache}
   244  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   245  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   246  		}...))
   247  		assert.Equal(t, errMocked, m.FindOneAndUpdate(context.Background(), "foo", &v, bson.D{}, bson.D{
   248  			{Key: "$set", Value: bson.D{{Key: "name", Value: "Mary"}}},
   249  		}))
   250  	})
   251  }
   252  
   253  func TestModel_FindOneAndUpdateNoCache(t *testing.T) {
   254  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   255  	defer mt.Close()
   256  
   257  	mt.Run("test", func(mt *mtest.T) {
   258  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   259  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   260  		}...))
   261  		m := createModel(t, mt)
   262  		v := struct {
   263  			Foo string `bson:"foo"`
   264  		}{}
   265  		assert.Nil(t, m.FindOneAndUpdateNoCache(context.Background(), &v, bson.D{}, bson.D{
   266  			{Key: "$set", Value: bson.D{{Key: "name", Value: "Mary"}}},
   267  		}))
   268  		assert.Equal(t, "bar", v.Foo)
   269  	})
   270  }
   271  
   272  func TestModel_GetCache(t *testing.T) {
   273  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   274  	defer mt.Close()
   275  
   276  	mt.Run("test", func(mt *mtest.T) {
   277  		m := createModel(t, mt)
   278  		assert.NotNil(t, m.cache)
   279  		assert.Nil(t, m.cache.Set("foo", "bar"))
   280  		var s string
   281  		assert.Nil(t, m.cache.Get("foo", &s))
   282  		assert.Equal(t, "bar", s)
   283  	})
   284  }
   285  
   286  func TestModel_InsertOne(t *testing.T) {
   287  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   288  	defer mt.Close()
   289  
   290  	mt.Run("test", func(mt *mtest.T) {
   291  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   292  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   293  		}...))
   294  		m := createModel(t, mt)
   295  		assert.Nil(t, m.cache.Set("foo", "bar"))
   296  		resp, err := m.InsertOne(context.Background(), "foo", bson.D{
   297  			{Key: "name", Value: "Mary"},
   298  		})
   299  		assert.Nil(t, err)
   300  		assert.NotNil(t, resp)
   301  		var v string
   302  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   303  		_, err = m.InsertOne(context.Background(), "foo", bson.D{
   304  			{Key: "name", Value: "Mary"},
   305  		})
   306  		assert.NotNil(t, err)
   307  
   308  		m.cache = mockedCache{m.cache}
   309  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   310  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   311  		}...))
   312  		_, err = m.InsertOne(context.Background(), "foo", bson.D{
   313  			{Key: "name", Value: "Mary"},
   314  		})
   315  		assert.Equal(t, errMocked, err)
   316  	})
   317  }
   318  
   319  func TestModel_InsertOneNoCache(t *testing.T) {
   320  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   321  	defer mt.Close()
   322  
   323  	mt.Run("test", func(mt *mtest.T) {
   324  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   325  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   326  		}...))
   327  		m := createModel(t, mt)
   328  		resp, err := m.InsertOneNoCache(context.Background(), bson.D{
   329  			{Key: "name", Value: "Mary"},
   330  		})
   331  		assert.Nil(t, err)
   332  		assert.NotNil(t, resp)
   333  	})
   334  }
   335  
   336  func TestModel_ReplaceOne(t *testing.T) {
   337  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   338  	defer mt.Close()
   339  
   340  	mt.Run("test", func(mt *mtest.T) {
   341  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   342  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   343  		}...))
   344  		m := createModel(t, mt)
   345  		assert.Nil(t, m.cache.Set("foo", "bar"))
   346  		resp, err := m.ReplaceOne(context.Background(), "foo", bson.D{}, bson.D{
   347  			{Key: "foo", Value: "baz"},
   348  		})
   349  		assert.Nil(t, err)
   350  		assert.NotNil(t, resp)
   351  		var v string
   352  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   353  		_, err = m.ReplaceOne(context.Background(), "foo", bson.D{}, bson.D{
   354  			{Key: "foo", Value: "baz"},
   355  		})
   356  		assert.NotNil(t, err)
   357  
   358  		m.cache = mockedCache{m.cache}
   359  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   360  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   361  		}...))
   362  		_, err = m.ReplaceOne(context.Background(), "foo", bson.D{}, bson.D{
   363  			{Key: "foo", Value: "baz"},
   364  		})
   365  		assert.Equal(t, errMocked, err)
   366  	})
   367  }
   368  
   369  func TestModel_ReplaceOneNoCache(t *testing.T) {
   370  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   371  	defer mt.Close()
   372  
   373  	mt.Run("test", func(mt *mtest.T) {
   374  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   375  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   376  		}...))
   377  		m := createModel(t, mt)
   378  		resp, err := m.ReplaceOneNoCache(context.Background(), bson.D{}, bson.D{
   379  			{Key: "foo", Value: "baz"},
   380  		})
   381  		assert.Nil(t, err)
   382  		assert.NotNil(t, resp)
   383  	})
   384  }
   385  
   386  func TestModel_SetCache(t *testing.T) {
   387  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   388  	defer mt.Close()
   389  
   390  	mt.Run("test", func(mt *mtest.T) {
   391  		m := createModel(t, mt)
   392  		assert.Nil(t, m.SetCache("foo", "bar"))
   393  		var v string
   394  		assert.Nil(t, m.GetCache("foo", &v))
   395  		assert.Equal(t, "bar", v)
   396  	})
   397  }
   398  
   399  func TestModel_UpdateByID(t *testing.T) {
   400  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   401  	defer mt.Close()
   402  
   403  	mt.Run("test", func(mt *mtest.T) {
   404  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   405  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   406  		}...))
   407  		m := createModel(t, mt)
   408  		assert.Nil(t, m.cache.Set("foo", "bar"))
   409  		resp, err := m.UpdateByID(context.Background(), "foo", bson.D{}, bson.D{
   410  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   411  		})
   412  		assert.Nil(t, err)
   413  		assert.NotNil(t, resp)
   414  		var v string
   415  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   416  		_, err = m.UpdateByID(context.Background(), "foo", bson.D{}, bson.D{
   417  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   418  		})
   419  		assert.NotNil(t, err)
   420  
   421  		m.cache = mockedCache{m.cache}
   422  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   423  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   424  		}...))
   425  		_, err = m.UpdateByID(context.Background(), "foo", bson.D{}, bson.D{
   426  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   427  		})
   428  		assert.Equal(t, errMocked, err)
   429  	})
   430  }
   431  
   432  func TestModel_UpdateByIDNoCache(t *testing.T) {
   433  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   434  	defer mt.Close()
   435  
   436  	mt.Run("test", func(mt *mtest.T) {
   437  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   438  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   439  		}...))
   440  		m := createModel(t, mt)
   441  		resp, err := m.UpdateByIDNoCache(context.Background(), bson.D{}, bson.D{
   442  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   443  		})
   444  		assert.Nil(t, err)
   445  		assert.NotNil(t, resp)
   446  	})
   447  }
   448  
   449  func TestModel_UpdateMany(t *testing.T) {
   450  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   451  	defer mt.Close()
   452  
   453  	mt.Run("test", func(mt *mtest.T) {
   454  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   455  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   456  		}...))
   457  		m := createModel(t, mt)
   458  		assert.Nil(t, m.cache.Set("foo", "bar"))
   459  		assert.Nil(t, m.cache.Set("bar", "baz"))
   460  		resp, err := m.UpdateMany(context.Background(), []string{"foo", "bar"}, bson.D{}, bson.D{
   461  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   462  		})
   463  		assert.Nil(t, err)
   464  		assert.NotNil(t, resp)
   465  		var v string
   466  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   467  		assert.True(t, m.cache.IsNotFound(m.cache.Get("bar", &v)))
   468  		_, err = m.UpdateMany(context.Background(), []string{"foo", "bar"}, bson.D{}, bson.D{
   469  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   470  		})
   471  		assert.NotNil(t, err)
   472  
   473  		m.cache = mockedCache{m.cache}
   474  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   475  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   476  		}...))
   477  		_, err = m.UpdateMany(context.Background(), []string{"foo", "bar"}, bson.D{}, bson.D{
   478  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   479  		})
   480  		assert.Equal(t, errMocked, err)
   481  	})
   482  }
   483  
   484  func TestModel_UpdateManyNoCache(t *testing.T) {
   485  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   486  	defer mt.Close()
   487  
   488  	mt.Run("test", func(mt *mtest.T) {
   489  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   490  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   491  		}...))
   492  		m := createModel(t, mt)
   493  		resp, err := m.UpdateManyNoCache(context.Background(), bson.D{}, bson.D{
   494  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   495  		})
   496  		assert.Nil(t, err)
   497  		assert.NotNil(t, resp)
   498  	})
   499  }
   500  
   501  func TestModel_UpdateOne(t *testing.T) {
   502  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   503  	defer mt.Close()
   504  
   505  	mt.Run("test", func(mt *mtest.T) {
   506  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   507  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   508  		}...))
   509  		m := createModel(t, mt)
   510  		assert.Nil(t, m.cache.Set("foo", "bar"))
   511  		resp, err := m.UpdateOne(context.Background(), "foo", bson.D{}, bson.D{
   512  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   513  		})
   514  		assert.Nil(t, err)
   515  		assert.NotNil(t, resp)
   516  		var v string
   517  		assert.True(t, m.cache.IsNotFound(m.cache.Get("foo", &v)))
   518  		_, err = m.UpdateOne(context.Background(), "foo", bson.D{}, bson.D{
   519  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   520  		})
   521  		assert.NotNil(t, err)
   522  
   523  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   524  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   525  		}...))
   526  		m.cache = mockedCache{m.cache}
   527  		_, err = m.UpdateOne(context.Background(), "foo", bson.D{}, bson.D{
   528  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   529  		})
   530  		assert.Equal(t, errMocked, err)
   531  	})
   532  }
   533  
   534  func TestModel_UpdateOneNoCache(t *testing.T) {
   535  	mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
   536  	defer mt.Close()
   537  
   538  	mt.Run("test", func(mt *mtest.T) {
   539  		mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
   540  			{Key: "value", Value: bson.D{{Key: "foo", Value: "bar"}}},
   541  		}...))
   542  		m := createModel(t, mt)
   543  		resp, err := m.UpdateOneNoCache(context.Background(), bson.D{}, bson.D{
   544  			{Key: "$set", Value: bson.D{{Key: "foo", Value: "baz"}}},
   545  		})
   546  		assert.Nil(t, err)
   547  		assert.NotNil(t, resp)
   548  	})
   549  }
   550  
   551  func createModel(t *testing.T, mt *mtest.T) *Model {
   552  	s, err := miniredis.Run()
   553  	assert.Nil(t, err)
   554  	mon.Inject(mt.Name(), mt.Client)
   555  	if atomic.AddInt32(&index, 1)%2 == 0 {
   556  		return MustNewNodeModel(mt.Name(), mt.DB.Name(), mt.Coll.Name(), redis.New(s.Addr()))
   557  	} else {
   558  		return MustNewModel(mt.Name(), mt.DB.Name(), mt.Coll.Name(), cache.CacheConf{
   559  			cache.NodeConf{
   560  				RedisConf: redis.RedisConf{
   561  					Host: s.Addr(),
   562  					Type: redis.NodeType,
   563  				},
   564  				Weight: 100,
   565  			},
   566  		})
   567  	}
   568  }
   569  
   570  var (
   571  	errMocked = errors.New("mocked error")
   572  	index     int32
   573  )
   574  
   575  type mockedCache struct {
   576  	cache.Cache
   577  }
   578  
   579  func (m mockedCache) DelCtx(_ context.Context, _ ...string) error {
   580  	return errMocked
   581  }