Compare commits

...

2 Commits

Author SHA1 Message Date
5b0c6018c0 test: cover pagination 2026-01-12 12:24:50 +01:00
3303d13f15 refactor: move TestApplyPagination to its own file 2026-01-12 12:24:42 +01:00
2 changed files with 252 additions and 245 deletions

View File

@@ -1,12 +1,9 @@
package repositories
import (
"fmt"
"testing"
"goyco/internal/database"
"gorm.io/gorm"
)
func TestDatabase_AssertUserExists(t *testing.T) {
@@ -384,245 +381,3 @@ func TestDatabase_CreateTestAccountDeletionRequest(t *testing.T) {
}
})
}
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 := 0; i < 20; i++ {
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 := 0; i < 10; i++ {
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 := 0; i < 10; i++ {
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 := 0; i < 15; i++ {
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 := 0; i < 10; i++ {
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 := 0; i < 20; i++ {
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 := 0; i < 15; i++ {
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 := 0; i < 2000; i++ {
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)
})
}
}

View File

@@ -0,0 +1,252 @@
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 := 0; i < 20; i++ {
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 := 0; i < 10; i++ {
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 := 0; i < 10; i++ {
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 := 0; i < 15; i++ {
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 := 0; i < 10; i++ {
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 := 0; i < 20; i++ {
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 := 0; i < 15; i++ {
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 := 0; i < 2000; i++ {
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)
})
}
}