cachedmodel_test.go 17 KB

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