优化方法的使用
This commit is contained in:
Regular → Executable
+38
-10
@@ -1,6 +1,8 @@
|
||||
package gormx_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.yun.ink/pkg/responsex/gormx"
|
||||
@@ -18,19 +20,29 @@ func newDB(t *testing.T) *gorm.DB {
|
||||
return db
|
||||
}
|
||||
|
||||
// newDryRunDB 创建 DryRun 模式的 DB,用于断言生成的 SQL,不真正查询
|
||||
func newDryRunDB(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{DryRun: true})
|
||||
if err != nil {
|
||||
t.Fatalf("open sqlite failed: %v", err)
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
func TestGetDbOffset(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
page, size int64
|
||||
wantOffset int
|
||||
wantLimit int
|
||||
name string
|
||||
page, size int64
|
||||
wantOffset int
|
||||
wantLimit int
|
||||
}{
|
||||
{"page1 size10", 1, 10, 0, 10},
|
||||
{"page2 size10", 2, 10, 10, 10},
|
||||
{"page3 size20", 3, 20, 40, 20},
|
||||
{"page0 size10 default page to 1", 0, 10, 0, 10},
|
||||
{"page1 size0 default size to 10", 1, 0, 0, 10},
|
||||
{"both negative or zero max 1000", 0, 0, 0, 1000},
|
||||
{"both zero max 1000", 0, 0, 0, 1000},
|
||||
{"negative page default to 1", -1, 10, 0, 10},
|
||||
{"negative size default to 10", 1, -1, 0, 10},
|
||||
{"both negative", -1, -1, 0, 1000},
|
||||
@@ -39,14 +51,28 @@ func TestGetDbOffset(t *testing.T) {
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
db := newDB(t)
|
||||
result := gormx.GetDbOffset(db, tt.page, tt.size)
|
||||
db := newDryRunDB(t)
|
||||
var m testModel
|
||||
stmt := gormx.GetDbOffset(db, tt.page, tt.size).Find(&m).Statement
|
||||
|
||||
stmt := result.Statement
|
||||
// 验证 Limit 被正确设置
|
||||
if stmt == nil {
|
||||
t.Fatal("statement is nil")
|
||||
}
|
||||
got := stmt.SQL.String()
|
||||
if got == "" {
|
||||
t.Fatal("no SQL generated")
|
||||
}
|
||||
// 断言生成的 SQL 片段,避免依赖 Vars 顺序
|
||||
wantLimit := fmt.Sprintf("LIMIT %d", tt.wantLimit)
|
||||
if tt.wantOffset > 0 {
|
||||
wantOffset := fmt.Sprintf("OFFSET %d", tt.wantOffset)
|
||||
if !strings.Contains(got, wantOffset) {
|
||||
t.Errorf("sql %q 缺少 %q", got, wantOffset)
|
||||
}
|
||||
}
|
||||
if !strings.Contains(got, wantLimit) {
|
||||
t.Errorf("sql %q 缺少 %q", got, wantLimit)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -54,7 +80,9 @@ func TestGetDbOffset(t *testing.T) {
|
||||
func TestGetDbOffset_Chaining(t *testing.T) {
|
||||
db := newDB(t)
|
||||
|
||||
db.AutoMigrate(&testModel{})
|
||||
if err := db.AutoMigrate(&testModel{}); err != nil {
|
||||
t.Fatalf("migrate failed: %v", err)
|
||||
}
|
||||
|
||||
// 插入测试数据
|
||||
for i := 1; i <= 50; i++ {
|
||||
|
||||
Reference in New Issue
Block a user