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 }