123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- package model
- import (
- "database/sql"
- "encoding/json"
- "fmt"
- "testing"
- "time"
- "github.com/DATA-DOG/go-sqlmock"
- "github.com/stretchr/testify/assert"
- "github.com/tal-tech/go-zero/core/stores/cache"
- "github.com/tal-tech/go-zero/core/stores/redis"
- "github.com/tal-tech/go-zero/core/stores/redis/redistest"
- mocksql "github.com/tal-tech/go-zero/tools/goctl/model/sql/test"
- )
- func TestStudentModel(t *testing.T) {
- var (
- testTimeValue = time.Now()
- testTable = "`student`"
- testUpdateName = "gozero1"
- testRowsAffected int64 = 1
- testInsertId int64 = 1
- class = "一年级1班"
- )
- var data Student
- data.Id = testInsertId
- data.Class = class
- data.Name = "gozero"
- data.Age = sql.NullInt64{
- Int64: 1,
- Valid: true,
- }
- data.Score = sql.NullFloat64{
- Float64: 100,
- Valid: true,
- }
- data.CreateTime = testTimeValue
- data.UpdateTime = sql.NullTime{
- Time: testTimeValue,
- Valid: true,
- }
- err := mockStudent(func(mock sqlmock.Sqlmock) {
- mock.ExpectExec(fmt.Sprintf("insert into %s", testTable)).
- WithArgs(data.Class, data.Name, data.Age, data.Score).
- WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
- }, func(m StudentModel, redis *redis.Redis) {
- r, err := m.Insert(data)
- assert.Nil(t, err)
- lastInsertId, err := r.LastInsertId()
- assert.Nil(t, err)
- assert.Equal(t, testInsertId, lastInsertId)
- rowsAffected, err := r.RowsAffected()
- assert.Nil(t, err)
- assert.Equal(t, testRowsAffected, rowsAffected)
- })
- assert.Nil(t, err)
- err = mockStudent(func(mock sqlmock.Sqlmock) {
- mock.ExpectQuery(fmt.Sprintf("select (.+) from %s", testTable)).
- WithArgs(testInsertId).
- WillReturnRows(sqlmock.NewRows([]string{"id", "class", "name", "age", "score", "create_time", "update_time"}).AddRow(testInsertId, data.Class, data.Name, data.Age, data.Score, testTimeValue, testTimeValue))
- }, func(m StudentModel, redis *redis.Redis) {
- result, err := m.FindOne(testInsertId)
- assert.Nil(t, err)
- assert.Equal(t, *result, data)
- var resp Student
- val, err := redis.Get(fmt.Sprintf("%s%v", cacheStudentIdPrefix, testInsertId))
- assert.Nil(t, err)
- err = json.Unmarshal([]byte(val), &resp)
- assert.Nil(t, err)
- assert.Equal(t, resp.Name, data.Name)
- })
- assert.Nil(t, err)
- err = mockStudent(func(mock sqlmock.Sqlmock) {
- mock.ExpectExec(fmt.Sprintf("update %s", testTable)).WithArgs(data.Class, testUpdateName, data.Age, data.Score, testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
- }, func(m StudentModel, redis *redis.Redis) {
- data.Name = testUpdateName
- err := m.Update(data)
- assert.Nil(t, err)
- val, err := redis.Get(fmt.Sprintf("%s%v", cacheStudentIdPrefix, testInsertId))
- assert.Nil(t, err)
- assert.Equal(t, "", val)
- })
- assert.Nil(t, err)
- data.Name = testUpdateName
- err = mockStudent(func(mock sqlmock.Sqlmock) {
- mock.ExpectQuery(fmt.Sprintf("select (.+) from %s ", testTable)).
- WithArgs(testInsertId).
- WillReturnRows(sqlmock.NewRows([]string{"id", "class", "name", "age", "score", "create_time", "update_time"}).AddRow(testInsertId, data.Class, data.Name, data.Age, data.Score, testTimeValue, testTimeValue))
- }, func(m StudentModel, redis *redis.Redis) {
- result, err := m.FindOne(testInsertId)
- assert.Nil(t, err)
- assert.Equal(t, *result, data)
- var resp Student
- val, err := redis.Get(fmt.Sprintf("%s%v", cacheStudentIdPrefix, testInsertId))
- assert.Nil(t, err)
- err = json.Unmarshal([]byte(val), &resp)
- assert.Nil(t, err)
- assert.Equal(t, testUpdateName, data.Name)
- })
- assert.Nil(t, err)
- err = mockStudent(func(mock sqlmock.Sqlmock) {
- mock.ExpectQuery(fmt.Sprintf("select (.+) from %s ", testTable)).
- WithArgs(class, testUpdateName).
- WillReturnRows(sqlmock.NewRows([]string{"id", "class", "name", "age", "score", "create_time", "update_time"}).AddRow(testInsertId, data.Class, data.Name, data.Age, data.Score, testTimeValue, testTimeValue))
- }, func(m StudentModel, redis *redis.Redis) {
- result, err := m.FindOneByClassName(class, testUpdateName)
- assert.Nil(t, err)
- assert.Equal(t, *result, data)
- val, err := redis.Get(fmt.Sprintf("%s%v%v", cacheStudentClassNamePrefix, class, testUpdateName))
- assert.Nil(t, err)
- assert.Equal(t, "1", val)
- })
- assert.Nil(t, err)
- err = mockStudent(func(mock sqlmock.Sqlmock) {
- mock.ExpectExec(fmt.Sprintf("delete from %s where `id` = ?", testTable)).WithArgs(testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
- }, func(m StudentModel, redis *redis.Redis) {
- err = m.Delete(testInsertId, class, testUpdateName)
- assert.Nil(t, err)
- val, err := redis.Get(fmt.Sprintf("%s%v", cacheStudentIdPrefix, testInsertId))
- assert.Nil(t, err)
- assert.Equal(t, "", val)
- val, err = redis.Get(fmt.Sprintf("%s%v%v", cacheStudentClassNamePrefix, class, testUpdateName))
- assert.Nil(t, err)
- assert.Equal(t, "", val)
- })
- assert.Nil(t, err)
- }
- func TestUserModel(t *testing.T) {
- var (
- testTimeValue = time.Now()
- testTable = "`user`"
- testUpdateName = "gozero1"
- testUser = "gozero"
- testPassword = "test"
- testMobile = "test_mobile"
- testGender = "男"
- testNickname = "test_nickname"
- testRowsAffected int64 = 1
- testInsertId int64 = 1
- )
- var data User
- data.ID = testInsertId
- data.User = testUser
- data.Name = "gozero"
- data.Password = testPassword
- data.Mobile = testMobile
- data.Gender = testGender
- data.Nickname = testNickname
- data.CreateTime = testTimeValue
- data.UpdateTime = testTimeValue
- err := mockUser(func(mock sqlmock.Sqlmock) {
- mock.ExpectExec(fmt.Sprintf("insert into %s", testTable)).
- WithArgs(data.User, data.Name, data.Password, data.Mobile, data.Gender, data.Nickname).
- WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
- }, func(m UserModel) {
- r, err := m.Insert(data)
- assert.Nil(t, err)
- lastInsertId, err := r.LastInsertId()
- assert.Nil(t, err)
- assert.Equal(t, testInsertId, lastInsertId)
- rowsAffected, err := r.RowsAffected()
- assert.Nil(t, err)
- assert.Equal(t, testRowsAffected, rowsAffected)
- })
- assert.Nil(t, err)
- err = mockUser(func(mock sqlmock.Sqlmock) {
- mock.ExpectQuery(fmt.Sprintf("select (.+) from %s", testTable)).
- WithArgs(testInsertId).
- 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))
- }, func(m UserModel) {
- result, err := m.FindOne(testInsertId)
- assert.Nil(t, err)
- assert.Equal(t, *result, data)
- })
- assert.Nil(t, err)
- err = mockUser(func(mock sqlmock.Sqlmock) {
- 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))
- }, func(m UserModel) {
- data.Name = testUpdateName
- err := m.Update(data)
- assert.Nil(t, err)
- })
- assert.Nil(t, err)
- err = mockUser(func(mock sqlmock.Sqlmock) {
- mock.ExpectQuery(fmt.Sprintf("select (.+) from %s ", testTable)).
- WithArgs(testInsertId).
- 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))
- }, func(m UserModel) {
- result, err := m.FindOne(testInsertId)
- assert.Nil(t, err)
- assert.Equal(t, *result, data)
- })
- assert.Nil(t, err)
- err = mockUser(func(mock sqlmock.Sqlmock) {
- mock.ExpectExec(fmt.Sprintf("delete from %s where `id` = ?", testTable)).WithArgs(testInsertId).WillReturnResult(sqlmock.NewResult(testInsertId, testRowsAffected))
- }, func(m UserModel) {
- err := m.Delete(testInsertId)
- assert.Nil(t, err)
- })
- assert.Nil(t, err)
- }
- // with cache
- func mockStudent(mockFn func(mock sqlmock.Sqlmock), fn func(m StudentModel, r *redis.Redis)) error {
- db, mock, err := sqlmock.New()
- if err != nil {
- return err
- }
- defer db.Close()
- mock.ExpectBegin()
- mockFn(mock)
- mock.ExpectCommit()
- conn := mocksql.NewMockConn(db)
- r, clean, err := redistest.CreateRedis()
- if err != nil {
- return err
- }
- defer clean()
- m := NewStudentModel(conn, cache.CacheConf{
- {
- RedisConf: redis.RedisConf{
- Host: r.Addr,
- Type: "node",
- },
- Weight: 100,
- },
- })
- mock.ExpectBegin()
- fn(m, r)
- mock.ExpectCommit()
- return nil
- }
- // without cache
- func mockUser(mockFn func(mock sqlmock.Sqlmock), fn func(m UserModel)) error {
- db, mock, err := sqlmock.New()
- if err != nil {
- return err
- }
- defer db.Close()
- mock.ExpectBegin()
- mockFn(mock)
- mock.ExpectCommit()
- conn := mocksql.NewMockConn(db)
- m := NewUserModel(conn)
- fn(m)
- return nil
- }
|