go-forge/pagination_test.go
Virgil 551a964fdb
All checks were successful
Security Scan / security (push) Successful in 9s
Test / test (push) Successful in 1m36s
refactor(ax): enforce v0.8.0 polish rules
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-29 23:39:24 +00:00

131 lines
3.5 KiB
Go

package forge
import (
"context"
json "github.com/goccy/go-json"
"net/http"
"net/http/httptest"
"testing"
)
func TestPagination_SinglePage_Good(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-Total-Count", "2")
json.NewEncoder(w).Encode([]map[string]int{{"id": 1}, {"id": 2}})
}))
defer srv.Close()
c := NewClient(srv.URL, "tok")
result, err := ListAll[map[string]int](context.Background(), c, "/api/v1/repos", nil)
if err != nil {
t.Fatal(err)
}
if len(result) != 2 {
t.Errorf("got %d items", len(result))
}
}
func TestPagination_MultiPage_Good(t *testing.T) {
page := 0
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
page++
w.Header().Set("X-Total-Count", "100")
items := make([]map[string]int, 50)
for i := range items {
items[i] = map[string]int{"id": (page-1)*50 + i + 1}
}
json.NewEncoder(w).Encode(items)
}))
defer srv.Close()
c := NewClient(srv.URL, "tok")
result, err := ListAll[map[string]int](context.Background(), c, "/api/v1/repos", nil)
if err != nil {
t.Fatal(err)
}
if len(result) != 100 {
t.Errorf("got %d items, want 100", len(result))
}
}
func TestPagination_EmptyResult_Good(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-Total-Count", "0")
json.NewEncoder(w).Encode([]map[string]int{})
}))
defer srv.Close()
c := NewClient(srv.URL, "tok")
result, err := ListAll[map[string]int](context.Background(), c, "/api/v1/repos", nil)
if err != nil {
t.Fatal(err)
}
if len(result) != 0 {
t.Errorf("got %d items", len(result))
}
}
func TestPagination_Iter_Good(t *testing.T) {
page := 0
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
page++
w.Header().Set("X-Total-Count", "100")
items := make([]map[string]int, 50)
for i := range items {
items[i] = map[string]int{"id": (page-1)*50 + i + 1}
}
json.NewEncoder(w).Encode(items)
}))
defer srv.Close()
c := NewClient(srv.URL, "tok")
count := 0
for item, err := range ListIter[map[string]int](context.Background(), c, "/api/v1/repos", nil) {
if err != nil {
t.Fatal(err)
}
count++
if item["id"] != count {
t.Errorf("got id %d, want %d", item["id"], count)
}
}
if count != 100 {
t.Errorf("got %d items, want 100", count)
}
}
func TestListPage_QueryParams_Good(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
p := r.URL.Query().Get("page")
l := r.URL.Query().Get("limit")
s := r.URL.Query().Get("state")
if p != "2" || l != "25" || s != "open" {
t.Errorf("wrong params: page=%s limit=%s state=%s", p, l, s)
}
w.Header().Set("X-Total-Count", "50")
json.NewEncoder(w).Encode([]map[string]int{})
}))
defer srv.Close()
c := NewClient(srv.URL, "tok")
_, err := ListPage[map[string]int](context.Background(), c, "/api/v1/repos",
map[string]string{"state": "open"}, ListOptions{Page: 2, Limit: 25})
if err != nil {
t.Fatal(err)
}
}
func TestPagination_ServerError_Bad(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(500)
json.NewEncoder(w).Encode(map[string]string{"message": "fail"})
}))
defer srv.Close()
c := NewClient(srv.URL, "tok")
_, err := ListAll[map[string]int](context.Background(), c, "/api/v1/repos", nil)
if err == nil {
t.Fatal("expected error")
}
}