1
0

cachedmodel_test.go 17 KB

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