model_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package model
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "testing"
  6. "time"
  7. "github.com/DATA-DOG/go-sqlmock"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/tal-tech/go-zero/core/stores/cache"
  10. "github.com/tal-tech/go-zero/core/stores/redis"
  11. "github.com/tal-tech/go-zero/core/stores/redis/redistest"
  12. mocksql "github.com/tal-tech/go-zero/tools/goctl/model/sql/test"
  13. )
  14. func TestStudentModel(t *testing.T) {
  15. var (
  16. testTimeValue = time.Now()
  17. testTable = "`student`"
  18. testUpdateName = "gozero1"
  19. testRowsAffected int64 = 1
  20. testInsertId int64 = 1
  21. )
  22. var data Student
  23. data.Id = testInsertId
  24. data.Name = "gozero"
  25. data.Age = sql.NullInt64{
  26. Int64: 1,
  27. Valid: true,
  28. }
  29. data.Score = sql.NullFloat64{
  30. Float64: 100,
  31. Valid: true,
  32. }
  33. data.CreateTime = testTimeValue
  34. data.UpdateTime = sql.NullTime{
  35. Time: testTimeValue,
  36. Valid: true,
  37. }
  38. err := mockStudent(func(mock sqlmock.Sqlmock) {
  39. mock.ExpectExec(fmt.Sprintf("insert into %s", testTable)).
  40. WithArgs(data.Name, data.Age, data.Score).
  41. WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
  42. }, func(m StudentModel) {
  43. r, err := m.Insert(data)
  44. assert.Nil(t, err)
  45. lastInsertId, err := r.LastInsertId()
  46. assert.Nil(t, err)
  47. assert.Equal(t, testInsertId, lastInsertId)
  48. rowsAffected, err := r.RowsAffected()
  49. assert.Nil(t, err)
  50. assert.Equal(t, testRowsAffected, rowsAffected)
  51. })
  52. assert.Nil(t, err)
  53. err = mockStudent(func(mock sqlmock.Sqlmock) {
  54. mock.ExpectQuery(fmt.Sprintf("select (.+) from %s", testTable)).
  55. WithArgs(testInsertId).
  56. WillReturnRows(sqlmock.NewRows([]string{"id", "name", "age", "score", "create_time", "update_time"}).AddRow(testInsertId, data.Name, data.Age, data.Score, testTimeValue, testTimeValue))
  57. }, func(m StudentModel) {
  58. result, err := m.FindOne(testInsertId)
  59. assert.Nil(t, err)
  60. assert.Equal(t, *result, data)
  61. })
  62. assert.Nil(t, err)
  63. err = mockStudent(func(mock sqlmock.Sqlmock) {
  64. mock.ExpectExec(fmt.Sprintf("update %s", testTable)).WithArgs(testUpdateName, data.Age, data.Score, testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
  65. }, func(m StudentModel) {
  66. data.Name = testUpdateName
  67. err := m.Update(data)
  68. assert.Nil(t, err)
  69. })
  70. assert.Nil(t, err)
  71. err = mockStudent(func(mock sqlmock.Sqlmock) {
  72. mock.ExpectQuery(fmt.Sprintf("select (.+) from %s ", testTable)).
  73. WithArgs(testInsertId).
  74. WillReturnRows(sqlmock.NewRows([]string{"id", "name", "age", "score", "create_time", "update_time"}).AddRow(testInsertId, data.Name, data.Age, data.Score, testTimeValue, testTimeValue))
  75. }, func(m StudentModel) {
  76. result, err := m.FindOne(testInsertId)
  77. assert.Nil(t, err)
  78. assert.Equal(t, *result, data)
  79. })
  80. assert.Nil(t, err)
  81. err = mockStudent(func(mock sqlmock.Sqlmock) {
  82. mock.ExpectExec(fmt.Sprintf("delete from %s where `id` = ?", testTable)).WithArgs(testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
  83. }, func(m StudentModel) {
  84. err := m.Delete(testInsertId)
  85. assert.Nil(t, err)
  86. })
  87. assert.Nil(t, err)
  88. }
  89. func TestUserModel(t *testing.T) {
  90. var (
  91. testTimeValue = time.Now()
  92. testTable = "`user`"
  93. testUpdateName = "gozero1"
  94. testUser = "gozero"
  95. testPassword = "test"
  96. testMobile = "test_mobile"
  97. testGender = "男"
  98. testNickname = "test_nickname"
  99. testRowsAffected int64 = 1
  100. testInsertId int64 = 1
  101. )
  102. var data User
  103. data.Id = testInsertId
  104. data.User = testUser
  105. data.Name = "gozero"
  106. data.Password = testPassword
  107. data.Mobile = testMobile
  108. data.Gender = testGender
  109. data.Nickname = testNickname
  110. data.CreateTime = testTimeValue
  111. data.UpdateTime = testTimeValue
  112. err := mockUser(func(mock sqlmock.Sqlmock) {
  113. mock.ExpectExec(fmt.Sprintf("insert into %s", testTable)).
  114. WithArgs(data.User, data.Name, data.Password, data.Mobile, data.Gender, data.Nickname).
  115. WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
  116. }, func(m UserModel) {
  117. r, err := m.Insert(data)
  118. assert.Nil(t, err)
  119. lastInsertId, err := r.LastInsertId()
  120. assert.Nil(t, err)
  121. assert.Equal(t, testInsertId, lastInsertId)
  122. rowsAffected, err := r.RowsAffected()
  123. assert.Nil(t, err)
  124. assert.Equal(t, testRowsAffected, rowsAffected)
  125. })
  126. assert.Nil(t, err)
  127. err = mockUser(func(mock sqlmock.Sqlmock) {
  128. mock.ExpectQuery(fmt.Sprintf("select (.+) from %s", testTable)).
  129. WithArgs(testInsertId).
  130. WillReturnRows(sqlmock.NewRows([]string{"id", "user", "name", "password", "mobile", "gender", "nickname", "create_time", "update_time"}).AddRow(testInsertId, data.User, data.Name, data.Password, data.Mobile, data.Gender, data.Nickname, testTimeValue, testTimeValue))
  131. }, func(m UserModel) {
  132. result, err := m.FindOne(testInsertId)
  133. assert.Nil(t, err)
  134. assert.Equal(t, *result, data)
  135. })
  136. assert.Nil(t, err)
  137. err = mockUser(func(mock sqlmock.Sqlmock) {
  138. mock.ExpectExec(fmt.Sprintf("update %s", testTable)).WithArgs(data.User, testUpdateName, data.Password, data.Mobile, data.Gender, data.Nickname, testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
  139. }, func(m UserModel) {
  140. data.Name = testUpdateName
  141. err := m.Update(data)
  142. assert.Nil(t, err)
  143. })
  144. assert.Nil(t, err)
  145. err = mockUser(func(mock sqlmock.Sqlmock) {
  146. mock.ExpectQuery(fmt.Sprintf("select (.+) from %s ", testTable)).
  147. WithArgs(testInsertId).
  148. WillReturnRows(sqlmock.NewRows([]string{"id", "user", "name", "password", "mobile", "gender", "nickname", "create_time", "update_time"}).AddRow(testInsertId, data.User, data.Name, data.Password, data.Mobile, data.Gender, data.Nickname, testTimeValue, testTimeValue))
  149. }, func(m UserModel) {
  150. result, err := m.FindOne(testInsertId)
  151. assert.Nil(t, err)
  152. assert.Equal(t, *result, data)
  153. })
  154. assert.Nil(t, err)
  155. err = mockUser(func(mock sqlmock.Sqlmock) {
  156. mock.ExpectExec(fmt.Sprintf("delete from %s where `id` = ?", testTable)).WithArgs(testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
  157. }, func(m UserModel) {
  158. err := m.Delete(testInsertId)
  159. assert.Nil(t, err)
  160. })
  161. assert.Nil(t, err)
  162. }
  163. // with cache
  164. func mockStudent(mockFn func(mock sqlmock.Sqlmock), fn func(m StudentModel)) error {
  165. db, mock, err := sqlmock.New()
  166. if err != nil {
  167. return err
  168. }
  169. defer db.Close()
  170. mock.ExpectBegin()
  171. mockFn(mock)
  172. mock.ExpectCommit()
  173. conn := mocksql.NewMockConn(db)
  174. r, clean, err := redistest.CreateRedis()
  175. if err != nil {
  176. return err
  177. }
  178. defer clean()
  179. m := NewStudentModel(conn, cache.CacheConf{
  180. {
  181. RedisConf: redis.RedisConf{
  182. Host: r.Addr,
  183. Type: "node",
  184. },
  185. Weight: 100,
  186. },
  187. })
  188. fn(m)
  189. return nil
  190. }
  191. // without cache
  192. func mockUser(mockFn func(mock sqlmock.Sqlmock), fn func(m UserModel)) error {
  193. db, mock, err := sqlmock.New()
  194. if err != nil {
  195. return err
  196. }
  197. defer db.Close()
  198. mock.ExpectBegin()
  199. mockFn(mock)
  200. mock.ExpectCommit()
  201. conn := mocksql.NewMockConn(db)
  202. m := NewUserModel(conn)
  203. fn(m)
  204. return nil
  205. }