test: add comprehensive validation and cursor test coverage
This commit is contained in:
@@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user