feat: game lobby service
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user