test: add comprehensive validation and cursor test coverage

This commit is contained in:
2026-01-01 15:27:53 +01:00
parent 250a5e0c04
commit 3af635b6c3
+163
View File
@@ -1,6 +1,7 @@
package pagination package pagination
import ( import (
"errors"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@@ -144,3 +145,165 @@ func TestGetPage(t *testing.T) {
}) })
} }
} }
func TestValidate(t *testing.T) {
tests := []struct {
name string
first *int
after *string
last *int
before *string
wantErr error
}{
{
name: "valid first",
first: ptr(10),
wantErr: nil,
},
{
name: "valid last",
last: ptr(10),
wantErr: nil,
},
{
name: "first and last both provided",
first: ptr(10),
last: ptr(10),
wantErr: ErrFirstAndLastProvided,
},
{
name: "negative first",
first: ptr(-1),
wantErr: ErrFirstNegative,
},
{
name: "negative last",
last: ptr(-1),
wantErr: ErrLastNegative,
},
{
name: "after and before both provided",
after: ptr("MQ=="),
before: ptr("Mg=="),
wantErr: ErrAfterAndBeforeProvided,
},
{
name: "invalid after cursor",
after: ptr("not-valid-base64!@#"),
wantErr: ErrInvalidAfterCursor,
},
{
name: "invalid before cursor",
before: ptr("not-valid-base64!@#"),
wantErr: ErrInvalidBeforeCursor,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := Validate(tt.first, tt.after, tt.last, tt.before)
if tt.wantErr != nil {
assert.True(t, errors.Is(err, tt.wantErr), "Validate() error = %v, wantErr %v", err, tt.wantErr)
} else {
assert.NoError(t, err)
}
})
}
}
func TestDecodeCursor(t *testing.T) {
tests := []struct {
name string
cursor *string
want string
wantErr error
}{
{
name: "nil cursor",
cursor: nil,
want: "",
wantErr: nil,
},
{
name: "valid cursor",
cursor: ptr("dGVzdA=="),
want: "test",
wantErr: nil,
},
{
name: "invalid base64",
cursor: ptr("not-valid-base64!@#"),
want: "",
wantErr: ErrInvalidCursor,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := DecodeCursor(tt.cursor)
if tt.wantErr != nil {
assert.True(t, errors.Is(err, tt.wantErr), "DecodeCursor() error = %v, wantErr %v", err, tt.wantErr)
} else {
assert.NoError(t, err)
assert.Equal(t, tt.want, got)
}
})
}
}
func TestValidateCursor(t *testing.T) {
tests := []struct {
name string
cursor *string
wantErr error
}{
{
name: "nil cursor",
cursor: nil,
wantErr: nil,
},
{
name: "valid cursor",
cursor: ptr("dGVzdA=="),
wantErr: nil,
},
{
name: "invalid cursor",
cursor: ptr("not-valid-base64!@#"),
wantErr: ErrInvalidCursor,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := ValidateCursor(tt.cursor)
if tt.wantErr != nil {
assert.True(t, errors.Is(err, tt.wantErr), "ValidateCursor() error = %v, wantErr %v", err, tt.wantErr)
} else {
assert.NoError(t, err)
}
})
}
}
func TestEncodeCursor(t *testing.T) {
tests := []struct {
name string
cursor string
want string
}{
{
name: "simple string",
cursor: "test",
want: "dGVzdA==",
},
{
name: "empty string",
cursor: "",
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := EncodeCursor(tt.cursor)
assert.Equal(t, tt.want, got)
})
}
}