model_test.go 6.5 KB

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