...

Source file src/google.golang.org/api/google-api-go-generator/paging_test.go

Documentation: google.golang.org/api/google-api-go-generator

     1  // Copyright 2017 Google LLC.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"context"
     9  	"encoding/json"
    10  	"fmt"
    11  	"net/http"
    12  	"net/http/httptest"
    13  	"net/url"
    14  	"strconv"
    15  	"testing"
    16  
    17  	crm "google.golang.org/api/cloudresourcemanager/v1"
    18  )
    19  
    20  //go:generate -command api go run gen.go docurls.go replacements.go -install -api
    21  //go:generate api cloudresourcemanager:v1
    22  
    23  // A handler that mimics paging behavior.
    24  type pageHandler struct {
    25  	param bool // is page token in a query param, or body?
    26  	err   error
    27  }
    28  
    29  const nPages = 3
    30  
    31  func (h *pageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    32  	v, err := url.ParseRequestURI(r.URL.RequestURI())
    33  	if err != nil {
    34  		h.err = err
    35  		return
    36  	}
    37  
    38  	var pageToken string
    39  	if h.param {
    40  		pts := v.Query()["pageToken"]
    41  		if len(pts) > 0 {
    42  			pageToken = pts[0]
    43  		}
    44  	} else {
    45  		d := json.NewDecoder(r.Body)
    46  		req := struct{ PageToken *string }{&pageToken}
    47  		if err := d.Decode(&req); err != nil {
    48  			h.err = err
    49  			return
    50  		}
    51  	}
    52  	var start int
    53  	if pageToken != "" {
    54  		start, err = strconv.Atoi(pageToken)
    55  		if err != nil {
    56  			h.err = err
    57  			return
    58  		}
    59  	}
    60  	nextPageToken := ""
    61  	if start+1 < nPages {
    62  		nextPageToken = strconv.Itoa(start + 1)
    63  	}
    64  	fmt.Fprintf(w, `{"nextPageToken": %q}`, nextPageToken)
    65  }
    66  
    67  func TestPagesParam(t *testing.T) {
    68  	handler := &pageHandler{param: true}
    69  	server := httptest.NewServer(handler)
    70  	defer server.Close()
    71  
    72  	client := &http.Client{}
    73  	s, err := crm.New(client)
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  	s.BasePath = server.URL
    78  
    79  	ctx := context.Background()
    80  	c := s.Projects.List()
    81  
    82  	countPages := func() int {
    83  		n := 0
    84  		err = c.Pages(ctx, func(*crm.ListProjectsResponse) error {
    85  			n++
    86  			return nil
    87  		})
    88  		if err != nil {
    89  			t.Fatal(err)
    90  		}
    91  		return n
    92  	}
    93  
    94  	// Pages traverses through all the pages.
    95  	if got, want := countPages(), nPages; got != want {
    96  		t.Errorf("got %d pages, want %d", got, want)
    97  	}
    98  
    99  	// Pages starts wherever the current page token is.
   100  	c.PageToken("1")
   101  	if got, want := countPages(), nPages-1; got != want {
   102  		t.Errorf("got %d pages, want %d", got, want)
   103  	}
   104  
   105  	// Pages restores the initial state: we will again visit one fewer
   106  	// page, because the initial page token was reset to "1".
   107  	if got, want := countPages(), nPages-1; got != want {
   108  		t.Errorf("got %d pages, want %d", got, want)
   109  	}
   110  
   111  	if handler.err != nil {
   112  		t.Fatal(handler.err)
   113  	}
   114  }
   115  
   116  func TestPagesRequestField(t *testing.T) {
   117  	handler := &pageHandler{param: false}
   118  	server := httptest.NewServer(handler)
   119  	defer server.Close()
   120  
   121  	client := &http.Client{}
   122  	s, err := crm.New(client)
   123  	if err != nil {
   124  		t.Fatal(err)
   125  	}
   126  	s.BasePath = server.URL
   127  
   128  	ctx := context.Background()
   129  	c := s.Organizations.Search(&crm.SearchOrganizationsRequest{})
   130  
   131  	countPages := func() int {
   132  		n := 0
   133  		err = c.Pages(ctx, func(*crm.SearchOrganizationsResponse) error {
   134  			n++
   135  			return nil
   136  		})
   137  		if err != nil {
   138  			t.Fatal(err)
   139  		}
   140  		return n
   141  	}
   142  
   143  	// Pages traverses through all the pages.
   144  	if got, want := countPages(), nPages; got != want {
   145  		t.Errorf("got %d pages, want %d", got, want)
   146  	}
   147  
   148  	// Pages starts wherever the current page token is.
   149  	c = s.Organizations.Search(&crm.SearchOrganizationsRequest{PageToken: "1"})
   150  	if got, want := countPages(), nPages-1; got != want {
   151  		t.Errorf("got %d pages, want %d", got, want)
   152  	}
   153  
   154  	// Pages restores the initial state: we will again visit one fewer
   155  	// page, because the initial page token was reset to "1".
   156  	if got, want := countPages(), nPages-1; got != want {
   157  		t.Errorf("got %d pages, want %d", got, want)
   158  	}
   159  }
   160  

View as plain text