model_test.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package mon
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "go.mongodb.org/mongo-driver/bson"
  7. "go.mongodb.org/mongo-driver/mongo"
  8. "go.mongodb.org/mongo-driver/mongo/integration/mtest"
  9. )
  10. func TestModel_StartSession(t *testing.T) {
  11. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  12. defer mt.Close()
  13. mt.Run("test", func(mt *mtest.T) {
  14. m := createModel(mt)
  15. sess, err := m.StartSession()
  16. assert.Nil(t, err)
  17. defer sess.EndSession(context.Background())
  18. _, err = sess.WithTransaction(context.Background(), func(sessCtx mongo.SessionContext) (any, error) {
  19. _ = sessCtx.StartTransaction()
  20. sessCtx.Client().Database("1")
  21. sessCtx.EndSession(context.Background())
  22. return nil, nil
  23. })
  24. assert.Nil(t, err)
  25. assert.NoError(t, sess.CommitTransaction(context.Background()))
  26. assert.Error(t, sess.AbortTransaction(context.Background()))
  27. })
  28. }
  29. func TestModel_Aggregate(t *testing.T) {
  30. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  31. defer mt.Close()
  32. mt.Run("test", func(mt *mtest.T) {
  33. m := createModel(mt)
  34. find := mtest.CreateCursorResponse(
  35. 1,
  36. "DBName.CollectionName",
  37. mtest.FirstBatch,
  38. bson.D{
  39. {Key: "name", Value: "John"},
  40. })
  41. getMore := mtest.CreateCursorResponse(
  42. 1,
  43. "DBName.CollectionName",
  44. mtest.NextBatch,
  45. bson.D{
  46. {Key: "name", Value: "Mary"},
  47. })
  48. killCursors := mtest.CreateCursorResponse(
  49. 0,
  50. "DBName.CollectionName",
  51. mtest.NextBatch)
  52. mt.AddMockResponses(find, getMore, killCursors)
  53. var result []any
  54. err := m.Aggregate(context.Background(), &result, mongo.Pipeline{})
  55. assert.Nil(t, err)
  56. assert.Equal(t, 2, len(result))
  57. assert.Equal(t, "John", result[0].(bson.D).Map()["name"])
  58. assert.Equal(t, "Mary", result[1].(bson.D).Map()["name"])
  59. triggerBreaker(m)
  60. assert.Equal(t, errDummy, m.Aggregate(context.Background(), &result, mongo.Pipeline{}))
  61. })
  62. }
  63. func TestModel_DeleteMany(t *testing.T) {
  64. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  65. defer mt.Close()
  66. mt.Run("test", func(mt *mtest.T) {
  67. m := createModel(mt)
  68. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  69. val, err := m.DeleteMany(context.Background(), bson.D{})
  70. assert.Nil(t, err)
  71. assert.Equal(t, int64(1), val)
  72. triggerBreaker(m)
  73. _, err = m.DeleteMany(context.Background(), bson.D{})
  74. assert.Equal(t, errDummy, err)
  75. })
  76. }
  77. func TestModel_DeleteOne(t *testing.T) {
  78. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  79. defer mt.Close()
  80. mt.Run("test", func(mt *mtest.T) {
  81. m := createModel(mt)
  82. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  83. val, err := m.DeleteOne(context.Background(), bson.D{})
  84. assert.Nil(t, err)
  85. assert.Equal(t, int64(1), val)
  86. triggerBreaker(m)
  87. _, err = m.DeleteOne(context.Background(), bson.D{})
  88. assert.Equal(t, errDummy, err)
  89. })
  90. }
  91. func TestModel_Find(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. m := createModel(mt)
  96. find := mtest.CreateCursorResponse(
  97. 1,
  98. "DBName.CollectionName",
  99. mtest.FirstBatch,
  100. bson.D{
  101. {Key: "name", Value: "John"},
  102. })
  103. getMore := mtest.CreateCursorResponse(
  104. 1,
  105. "DBName.CollectionName",
  106. mtest.NextBatch,
  107. bson.D{
  108. {Key: "name", Value: "Mary"},
  109. })
  110. killCursors := mtest.CreateCursorResponse(
  111. 0,
  112. "DBName.CollectionName",
  113. mtest.NextBatch)
  114. mt.AddMockResponses(find, getMore, killCursors)
  115. var result []any
  116. err := m.Find(context.Background(), &result, bson.D{})
  117. assert.Nil(t, err)
  118. assert.Equal(t, 2, len(result))
  119. assert.Equal(t, "John", result[0].(bson.D).Map()["name"])
  120. assert.Equal(t, "Mary", result[1].(bson.D).Map()["name"])
  121. triggerBreaker(m)
  122. assert.Equal(t, errDummy, m.Find(context.Background(), &result, bson.D{}))
  123. })
  124. }
  125. func TestModel_FindOne(t *testing.T) {
  126. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  127. defer mt.Close()
  128. mt.Run("test", func(mt *mtest.T) {
  129. m := createModel(mt)
  130. find := mtest.CreateCursorResponse(
  131. 1,
  132. "DBName.CollectionName",
  133. mtest.FirstBatch,
  134. bson.D{
  135. {Key: "name", Value: "John"},
  136. })
  137. killCursors := mtest.CreateCursorResponse(
  138. 0,
  139. "DBName.CollectionName",
  140. mtest.NextBatch)
  141. mt.AddMockResponses(find, killCursors)
  142. var result bson.D
  143. err := m.FindOne(context.Background(), &result, bson.D{})
  144. assert.Nil(t, err)
  145. assert.Equal(t, "John", result.Map()["name"])
  146. triggerBreaker(m)
  147. assert.Equal(t, errDummy, m.FindOne(context.Background(), &result, bson.D{}))
  148. })
  149. }
  150. func TestModel_FindOneAndDelete(t *testing.T) {
  151. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  152. defer mt.Close()
  153. mt.Run("test", func(mt *mtest.T) {
  154. m := createModel(mt)
  155. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
  156. {Key: "value", Value: bson.D{{Key: "name", Value: "John"}}},
  157. }...))
  158. var result bson.D
  159. err := m.FindOneAndDelete(context.Background(), &result, bson.D{})
  160. assert.Nil(t, err)
  161. assert.Equal(t, "John", result.Map()["name"])
  162. triggerBreaker(m)
  163. assert.Equal(t, errDummy, m.FindOneAndDelete(context.Background(), &result, bson.D{}))
  164. })
  165. }
  166. func TestModel_FindOneAndReplace(t *testing.T) {
  167. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  168. defer mt.Close()
  169. mt.Run("test", func(mt *mtest.T) {
  170. m := createModel(mt)
  171. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
  172. {Key: "value", Value: bson.D{{Key: "name", Value: "John"}}},
  173. }...))
  174. var result bson.D
  175. err := m.FindOneAndReplace(context.Background(), &result, bson.D{}, bson.D{
  176. {Key: "name", Value: "Mary"},
  177. })
  178. assert.Nil(t, err)
  179. assert.Equal(t, "John", result.Map()["name"])
  180. triggerBreaker(m)
  181. assert.Equal(t, errDummy, m.FindOneAndReplace(context.Background(), &result, bson.D{}, bson.D{
  182. {Key: "name", Value: "Mary"},
  183. }))
  184. })
  185. }
  186. func TestModel_FindOneAndUpdate(t *testing.T) {
  187. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  188. defer mt.Close()
  189. mt.Run("test", func(mt *mtest.T) {
  190. m := createModel(mt)
  191. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
  192. {Key: "value", Value: bson.D{{Key: "name", Value: "John"}}},
  193. }...))
  194. var result bson.D
  195. err := m.FindOneAndUpdate(context.Background(), &result, bson.D{}, bson.D{
  196. {Key: "$set", Value: bson.D{{Key: "name", Value: "Mary"}}},
  197. })
  198. assert.Nil(t, err)
  199. assert.Equal(t, "John", result.Map()["name"])
  200. triggerBreaker(m)
  201. assert.Equal(t, errDummy, m.FindOneAndUpdate(context.Background(), &result, bson.D{}, bson.D{
  202. {Key: "$set", Value: bson.D{{Key: "name", Value: "Mary"}}},
  203. }))
  204. })
  205. }
  206. func createModel(mt *mtest.T) *Model {
  207. Inject(mt.Name(), mt.Client)
  208. return MustNewModel(mt.Name(), mt.DB.Name(), mt.Coll.Name())
  209. }
  210. func triggerBreaker(m *Model) {
  211. m.Collection.(*decoratedCollection).brk = new(dropBreaker)
  212. }