mirror of https://github.com/zhufuyi/sponge
251 lines
6.1 KiB
Go
251 lines
6.1 KiB
Go
package dao
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
"github.com/go-dev-frame/sponge/pkg/gotest"
|
|
"github.com/go-dev-frame/sponge/pkg/sgorm/query"
|
|
"github.com/go-dev-frame/sponge/pkg/utils"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/go-dev-frame/sponge/internal/cache"
|
|
"github.com/go-dev-frame/sponge/internal/database"
|
|
"github.com/go-dev-frame/sponge/internal/model"
|
|
)
|
|
|
|
func newUserExampleDao() *gotest.Dao {
|
|
testData := &model.UserExample{}
|
|
testData.ID = 1
|
|
// you can set the other fields of testData here, such as:
|
|
//testData.CreatedAt = time.Now()
|
|
//testData.UpdatedAt = testData.CreatedAt
|
|
|
|
// init mock cache
|
|
//c := gotest.NewCache(map[string]interface{}{"no cache": testData}) // to test mysql, disable caching
|
|
c := gotest.NewCache(map[string]interface{}{utils.Uint64ToStr(testData.ID): testData})
|
|
c.ICache = cache.NewUserExampleCache(&database.CacheType{
|
|
CType: "redis",
|
|
Rdb: c.RedisClient,
|
|
})
|
|
|
|
// init mock dao
|
|
d := gotest.NewDao(c, testData)
|
|
d.IDao = NewUserExampleDao(d.DB, c.ICache.(cache.UserExampleCache))
|
|
|
|
return d
|
|
}
|
|
|
|
func Test_userExampleDao_Create(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
|
|
d.SQLMock.ExpectBegin()
|
|
d.SQLMock.ExpectExec("INSERT INTO .*").
|
|
WithArgs(d.GetAnyArgs(testData)...).
|
|
WillReturnResult(sqlmock.NewResult(1, 1))
|
|
d.SQLMock.ExpectCommit()
|
|
|
|
err := d.IDao.(UserExampleDao).Create(d.Ctx, testData)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func Test_userExampleDao_DeleteByID(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
expectedSQLForDeletion := "UPDATE .*"
|
|
expectedArgsForDeletionTime := d.AnyTime
|
|
|
|
d.SQLMock.ExpectBegin()
|
|
d.SQLMock.ExpectExec(expectedSQLForDeletion).
|
|
WithArgs(expectedArgsForDeletionTime, testData.ID).
|
|
WillReturnResult(sqlmock.NewResult(int64(testData.ID), 1))
|
|
d.SQLMock.ExpectCommit()
|
|
|
|
err := d.IDao.(UserExampleDao).DeleteByID(d.Ctx, testData.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// zero id error
|
|
err = d.IDao.(UserExampleDao).DeleteByID(d.Ctx, 0)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func Test_userExampleDao_UpdateByID(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
|
|
d.SQLMock.ExpectBegin()
|
|
d.SQLMock.ExpectExec("UPDATE .*").
|
|
WithArgs(d.AnyTime, testData.ID).
|
|
WillReturnResult(sqlmock.NewResult(1, 1))
|
|
d.SQLMock.ExpectCommit()
|
|
|
|
err := d.IDao.(UserExampleDao).UpdateByID(d.Ctx, testData)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// zero id error
|
|
err = d.IDao.(UserExampleDao).UpdateByID(d.Ctx, &model.UserExample{})
|
|
assert.Error(t, err)
|
|
// delete the templates code start
|
|
// update error
|
|
testData = &model.UserExample{
|
|
Name: "foo",
|
|
Password: "f447b20a7fcbf53a5d5be013ea0b15af",
|
|
Email: "foo@bar.com",
|
|
Phone: "16000000001",
|
|
Avatar: "http://foo/1.jpg",
|
|
Age: 10,
|
|
Gender: 1,
|
|
Status: 1,
|
|
}
|
|
testData.ID = 1
|
|
err = d.IDao.(UserExampleDao).UpdateByID(d.Ctx, testData)
|
|
assert.Error(t, err)
|
|
// delete the templates code end
|
|
}
|
|
|
|
func Test_userExampleDao_GetByID(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
|
|
// column names and corresponding data
|
|
rows := sqlmock.NewRows([]string{"id"}).
|
|
AddRow(testData.ID)
|
|
|
|
d.SQLMock.ExpectQuery("SELECT .*").
|
|
WithArgs(testData.ID, 1).
|
|
WillReturnRows(rows)
|
|
|
|
_, err := d.IDao.(UserExampleDao).GetByID(d.Ctx, testData.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = d.SQLMock.ExpectationsWereMet()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// error test
|
|
d.SQLMock.ExpectQuery("SELECT .*").
|
|
WithArgs(2).
|
|
WillReturnRows(rows)
|
|
_, err = d.IDao.(UserExampleDao).GetByID(d.Ctx, 2)
|
|
assert.Error(t, err)
|
|
|
|
d.SQLMock.ExpectQuery("SELECT .*").
|
|
WithArgs(3, 4).
|
|
WillReturnRows(rows)
|
|
_, err = d.IDao.(UserExampleDao).GetByID(d.Ctx, 4)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func Test_userExampleDao_GetByColumns(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
|
|
// column names and corresponding data
|
|
rows := sqlmock.NewRows([]string{"id"}).
|
|
AddRow(testData.ID)
|
|
|
|
d.SQLMock.ExpectQuery("SELECT .*").WillReturnRows(rows)
|
|
|
|
_, _, err := d.IDao.(UserExampleDao).GetByColumns(d.Ctx, &query.Params{
|
|
Page: 0,
|
|
Limit: 10,
|
|
Sort: "ignore count", // ignore test count(*)
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = d.SQLMock.ExpectationsWereMet()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// err test
|
|
_, _, err = d.IDao.(UserExampleDao).GetByColumns(d.Ctx, &query.Params{
|
|
Page: 0,
|
|
Limit: 10,
|
|
Columns: []query.Column{
|
|
{
|
|
Name: "id",
|
|
Exp: "<",
|
|
Value: 0,
|
|
},
|
|
},
|
|
})
|
|
assert.Error(t, err)
|
|
|
|
// error test
|
|
dao := &userExampleDao{}
|
|
_, _, err = dao.GetByColumns(context.Background(), &query.Params{Columns: []query.Column{{}}})
|
|
t.Log(err)
|
|
}
|
|
|
|
func Test_userExampleDao_CreateByTx(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
|
|
d.SQLMock.ExpectBegin()
|
|
d.SQLMock.ExpectExec("INSERT INTO .*").
|
|
WithArgs(d.GetAnyArgs(testData)...).
|
|
WillReturnResult(sqlmock.NewResult(1, 1))
|
|
d.SQLMock.ExpectCommit()
|
|
|
|
_, err := d.IDao.(UserExampleDao).CreateByTx(d.Ctx, d.DB, testData)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func Test_userExampleDao_DeleteByTx(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
expectedSQLForDeletion := "UPDATE .*"
|
|
expectedArgsForDeletionTime := d.AnyTime
|
|
|
|
d.SQLMock.ExpectBegin()
|
|
d.SQLMock.ExpectExec(expectedSQLForDeletion).
|
|
WithArgs(expectedArgsForDeletionTime, testData.ID).
|
|
WillReturnResult(sqlmock.NewResult(int64(testData.ID), 1))
|
|
d.SQLMock.ExpectCommit()
|
|
|
|
err := d.IDao.(UserExampleDao).DeleteByTx(d.Ctx, d.DB, testData.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func Test_userExampleDao_UpdateByTx(t *testing.T) {
|
|
d := newUserExampleDao()
|
|
defer d.Close()
|
|
testData := d.TestData.(*model.UserExample)
|
|
|
|
d.SQLMock.ExpectBegin()
|
|
d.SQLMock.ExpectExec("UPDATE .*").
|
|
WithArgs(d.AnyTime, testData.ID).
|
|
WillReturnResult(sqlmock.NewResult(1, 1))
|
|
d.SQLMock.ExpectCommit()
|
|
|
|
err := d.IDao.(UserExampleDao).UpdateByTx(d.Ctx, d.DB, testData)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|