package shared_test import ( "encoding/base64" "strconv" "testing" "galaxy/lobby/internal/service/shared" "github.com/stretchr/testify/require" ) func TestParsePageDefaults(t *testing.T) { t.Parallel() page, err := shared.ParsePage("", "") require.NoError(t, err) require.Equal(t, shared.Page{Size: shared.DefaultPageSize, Offset: 0}, page) } func TestParsePageHonoursSize(t *testing.T) { t.Parallel() page, err := shared.ParsePage("75", "") require.NoError(t, err) require.Equal(t, shared.Page{Size: 75, Offset: 0}, page) } func TestParsePageHonoursToken(t *testing.T) { t.Parallel() token := shared.EncodeToken(150) page, err := shared.ParsePage("", token) require.NoError(t, err) require.Equal(t, shared.Page{Size: shared.DefaultPageSize, Offset: 150}, page) } func TestParsePageRejectsBadSize(t *testing.T) { t.Parallel() cases := []string{"abc", "0", "-3", strconv.Itoa(shared.MaxPageSize + 1)} for _, raw := range cases { t.Run(raw, func(t *testing.T) { t.Parallel() _, err := shared.ParsePage(raw, "") require.Error(t, err) require.Contains(t, err.Error(), "invalid page_size") }) } } func TestParsePageRejectsBadToken(t *testing.T) { t.Parallel() negative := base64.RawURLEncoding.EncodeToString([]byte("-1")) notInt := base64.RawURLEncoding.EncodeToString([]byte("abc")) cases := []string{"!!!", negative, notInt} for _, raw := range cases { t.Run(raw, func(t *testing.T) { t.Parallel() _, err := shared.ParsePage("", raw) require.Error(t, err) require.Contains(t, err.Error(), "invalid page_token") }) } } func TestEncodeTokenRoundtrip(t *testing.T) { t.Parallel() token := shared.EncodeToken(42) page, err := shared.ParsePage("", token) require.NoError(t, err) require.Equal(t, 42, page.Offset) } func TestWindowFirstPageWithMore(t *testing.T) { t.Parallel() start, end, nextOffset, hasMore := shared.Window(120, shared.Page{Size: 50}) require.Equal(t, 0, start) require.Equal(t, 50, end) require.Equal(t, 50, nextOffset) require.True(t, hasMore) } func TestWindowMiddlePage(t *testing.T) { t.Parallel() start, end, nextOffset, hasMore := shared.Window(120, shared.Page{Size: 50, Offset: 50}) require.Equal(t, 50, start) require.Equal(t, 100, end) require.Equal(t, 100, nextOffset) require.True(t, hasMore) } func TestWindowLastPageExact(t *testing.T) { t.Parallel() start, end, nextOffset, hasMore := shared.Window(100, shared.Page{Size: 50, Offset: 50}) require.Equal(t, 50, start) require.Equal(t, 100, end) require.Equal(t, 0, nextOffset) require.False(t, hasMore) } func TestWindowOffsetPastEnd(t *testing.T) { t.Parallel() start, end, nextOffset, hasMore := shared.Window(10, shared.Page{Size: 50, Offset: 200}) require.Equal(t, 10, start) require.Equal(t, 10, end) require.Equal(t, 0, nextOffset) require.False(t, hasMore) } func TestWindowZeroSizeFallsBackToDefault(t *testing.T) { t.Parallel() start, end, _, hasMore := shared.Window(120, shared.Page{Size: 0}) require.Equal(t, 0, start) require.Equal(t, shared.DefaultPageSize, end) require.True(t, hasMore) }