Files
goyco/internal/repositories/pagination_test.go

253 lines
5.9 KiB
Go

package repositories
import (
"fmt"
"testing"
"goyco/internal/database"
"gorm.io/gorm"
)
func TestApplyPagination(t *testing.T) {
suite := NewTestSuite(t)
tests := []struct {
name string
limit int
offset int
setupQuery func(*gorm.DB) *gorm.DB
verifyPagination func(*testing.T, *gorm.DB, int, int)
}{
{
name: "limit > 0 and offset > 0",
limit: 10,
offset: 5,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 20 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
if len(users) != limit {
t.Errorf("Expected %d users, got %d", limit, len(users))
}
},
},
{
name: "limit > 0 and offset = 0",
limit: 5,
offset: 0,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 10 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
if len(users) != limit {
t.Errorf("Expected %d users, got %d", limit, len(users))
}
},
},
{
name: "limit = 0 (should not apply limit)",
limit: 0,
offset: 5,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 10 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
expected := 5
if len(users) != expected {
t.Errorf("Expected %d users with offset %d, got %d", expected, offset, len(users))
}
},
},
{
name: "offset = 0 (should not apply offset)",
limit: 10,
offset: 0,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 15 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
if len(users) != limit {
t.Errorf("Expected %d users, got %d", limit, len(users))
}
},
},
{
name: "limit = 0 and offset = 0 (should not apply pagination)",
limit: 0,
offset: 0,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 10 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
if len(users) != 10 {
t.Errorf("Expected all 10 users, got %d", len(users))
}
},
},
{
name: "negative limit (should not apply limit)",
limit: -5,
offset: 10,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 20 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
expected := 10
if len(users) != expected {
t.Errorf("Expected %d users with offset %d, got %d", expected, offset, len(users))
}
},
},
{
name: "negative offset (should not apply offset)",
limit: 10,
offset: -5,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 15 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
if len(users) != limit {
t.Errorf("Expected %d users, got %d", limit, len(users))
}
},
},
{
name: "large limit and offset values",
limit: 1000,
offset: 500,
setupQuery: func(db *gorm.DB) *gorm.DB {
return db.Model(&database.User{})
},
verifyPagination: func(t *testing.T, query *gorm.DB, limit, offset int) {
for i := range 2000 {
suite.CreateTestUser(
fmt.Sprintf("testuser_%d", i),
fmt.Sprintf("user%d@example.com", i),
"password123",
)
}
var users []database.User
result := query.Find(&users)
if result.Error != nil {
t.Fatalf("Query failed: %v", result.Error)
}
if len(users) != limit {
t.Errorf("Expected %d users, got %d", limit, len(users))
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
suite.Reset()
baseQuery := tt.setupQuery(suite.DB)
paginatedQuery := ApplyPagination(baseQuery, tt.limit, tt.offset)
tt.verifyPagination(t, paginatedQuery, tt.limit, tt.offset)
})
}
}