package dao import ( "context" "testing" "time" "github.com/zhufuyi/sponge/internal/cache" "github.com/zhufuyi/sponge/internal/model" "github.com/zhufuyi/sponge/pkg/ggorm/query" "github.com/zhufuyi/sponge/pkg/gotest" "github.com/zhufuyi/sponge/pkg/utils" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "gorm.io/gorm" ) func newUserExampleDao() *gotest.Dao { testData := &model.UserExample{} testData.ID = 1 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(&model.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) testData.DeletedAt = gorm.DeletedAt{ Time: time.Now(), Valid: false, } 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).DeleteByID(d.Ctx, 0) assert.Error(t, err) } func Test_userExampleDao_DeleteByIDs(t *testing.T) { d := newUserExampleDao() defer d.Close() testData := d.TestData.(*model.UserExample) testData.DeletedAt = gorm.DeletedAt{ Time: time.Now(), Valid: false, } 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_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, LoginAt: time.Now().Unix(), } 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) 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).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_GetByCondition(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).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_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, Size: 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, Size: 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) testData.DeletedAt = gorm.DeletedAt{ Time: time.Now(), Valid: false, } d.SQLMock.ExpectBegin() d.SQLMock.ExpectExec("UPDATE .*"). WithArgs(d.AnyTime, 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) } }