sponge/internal/dao/userExample_test.go.exp

366 lines
8.6 KiB
Plaintext

package dao
import (
"context"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"github.com/stretchr/testify/assert"
"github.com/go-dev-frame/sponge/pkg/sgorm/query"
"github.com/go-dev-frame/sponge/pkg/gotest"
"github.com/go-dev-frame/sponge/pkg/utils"
"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 .*"
d.SQLMock.ExpectBegin()
d.SQLMock.ExpectExec(expectedSQLForDeletion).
WithArgs(d.AnyTime, 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)
}
// notfound error
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)
rows := sqlmock.NewRows([]string{"id", "created_at", "updated_at"}).
AddRow(testData.ID, testData.CreatedAt, testData.UpdatedAt)
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_DeleteByIDs(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(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).DeleteByIDs(d.Ctx, []uint64{0})
assert.Error(t, err)
}
func Test_userExampleDao_GetByCondition(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).
WillReturnRows(rows)
_, err := d.IDao.(UserExampleDao).GetByCondition(d.Ctx, &query.Conditions{
Columns: []query.Column{
{
Name: "id",
Value: testData.ID,
},
},
})
if err != nil {
t.Fatal(err)
}
err = d.SQLMock.ExpectationsWereMet()
if err != nil {
t.Fatal(err)
}
// notfound error
d.SQLMock.ExpectQuery("SELECT .*").
WithArgs(2).
WillReturnRows(rows)
_, err = d.IDao.(UserExampleDao).GetByCondition(d.Ctx, &query.Conditions{
Columns: []query.Column{
{
Name: "id",
Value: 2,
},
},
})
assert.Error(t, err)
}
func Test_userExampleDao_GetByIDs(t *testing.T) {
d := newUserExampleDao()
defer d.Close()
testData := d.TestData.(*model.UserExample)
rows := sqlmock.NewRows([]string{"id", "created_at", "updated_at"}).
AddRow(testData.ID, testData.CreatedAt, testData.UpdatedAt)
d.SQLMock.ExpectQuery("SELECT .*").
WithArgs(testData.ID).
WillReturnRows(rows)
_, err := d.IDao.(UserExampleDao).GetByIDs(d.Ctx, []uint64{testData.ID})
if err != nil {
t.Fatal(err)
}
_, err = d.IDao.(UserExampleDao).GetByIDs(d.Ctx, []uint64{111})
assert.Error(t, err)
err = d.SQLMock.ExpectationsWereMet()
if err != nil {
t.Fatal(err)
}
}
func Test_userExampleDao_GetByLastID(t *testing.T) {
d := newUserExampleDao()
defer d.Close()
testData := d.TestData.(*model.UserExample)
rows := sqlmock.NewRows([]string{"id", "created_at", "updated_at"}).
AddRow(testData.ID, testData.CreatedAt, testData.UpdatedAt)
d.SQLMock.ExpectQuery("SELECT .*").WillReturnRows(rows)
_, err := d.IDao.(UserExampleDao).GetByLastID(d.Ctx, 0, 10, "")
if err != nil {
t.Fatal(err)
}
err = d.SQLMock.ExpectationsWereMet()
if err != nil {
t.Fatal(err)
}
// err test
_, err = d.IDao.(UserExampleDao).GetByLastID(d.Ctx, 0, 10, "unknown-column")
assert.Error(t, 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 .*"
d.SQLMock.ExpectBegin()
d.SQLMock.ExpectExec(expectedSQLForDeletion).
WithArgs(d.AnyTime, 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)
}
}