test: add comprehensive validation and cursor test coverage
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package pagination
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user