优化方法的使用

This commit is contained in:
yun
2026-09-19 01:31:34 +08:00
parent 00eba5cc75
commit 407fc49e0c
20 changed files with 1710 additions and 376 deletions
Regular → Executable
+38 -10
View File
@@ -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++ {