Adding pagination to list codespaces

This commit is contained in:
Gabriel Ramírez 2021-10-05 16:49:40 +00:00 committed by GitHub
parent 3652307cf3
commit 777978644c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 89 additions and 40 deletions

View file

@ -189,36 +189,54 @@ type CodespaceEnvironmentConnection struct {
// ListCodespaces returns a list of codespaces for the user.
func (a *API) ListCodespaces(ctx context.Context) ([]*Codespace, error) {
req, err := http.NewRequest(
http.MethodGet, a.githubAPI+"/user/codespaces", nil,
)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
page := 1
per_page := 50
codespaces := []*Codespace{}
for {
req, err := http.NewRequest(
http.MethodGet, a.githubAPI+"/user/codespaces", nil,
)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
}
a.setHeaders(req)
q := req.URL.Query()
q.Add("page", strconv.Itoa(page))
q.Add("per_page", strconv.Itoa(per_page))
req.URL.RawQuery = q.Encode()
resp, err := a.do(ctx, req, "/user/codespaces")
if err != nil {
return nil, fmt.Errorf("error making request: %w", err)
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
if resp.StatusCode != http.StatusOK {
return nil, jsonErrorResponse(b)
}
var response struct {
Codespaces []*Codespace `json:"codespaces"`
}
if err := json.Unmarshal(b, &response); err != nil {
return nil, fmt.Errorf("error unmarshaling response: %w", err)
}
if len(response.Codespaces) > 0 {
codespaces = append(codespaces, response.Codespaces...)
page++
} else {
break
}
}
a.setHeaders(req)
resp, err := a.do(ctx, req, "/user/codespaces")
if err != nil {
return nil, fmt.Errorf("error making request: %w", err)
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
if resp.StatusCode != http.StatusOK {
return nil, jsonErrorResponse(b)
}
var response struct {
Codespaces []*Codespace `json:"codespaces"`
}
if err := json.Unmarshal(b, &response); err != nil {
return nil, fmt.Errorf("error unmarshaling response: %w", err)
}
return response.Codespaces, nil
return codespaces, nil
}
// getCodespaceTokenRequest is the request body for the get codespace token endpoint.

View file

@ -6,22 +6,50 @@ import (
"fmt"
"net/http"
"net/http/httptest"
"strconv"
"testing"
)
func TestListCodespaces(t *testing.T) {
codespaces := []*Codespace{
{
Name: "testcodespace",
CreatedAt: "2021-08-09T10:10:24+02:00",
LastUsedAt: "2021-08-09T13:10:24+02:00",
},
func generateCodespaceList(start int, end int) []*Codespace {
codespacesList := []*Codespace{}
for i := start; i < end; i++ {
codespacesList = append(codespacesList, &Codespace{
Name: fmt.Sprintf("codespace-%d", i),
})
}
return codespacesList
}
func TestListCodespaces(t *testing.T) {
svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/user/codespaces" {
t.Fatal("Incorrect path")
}
page := 1
if r.URL.Query().Has("page") {
page, _ = strconv.Atoi(r.URL.Query()["page"][0])
}
per_page := 0
if r.URL.Query().Has("per_page") {
per_page, _ = strconv.Atoi(r.URL.Query()["per_page"][0])
}
codespaces := []*Codespace{}
if page == 1 {
codespaces = generateCodespaceList(0, per_page)
} else if page == 2 {
codespaces = generateCodespaceList(per_page, per_page*2)
}
response := struct {
Codespaces []*Codespace `json:"codespaces"`
TotalCount int `json:"total_count"`
}{
Codespaces: codespaces,
TotalCount: 100,
}
data, _ := json.Marshal(response)
fmt.Fprint(w, string(data))
@ -38,13 +66,16 @@ func TestListCodespaces(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if len(codespaces) != 1 {
t.Fatalf("expected 1 codespace, got %d", len(codespaces))
if len(codespaces) != 100 {
t.Fatalf("expected 100 codespace, got %d", len(codespaces))
}
if codespaces[0].Name != "testcodespace" {
t.Fatalf("expected testcodespace, got %s", codespaces[0].Name)
if codespaces[0].Name != "codespace-0" {
t.Fatalf("expected codespace-0, got %s", codespaces[0].Name)
}
if codespaces[99].Name != "codespace-99" {
t.Fatalf("expected codespace-99, got %s", codespaces[0].Name)
}
}