116 lines
2.6 KiB
Go
116 lines
2.6 KiB
Go
|
|
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
|
||
|
|
}
|