...
1
2
3
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
21
22
23
24 type pageHandler struct {
25 param bool
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
95 if got, want := countPages(), nPages; got != want {
96 t.Errorf("got %d pages, want %d", got, want)
97 }
98
99
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
106
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
144 if got, want := countPages(), nPages; got != want {
145 t.Errorf("got %d pages, want %d", got, want)
146 }
147
148
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
155
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