model_test.go 6.3 KB

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