From 3af635b6c3442462df947cf3ffcb053df73c2620 Mon Sep 17 00:00:00 2001 From: Joakim Olsson Date: Thu, 1 Jan 2026 15:27:53 +0100 Subject: [PATCH] test: add comprehensive validation and cursor test coverage --- pagination_test.go | 163 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/pagination_test.go b/pagination_test.go index 26a322d..19fca3b 100644 --- a/pagination_test.go +++ b/pagination_test.go @@ -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) + }) + } +}