2020-12-21 09:43:32 +08:00
package model
import (
"database/sql"
2021-03-01 17:29:07 +08:00
"encoding/json"
2020-12-21 09:43:32 +08:00
"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
2021-03-01 17:29:07 +08:00
testInsertId int64 = 1
class = "一年级1班"
2020-12-21 09:43:32 +08:00
)
var data Student
2021-03-01 17:29:07 +08:00
data . Id = testInsertId
data . Class = class
2020-12-21 09:43:32 +08:00
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 ) ) .
2021-03-01 17:29:07 +08:00
WithArgs ( data . Class , data . Name , data . Age , data . Score ) .
WillReturnResult ( sqlmock . NewResult ( testInsertId , testRowsAffected ) )
} , func ( m StudentModel , redis * redis . Redis ) {
2020-12-21 09:43:32 +08:00
r , err := m . Insert ( data )
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
lastInsertId , err := r . LastInsertId ( )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
assert . Equal ( t , testInsertId , lastInsertId )
2020-12-21 09:43:32 +08:00
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 ) ) .
2021-03-01 17:29:07 +08:00
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 )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
assert . Equal ( t , * result , data )
2021-03-01 17:29:07 +08:00
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 )
2020-12-21 09:43:32 +08:00
} )
assert . Nil ( t , err )
err = mockStudent ( func ( mock sqlmock . Sqlmock ) {
2021-03-01 17:29:07 +08:00
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 ) {
2020-12-21 09:43:32 +08:00
data . Name = testUpdateName
err := m . Update ( data )
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
val , err := redis . Get ( fmt . Sprintf ( "%s%v" , cacheStudentIdPrefix , testInsertId ) )
assert . Nil ( t , err )
assert . Equal ( t , "" , val )
2020-12-21 09:43:32 +08:00
} )
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
data . Name = testUpdateName
2020-12-21 09:43:32 +08:00
err = mockStudent ( func ( mock sqlmock . Sqlmock ) {
mock . ExpectQuery ( fmt . Sprintf ( "select (.+) from %s " , testTable ) ) .
2021-03-01 17:29:07 +08:00
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 )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
assert . Equal ( t , * result , data )
2021-03-01 17:29:07 +08:00
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 )
2020-12-21 09:43:32 +08:00
} )
assert . Nil ( t , err )
err = mockStudent ( func ( mock sqlmock . Sqlmock ) {
2021-03-01 17:29:07 +08:00
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 ) )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
assert . Equal ( t , "1" , val )
2020-12-21 09:43:32 +08:00
} )
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
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 )
2020-12-21 09:43:32 +08:00
}
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
2021-03-01 17:29:07 +08:00
testInsertId int64 = 1
2020-12-21 09:43:32 +08:00
)
var data User
2021-03-01 17:29:07 +08:00
data . ID = testInsertId
2020-12-21 09:43:32 +08:00
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 ) .
2021-03-01 17:29:07 +08:00
WillReturnResult ( sqlmock . NewResult ( testInsertId , testRowsAffected ) )
2020-12-21 09:43:32 +08:00
} , func ( m UserModel ) {
r , err := m . Insert ( data )
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
lastInsertId , err := r . LastInsertId ( )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
2021-03-01 17:29:07 +08:00
assert . Equal ( t , testInsertId , lastInsertId )
2020-12-21 09:43:32 +08:00
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 ) ) .
2021-03-01 17:29:07 +08:00
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 ) )
2020-12-21 09:43:32 +08:00
} , func ( m UserModel ) {
2021-03-01 17:29:07 +08:00
result , err := m . FindOne ( testInsertId )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
assert . Equal ( t , * result , data )
} )
assert . Nil ( t , err )
err = mockUser ( func ( mock sqlmock . Sqlmock ) {
2021-03-01 17:29:07 +08:00
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 ) )
2020-12-21 09:43:32 +08:00
} , 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 ) ) .
2021-03-01 17:29:07 +08:00
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 ) )
2020-12-21 09:43:32 +08:00
} , func ( m UserModel ) {
2021-03-01 17:29:07 +08:00
result , err := m . FindOne ( testInsertId )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
assert . Equal ( t , * result , data )
} )
assert . Nil ( t , err )
err = mockUser ( func ( mock sqlmock . Sqlmock ) {
2021-03-01 17:29:07 +08:00
mock . ExpectExec ( fmt . Sprintf ( "delete from %s where `id` = ?" , testTable ) ) . WithArgs ( testInsertId ) . WillReturnResult ( sqlmock . NewResult ( testInsertId , testRowsAffected ) )
2020-12-21 09:43:32 +08:00
} , func ( m UserModel ) {
2021-03-01 17:29:07 +08:00
err := m . Delete ( testInsertId )
2020-12-21 09:43:32 +08:00
assert . Nil ( t , err )
} )
assert . Nil ( t , err )
}
// with cache
2021-03-01 17:29:07 +08:00
func mockStudent ( mockFn func ( mock sqlmock . Sqlmock ) , fn func ( m StudentModel , r * redis . Redis ) ) error {
2020-12-21 09:43:32 +08:00
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 ,
} ,
} )
2021-03-01 17:29:07 +08:00
mock . ExpectBegin ( )
fn ( m , r )
mock . ExpectCommit ( )
2020-12-21 09:43:32 +08:00
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
}