| // Copyright 2017 Google LLC. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import ( | |
| "context" | |
| "encoding/json" | |
| "fmt" | |
| "net/http" | |
| "net/http/httptest" | |
| "net/url" | |
| "strconv" | |
| "testing" | |
| crm "google.golang.org/api/cloudresourcemanager/v1" | |
| ) | |
| //go:generate -command api go run gen.go docurls.go replacements.go -install -api | |
| //go:generate api cloudresourcemanager:v1 | |
| // A handler that mimics paging behavior. | |
| type pageHandler struct { | |
| param bool // is page token in a query param, or body? | |
| err error | |
| } | |
| const nPages = 3 | |
| func (h *pageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |
| v, err := url.ParseRequestURI(r.URL.RequestURI()) | |
| if err != nil { | |
| h.err = err | |
| return | |
| } | |
| var pageToken string | |
| if h.param { | |
| pts := v.Query()["pageToken"] | |
| if len(pts) > 0 { | |
| pageToken = pts[0] | |
| } | |
| } else { | |
| d := json.NewDecoder(r.Body) | |
| req := struct{ PageToken *string }{&pageToken} | |
| if err := d.Decode(&req); err != nil { | |
| h.err = err | |
| return | |
| } | |
| } | |
| var start int | |
| if pageToken != "" { | |
| start, err = strconv.Atoi(pageToken) | |
| if err != nil { | |
| h.err = err | |
| return | |
| } | |
| } | |
| nextPageToken := "" | |
| if start+1 < nPages { | |
| nextPageToken = strconv.Itoa(start + 1) | |
| } | |
| fmt.Fprintf(w, `{"nextPageToken": %q}`, nextPageToken) | |
| } | |
| func TestPagesParam(t *testing.T) { | |
| handler := &pageHandler{param: true} | |
| server := httptest.NewServer(handler) | |
| defer server.Close() | |
| client := &http.Client{} | |
| s, err := crm.New(client) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| s.BasePath = server.URL | |
| ctx := context.Background() | |
| c := s.Projects.List() | |
| countPages := func() int { | |
| n := 0 | |
| err = c.Pages(ctx, func(*crm.ListProjectsResponse) error { | |
| n++ | |
| return nil | |
| }) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| return n | |
| } | |
| // Pages traverses through all the pages. | |
| if got, want := countPages(), nPages; got != want { | |
| t.Errorf("got %d pages, want %d", got, want) | |
| } | |
| // Pages starts wherever the current page token is. | |
| c.PageToken("1") | |
| if got, want := countPages(), nPages-1; got != want { | |
| t.Errorf("got %d pages, want %d", got, want) | |
| } | |
| // Pages restores the initial state: we will again visit one fewer | |
| // page, because the initial page token was reset to "1". | |
| if got, want := countPages(), nPages-1; got != want { | |
| t.Errorf("got %d pages, want %d", got, want) | |
| } | |
| if handler.err != nil { | |
| t.Fatal(handler.err) | |
| } | |
| } | |
| func TestPagesRequestField(t *testing.T) { | |
| handler := &pageHandler{param: false} | |
| server := httptest.NewServer(handler) | |
| defer server.Close() | |
| client := &http.Client{} | |
| s, err := crm.New(client) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| s.BasePath = server.URL | |
| ctx := context.Background() | |
| c := s.Organizations.Search(&crm.SearchOrganizationsRequest{}) | |
| countPages := func() int { | |
| n := 0 | |
| err = c.Pages(ctx, func(*crm.SearchOrganizationsResponse) error { | |
| n++ | |
| return nil | |
| }) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| return n | |
| } | |
| // Pages traverses through all the pages. | |
| if got, want := countPages(), nPages; got != want { | |
| t.Errorf("got %d pages, want %d", got, want) | |
| } | |
| // Pages starts wherever the current page token is. | |
| c = s.Organizations.Search(&crm.SearchOrganizationsRequest{PageToken: "1"}) | |
| if got, want := countPages(), nPages-1; got != want { | |
| t.Errorf("got %d pages, want %d", got, want) | |
| } | |
| // Pages restores the initial state: we will again visit one fewer | |
| // page, because the initial page token was reset to "1". | |
| if got, want := countPages(), nPages-1; got != want { | |
| t.Errorf("got %d pages, want %d", got, want) | |
| } | |
| } |