github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/pagination/testing/linked_test.go (about) 1 package testing 2 3 import ( 4 "fmt" 5 "net/http" 6 "testing" 7 8 "github.com/opentelekomcloud/gophertelekomcloud/pagination" 9 th "github.com/opentelekomcloud/gophertelekomcloud/testhelper" 10 ) 11 12 // LinkedPager sample and test cases. 13 14 type LinkedPageResult struct { 15 pagination.LinkedPageBase 16 } 17 18 func (r LinkedPageResult) IsEmpty() (bool, error) { 19 is, err := ExtractLinkedInts(r) 20 return len(is) == 0, err 21 } 22 23 func ExtractLinkedInts(r pagination.Page) ([]int, error) { 24 var s struct { 25 Ints []int `json:"ints"` 26 } 27 err := (r.(LinkedPageResult)).ExtractInto(&s) 28 return s.Ints, err 29 } 30 31 func createLinked() pagination.Pager { 32 th.SetupHTTP() 33 34 th.Mux.HandleFunc("/page1", func(w http.ResponseWriter, r *http.Request) { 35 w.Header().Add("Content-Type", "application/json") 36 _, _ = fmt.Fprintf(w, `{ "ints": [1, 2, 3], "links": { "next": "%s/page2" } }`, th.Server.URL) 37 }) 38 39 th.Mux.HandleFunc("/page2", func(w http.ResponseWriter, r *http.Request) { 40 w.Header().Add("Content-Type", "application/json") 41 _, _ = fmt.Fprintf(w, `{ "ints": [4, 5, 6], "links": { "next": "%s/page3" } }`, th.Server.URL) 42 }) 43 44 th.Mux.HandleFunc("/page3", func(w http.ResponseWriter, r *http.Request) { 45 w.Header().Add("Content-Type", "application/json") 46 _, _ = fmt.Fprint(w, `{ "ints": [7, 8, 9], "links": { "next": null } }`) 47 }) 48 49 client := createClient() 50 51 createPage := func(r pagination.PageResult) pagination.Page { 52 return LinkedPageResult{pagination.LinkedPageBase{PageResult: r}} 53 } 54 55 return pagination.NewPager(client, th.Server.URL+"/page1", createPage) 56 } 57 58 func TestEnumerateLinked(t *testing.T) { 59 pager := createLinked() 60 defer th.TeardownHTTP() 61 62 callCount := 0 63 err := pager.EachPage(func(page pagination.Page) (bool, error) { 64 actual, err := ExtractLinkedInts(page) 65 if err != nil { 66 return false, err 67 } 68 69 t.Logf("Handler invoked with %v", actual) 70 71 var expected []int 72 switch callCount { 73 case 0: 74 expected = []int{1, 2, 3} 75 case 1: 76 expected = []int{4, 5, 6} 77 case 2: 78 expected = []int{7, 8, 9} 79 default: 80 t.Fatalf("Unexpected call count: %d", callCount) 81 return false, nil 82 } 83 84 th.AssertDeepEquals(t, expected, actual) 85 callCount++ 86 return true, nil 87 }) 88 th.AssertNoErr(t, err) 89 th.AssertEquals(t, 3, callCount) 90 } 91 92 func TestAllPagesLinked(t *testing.T) { 93 pager := createLinked() 94 defer th.TeardownHTTP() 95 96 page, err := pager.AllPages() 97 th.AssertNoErr(t, err) 98 99 expected := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} 100 actual, err := ExtractLinkedInts(page) 101 th.AssertNoErr(t, err) 102 th.CheckDeepEquals(t, expected, actual) 103 }