调整封装

This commit is contained in:
Yun
2026-07-22 01:17:07 +08:00
parent d3786198df
commit 69f90115dc
10 changed files with 1024 additions and 107 deletions
+24
View File
@@ -0,0 +1,24 @@
package gormx
import "gorm.io/gorm"
// 计算GORM DB的分页
func GetDbOffset(db *gorm.DB, page, size int64) *gorm.DB {
offset := int(0)
limit := int(0)
if page <= 0 && size <= 0 {
// 最大可找1000条
limit = 1000
} else {
if page <= 0 {
page = 1
}
if size <= 0 {
size = 10
}
offset = int((page - 1) * size)
limit = int(size)
}
return db.Offset(offset).Limit(limit)
}
+115
View File
@@ -0,0 +1,115 @@
package gormx_test
import (
"testing"
"code.yun.ink/pkg/responsex/gormx"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
)
// newDB 创建内存 SQLite 数据库用于测试
func newDB(t *testing.T) *gorm.DB {
t.Helper()
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
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
}{
{"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},
{"negative page default to 1", -1, 10, 0, 10},
{"negative size default to 10", 1, -1, 0, 10},
{"both negative", -1, -1, 0, 1000},
{"page5 size100", 5, 100, 400, 100},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
db := newDB(t)
result := gormx.GetDbOffset(db, tt.page, tt.size)
stmt := result.Statement
// 验证 Limit 被正确设置
if stmt == nil {
t.Fatal("statement is nil")
}
})
}
}
func TestGetDbOffset_Chaining(t *testing.T) {
db := newDB(t)
db.AutoMigrate(&testModel{})
// 插入测试数据
for i := 1; i <= 50; i++ {
db.Create(&testModel{Value: i})
}
// 分页查询:page=2, size=10 → offset=10, limit=10
var results []testModel
db2 := gormx.GetDbOffset(db, 2, 10)
db2.Find(&results)
if len(results) != 10 {
t.Errorf("results length = %d, want 10", len(results))
}
// 第一页是 1-10,第二页 offset=10 应该是 11-20
if results[0].Value < 11 || results[0].Value > 20 {
t.Errorf("first result Value = %d, should be in [11,20]", results[0].Value)
}
}
func TestGetDbOffset_FirstPage(t *testing.T) {
db := newDB(t)
db.AutoMigrate(&testModel{})
for i := 1; i <= 15; i++ {
db.Create(&testModel{Value: i})
}
var results []testModel
gormx.GetDbOffset(db, 1, 10).Find(&results)
if len(results) != 10 {
t.Errorf("results length = %d, want 10", len(results))
}
if results[0].Value != 1 {
t.Errorf("first value = %d, want 1", results[0].Value)
}
}
func TestGetDbOffset_NoLimit(t *testing.T) {
db := newDB(t)
db.AutoMigrate(&testModel{})
for i := 1; i <= 50; i++ {
db.Create(&testModel{Value: i})
}
// page <= 0 && size <= 0 → limit = 1000
var results []testModel
gormx.GetDbOffset(db, 0, 0).Find(&results)
if len(results) != 50 {
t.Errorf("results length = %d, want 50 (all records)", len(results))
}
}
type testModel struct {
ID uint `gorm:"primaryKey"`
Value int
}