collection_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. package mon
  2. import (
  3. "context"
  4. "errors"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/zeromicro/go-zero/core/breaker"
  8. "github.com/zeromicro/go-zero/core/logx"
  9. "github.com/zeromicro/go-zero/core/stringx"
  10. "go.mongodb.org/mongo-driver/bson"
  11. "go.mongodb.org/mongo-driver/bson/primitive"
  12. "go.mongodb.org/mongo-driver/mongo"
  13. "go.mongodb.org/mongo-driver/mongo/integration/mtest"
  14. mopt "go.mongodb.org/mongo-driver/mongo/options"
  15. )
  16. var errDummy = errors.New("dummy")
  17. func init() {
  18. logx.Disable()
  19. }
  20. func TestKeepPromise_accept(t *testing.T) {
  21. p := new(mockPromise)
  22. kp := keepablePromise{
  23. promise: p,
  24. log: func(error) {},
  25. }
  26. assert.Nil(t, kp.accept(nil))
  27. assert.Equal(t, ErrNotFound, kp.accept(ErrNotFound))
  28. }
  29. func TestKeepPromise_keep(t *testing.T) {
  30. tests := []struct {
  31. err error
  32. accepted bool
  33. reason string
  34. }{
  35. {
  36. err: nil,
  37. accepted: true,
  38. reason: "",
  39. },
  40. {
  41. err: ErrNotFound,
  42. accepted: true,
  43. reason: "",
  44. },
  45. {
  46. err: errors.New("any"),
  47. accepted: false,
  48. reason: "any",
  49. },
  50. }
  51. for _, test := range tests {
  52. t.Run(stringx.RandId(), func(t *testing.T) {
  53. p := new(mockPromise)
  54. kp := keepablePromise{
  55. promise: p,
  56. log: func(error) {},
  57. }
  58. assert.Equal(t, test.err, kp.keep(test.err))
  59. assert.Equal(t, test.accepted, p.accepted)
  60. assert.Equal(t, test.reason, p.reason)
  61. })
  62. }
  63. }
  64. func TestNewCollection(t *testing.T) {
  65. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  66. defer mt.Close()
  67. mt.Run("test", func(mt *mtest.T) {
  68. coll := mt.Coll
  69. assert.NotNil(t, coll)
  70. col := newCollection(coll, breaker.GetBreaker("localhost"))
  71. assert.Equal(t, t.Name()+"/test", col.(*decoratedCollection).name)
  72. })
  73. }
  74. func TestCollection_Aggregate(t *testing.T) {
  75. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  76. defer mt.Close()
  77. mt.Run("test", func(mt *mtest.T) {
  78. coll := mt.Coll
  79. assert.NotNil(t, coll)
  80. col := newCollection(coll, breaker.GetBreaker("localhost"))
  81. ns := mt.Coll.Database().Name() + "." + mt.Coll.Name()
  82. aggRes := mtest.CreateCursorResponse(1, ns, mtest.FirstBatch)
  83. mt.AddMockResponses(aggRes)
  84. assert.Equal(t, t.Name()+"/test", col.(*decoratedCollection).name)
  85. cursor, err := col.Aggregate(context.Background(), mongo.Pipeline{}, mopt.Aggregate())
  86. assert.Nil(t, err)
  87. cursor.Close(context.Background())
  88. })
  89. }
  90. func TestCollection_BulkWrite(t *testing.T) {
  91. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  92. defer mt.Close()
  93. mt.Run("test", func(mt *mtest.T) {
  94. c := decoratedCollection{
  95. Collection: mt.Coll,
  96. brk: breaker.NewBreaker(),
  97. }
  98. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
  99. res, err := c.BulkWrite(context.Background(), []mongo.WriteModel{
  100. mongo.NewInsertOneModel().SetDocument(bson.D{{Key: "foo", Value: 1}})},
  101. )
  102. assert.Nil(t, err)
  103. assert.NotNil(t, res)
  104. c.brk = new(dropBreaker)
  105. _, err = c.BulkWrite(context.Background(), []mongo.WriteModel{
  106. mongo.NewInsertOneModel().SetDocument(bson.D{{Key: "foo", Value: 1}})},
  107. )
  108. assert.Equal(t, errDummy, err)
  109. })
  110. }
  111. func TestCollection_CountDocuments(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. c := decoratedCollection{
  116. Collection: mt.Coll,
  117. brk: breaker.NewBreaker(),
  118. }
  119. mt.AddMockResponses(mtest.CreateCursorResponse(
  120. 1,
  121. "DBName.CollectionName",
  122. mtest.FirstBatch,
  123. bson.D{
  124. {Key: "n", Value: 1},
  125. }))
  126. res, err := c.CountDocuments(context.Background(), bson.D{})
  127. assert.Nil(t, err)
  128. assert.Equal(t, int64(1), res)
  129. c.brk = new(dropBreaker)
  130. _, err = c.CountDocuments(context.Background(), bson.D{{Key: "foo", Value: 1}})
  131. assert.Equal(t, errDummy, err)
  132. })
  133. }
  134. func TestDecoratedCollection_DeleteMany(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. c := decoratedCollection{
  139. Collection: mt.Coll,
  140. brk: breaker.NewBreaker(),
  141. }
  142. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  143. res, err := c.DeleteMany(context.Background(), bson.D{})
  144. assert.Nil(t, err)
  145. assert.Equal(t, int64(1), res.DeletedCount)
  146. c.brk = new(dropBreaker)
  147. _, err = c.DeleteMany(context.Background(), bson.D{{Key: "foo", Value: 1}})
  148. assert.Equal(t, errDummy, err)
  149. })
  150. }
  151. func TestCollection_Distinct(t *testing.T) {
  152. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  153. defer mt.Close()
  154. mt.Run("test", func(mt *mtest.T) {
  155. c := decoratedCollection{
  156. Collection: mt.Coll,
  157. brk: breaker.NewBreaker(),
  158. }
  159. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "values", Value: []int{1}}})
  160. resp, err := c.Distinct(context.Background(), "foo", bson.D{})
  161. assert.Nil(t, err)
  162. assert.Equal(t, 1, len(resp))
  163. c.brk = new(dropBreaker)
  164. _, err = c.Distinct(context.Background(), "foo", bson.D{{Key: "foo", Value: 1}})
  165. assert.Equal(t, errDummy, err)
  166. })
  167. }
  168. func TestCollection_EstimatedDocumentCount(t *testing.T) {
  169. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  170. defer mt.Close()
  171. mt.Run("test", func(mt *mtest.T) {
  172. c := decoratedCollection{
  173. Collection: mt.Coll,
  174. brk: breaker.NewBreaker(),
  175. }
  176. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "n", Value: 1}})
  177. res, err := c.EstimatedDocumentCount(context.Background())
  178. assert.Nil(t, err)
  179. assert.Equal(t, int64(1), res)
  180. c.brk = new(dropBreaker)
  181. _, err = c.EstimatedDocumentCount(context.Background())
  182. assert.Equal(t, errDummy, err)
  183. })
  184. }
  185. func TestCollectionFind(t *testing.T) {
  186. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  187. defer mt.Close()
  188. mt.Run("test", func(mt *mtest.T) {
  189. c := decoratedCollection{
  190. Collection: mt.Coll,
  191. brk: breaker.NewBreaker(),
  192. }
  193. find := mtest.CreateCursorResponse(
  194. 1,
  195. "DBName.CollectionName",
  196. mtest.FirstBatch,
  197. bson.D{
  198. {Key: "name", Value: "John"},
  199. })
  200. getMore := mtest.CreateCursorResponse(
  201. 1,
  202. "DBName.CollectionName",
  203. mtest.NextBatch,
  204. bson.D{
  205. {Key: "name", Value: "Mary"},
  206. })
  207. killCursors := mtest.CreateCursorResponse(
  208. 0,
  209. "DBName.CollectionName",
  210. mtest.NextBatch)
  211. mt.AddMockResponses(find, getMore, killCursors)
  212. filter := bson.D{{Key: "x", Value: 1}}
  213. cursor, err := c.Find(context.Background(), filter, mopt.Find())
  214. assert.Nil(t, err)
  215. defer cursor.Close(context.Background())
  216. var val []struct {
  217. ID primitive.ObjectID `bson:"_id"`
  218. Name string `bson:"name"`
  219. }
  220. assert.Nil(t, cursor.All(context.Background(), &val))
  221. assert.Equal(t, 2, len(val))
  222. assert.Equal(t, "John", val[0].Name)
  223. assert.Equal(t, "Mary", val[1].Name)
  224. c.brk = new(dropBreaker)
  225. _, err = c.Find(context.Background(), filter, mopt.Find())
  226. assert.Equal(t, errDummy, err)
  227. })
  228. }
  229. func TestCollectionFindOne(t *testing.T) {
  230. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  231. defer mt.Close()
  232. mt.Run("test", func(mt *mtest.T) {
  233. c := decoratedCollection{
  234. Collection: mt.Coll,
  235. brk: breaker.NewBreaker(),
  236. }
  237. find := mtest.CreateCursorResponse(
  238. 1,
  239. "DBName.CollectionName",
  240. mtest.FirstBatch,
  241. bson.D{
  242. {Key: "name", Value: "John"},
  243. })
  244. getMore := mtest.CreateCursorResponse(
  245. 1,
  246. "DBName.CollectionName",
  247. mtest.NextBatch,
  248. bson.D{
  249. {Key: "name", Value: "Mary"},
  250. })
  251. killCursors := mtest.CreateCursorResponse(
  252. 0,
  253. "DBName.CollectionName",
  254. mtest.NextBatch)
  255. mt.AddMockResponses(find, getMore, killCursors)
  256. filter := bson.D{{Key: "x", Value: 1}}
  257. resp, err := c.FindOne(context.Background(), filter)
  258. assert.Nil(t, err)
  259. var val struct {
  260. ID primitive.ObjectID `bson:"_id"`
  261. Name string `bson:"name"`
  262. }
  263. assert.Nil(t, resp.Decode(&val))
  264. assert.Equal(t, "John", val.Name)
  265. c.brk = new(dropBreaker)
  266. _, err = c.FindOne(context.Background(), filter)
  267. assert.Equal(t, errDummy, err)
  268. })
  269. }
  270. func TestCollection_FindOneAndDelete(t *testing.T) {
  271. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  272. defer mt.Close()
  273. mt.Run("test", func(mt *mtest.T) {
  274. c := decoratedCollection{
  275. Collection: mt.Coll,
  276. brk: breaker.NewBreaker(),
  277. }
  278. filter := bson.D{}
  279. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{}...))
  280. _, err := c.FindOneAndDelete(context.Background(), filter, mopt.FindOneAndDelete())
  281. assert.Equal(t, mongo.ErrNoDocuments, err)
  282. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
  283. {Key: "value", Value: bson.D{{Key: "name", Value: "John"}}},
  284. }...))
  285. resp, err := c.FindOneAndDelete(context.Background(), filter, mopt.FindOneAndDelete())
  286. assert.Nil(t, err)
  287. var val struct {
  288. Name string `bson:"name"`
  289. }
  290. assert.Nil(t, resp.Decode(&val))
  291. assert.Equal(t, "John", val.Name)
  292. c.brk = new(dropBreaker)
  293. _, err = c.FindOneAndDelete(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  294. assert.Equal(t, errDummy, err)
  295. })
  296. }
  297. func TestCollection_FindOneAndReplace(t *testing.T) {
  298. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  299. defer mt.Close()
  300. mt.Run("test", func(mt *mtest.T) {
  301. c := decoratedCollection{
  302. Collection: mt.Coll,
  303. brk: breaker.NewBreaker(),
  304. }
  305. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{}...))
  306. filter := bson.D{{Key: "x", Value: 1}}
  307. replacement := bson.D{{Key: "x", Value: 2}}
  308. opts := mopt.FindOneAndReplace().SetUpsert(true)
  309. _, err := c.FindOneAndReplace(context.Background(), filter, replacement, opts)
  310. assert.Equal(t, mongo.ErrNoDocuments, err)
  311. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "value", Value: bson.D{
  312. {Key: "name", Value: "John"},
  313. }}})
  314. resp, err := c.FindOneAndReplace(context.Background(), filter, replacement, opts)
  315. assert.Nil(t, err)
  316. var val struct {
  317. Name string `bson:"name"`
  318. }
  319. assert.Nil(t, resp.Decode(&val))
  320. assert.Equal(t, "John", val.Name)
  321. c.brk = new(dropBreaker)
  322. _, err = c.FindOneAndReplace(context.Background(), filter, replacement, opts)
  323. assert.Equal(t, errDummy, err)
  324. })
  325. }
  326. func TestCollection_FindOneAndUpdate(t *testing.T) {
  327. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  328. defer mt.Close()
  329. mt.Run("test", func(mt *mtest.T) {
  330. c := decoratedCollection{
  331. Collection: mt.Coll,
  332. brk: breaker.NewBreaker(),
  333. }
  334. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}})
  335. filter := bson.D{{Key: "x", Value: 1}}
  336. update := bson.D{{Key: "$x", Value: 2}}
  337. opts := mopt.FindOneAndUpdate().SetUpsert(true)
  338. _, err := c.FindOneAndUpdate(context.Background(), filter, update, opts)
  339. assert.Equal(t, mongo.ErrNoDocuments, err)
  340. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "value", Value: bson.D{
  341. {Key: "name", Value: "John"},
  342. }}})
  343. resp, err := c.FindOneAndUpdate(context.Background(), filter, update, opts)
  344. assert.Nil(t, err)
  345. var val struct {
  346. Name string `bson:"name"`
  347. }
  348. assert.Nil(t, resp.Decode(&val))
  349. assert.Equal(t, "John", val.Name)
  350. c.brk = new(dropBreaker)
  351. _, err = c.FindOneAndUpdate(context.Background(), filter, update, opts)
  352. assert.Equal(t, errDummy, err)
  353. })
  354. }
  355. func TestCollection_InsertOne(t *testing.T) {
  356. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  357. defer mt.Close()
  358. mt.Run("test", func(mt *mtest.T) {
  359. c := decoratedCollection{
  360. Collection: mt.Coll,
  361. brk: breaker.NewBreaker(),
  362. }
  363. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
  364. res, err := c.InsertOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  365. assert.Nil(t, err)
  366. assert.NotNil(t, res)
  367. c.brk = new(dropBreaker)
  368. _, err = c.InsertOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  369. assert.Equal(t, errDummy, err)
  370. })
  371. }
  372. func TestCollection_InsertMany(t *testing.T) {
  373. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  374. defer mt.Close()
  375. mt.Run("test", func(mt *mtest.T) {
  376. c := decoratedCollection{
  377. Collection: mt.Coll,
  378. brk: breaker.NewBreaker(),
  379. }
  380. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
  381. res, err := c.InsertMany(context.Background(), []interface{}{
  382. bson.D{{Key: "foo", Value: "bar"}},
  383. bson.D{{Key: "foo", Value: "baz"}},
  384. })
  385. assert.Nil(t, err)
  386. assert.NotNil(t, res)
  387. assert.Equal(t, 2, len(res.InsertedIDs))
  388. c.brk = new(dropBreaker)
  389. _, err = c.InsertMany(context.Background(), []interface{}{bson.D{{Key: "foo", Value: "bar"}}})
  390. assert.Equal(t, errDummy, err)
  391. })
  392. }
  393. func TestCollection_Remove(t *testing.T) {
  394. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  395. defer mt.Close()
  396. mt.Run("test", func(mt *mtest.T) {
  397. c := decoratedCollection{
  398. Collection: mt.Coll,
  399. brk: breaker.NewBreaker(),
  400. }
  401. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  402. res, err := c.DeleteOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  403. assert.Nil(t, err)
  404. assert.Equal(t, int64(1), res.DeletedCount)
  405. c.brk = new(dropBreaker)
  406. _, err = c.DeleteOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  407. assert.Equal(t, errDummy, err)
  408. })
  409. }
  410. func TestCollectionRemoveAll(t *testing.T) {
  411. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  412. defer mt.Close()
  413. mt.Run("test", func(mt *mtest.T) {
  414. c := decoratedCollection{
  415. Collection: mt.Coll,
  416. brk: breaker.NewBreaker(),
  417. }
  418. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  419. res, err := c.DeleteMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  420. assert.Nil(t, err)
  421. assert.Equal(t, int64(1), res.DeletedCount)
  422. c.brk = new(dropBreaker)
  423. _, err = c.DeleteMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  424. assert.Equal(t, errDummy, err)
  425. })
  426. }
  427. func TestCollection_ReplaceOne(t *testing.T) {
  428. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  429. defer mt.Close()
  430. mt.Run("test", func(mt *mtest.T) {
  431. c := decoratedCollection{
  432. Collection: mt.Coll,
  433. brk: breaker.NewBreaker(),
  434. }
  435. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  436. res, err := c.ReplaceOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  437. bson.D{{Key: "foo", Value: "baz"}},
  438. )
  439. assert.Nil(t, err)
  440. assert.Equal(t, int64(1), res.MatchedCount)
  441. c.brk = new(dropBreaker)
  442. _, err = c.ReplaceOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  443. bson.D{{Key: "foo", Value: "baz"}})
  444. assert.Equal(t, errDummy, err)
  445. })
  446. }
  447. func TestCollection_UpdateOne(t *testing.T) {
  448. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  449. defer mt.Close()
  450. mt.Run("test", func(mt *mtest.T) {
  451. c := decoratedCollection{
  452. Collection: mt.Coll,
  453. brk: breaker.NewBreaker(),
  454. }
  455. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  456. resp, err := c.UpdateOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  457. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  458. assert.Nil(t, err)
  459. assert.Equal(t, int64(1), resp.MatchedCount)
  460. c.brk = new(dropBreaker)
  461. _, err = c.UpdateOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  462. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  463. assert.Equal(t, errDummy, err)
  464. })
  465. }
  466. func TestCollection_UpdateByID(t *testing.T) {
  467. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  468. defer mt.Close()
  469. mt.Run("test", func(mt *mtest.T) {
  470. c := decoratedCollection{
  471. Collection: mt.Coll,
  472. brk: breaker.NewBreaker(),
  473. }
  474. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  475. resp, err := c.UpdateByID(context.Background(), primitive.NewObjectID(),
  476. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  477. assert.Nil(t, err)
  478. assert.Equal(t, int64(1), resp.MatchedCount)
  479. c.brk = new(dropBreaker)
  480. _, err = c.UpdateByID(context.Background(), primitive.NewObjectID(),
  481. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  482. assert.Equal(t, errDummy, err)
  483. })
  484. }
  485. func TestCollection_UpdateMany(t *testing.T) {
  486. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  487. defer mt.Close()
  488. mt.Run("test", func(mt *mtest.T) {
  489. c := decoratedCollection{
  490. Collection: mt.Coll,
  491. brk: breaker.NewBreaker(),
  492. }
  493. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  494. resp, err := c.UpdateMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  495. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  496. assert.Nil(t, err)
  497. assert.Equal(t, int64(1), resp.MatchedCount)
  498. c.brk = new(dropBreaker)
  499. _, err = c.UpdateMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  500. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  501. assert.Equal(t, errDummy, err)
  502. })
  503. }
  504. type mockPromise struct {
  505. accepted bool
  506. reason string
  507. }
  508. func (p *mockPromise) Accept() {
  509. p.accepted = true
  510. }
  511. func (p *mockPromise) Reject(reason string) {
  512. p.reason = reason
  513. }
  514. type dropBreaker struct{}
  515. func (d *dropBreaker) Name() string {
  516. return "dummy"
  517. }
  518. func (d *dropBreaker) Allow() (breaker.Promise, error) {
  519. return nil, errDummy
  520. }
  521. func (d *dropBreaker) Do(req func() error) error {
  522. return nil
  523. }
  524. func (d *dropBreaker) DoWithAcceptable(req func() error, acceptable breaker.Acceptable) error {
  525. return errDummy
  526. }
  527. func (d *dropBreaker) DoWithFallback(req func() error, fallback func(err error) error) error {
  528. return nil
  529. }
  530. func (d *dropBreaker) DoWithFallbackAcceptable(_ func() error, _ func(err error) error,
  531. _ breaker.Acceptable) error {
  532. return nil
  533. }