github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/pagination/testing/marker_test.go (about) 1 package testing 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "strings" 8 "testing" 9 10 "github.com/vnpaycloud-console/gophercloud/v2/pagination" 11 th "github.com/vnpaycloud-console/gophercloud/v2/testhelper" 12 ) 13 14 // MarkerPager sample and test cases. 15 16 type MarkerPageResult struct { 17 pagination.MarkerPageBase 18 } 19 20 func (r MarkerPageResult) IsEmpty() (bool, error) { 21 results, err := ExtractMarkerStrings(r) 22 if err != nil { 23 return true, err 24 } 25 return len(results) == 0, err 26 } 27 28 func (r MarkerPageResult) LastMarker() (string, error) { 29 results, err := ExtractMarkerStrings(r) 30 if err != nil { 31 return "", err 32 } 33 if len(results) == 0 { 34 return "", nil 35 } 36 return results[len(results)-1], nil 37 } 38 39 func createMarkerPaged(t *testing.T) pagination.Pager { 40 th.SetupHTTP() 41 42 th.Mux.HandleFunc("/page", func(w http.ResponseWriter, r *http.Request) { 43 if err := r.ParseForm(); err != nil { 44 t.Errorf("Failed to parse request form %v", err) 45 } 46 ms := r.Form["marker"] 47 switch { 48 case len(ms) == 0: 49 fmt.Fprint(w, "aaa\nbbb\nccc") 50 case len(ms) == 1 && ms[0] == "ccc": 51 fmt.Fprint(w, "ddd\neee\nfff") 52 case len(ms) == 1 && ms[0] == "fff": 53 fmt.Fprint(w, "ggg\nhhh\niii") 54 case len(ms) == 1 && ms[0] == "iii": 55 w.WriteHeader(http.StatusNoContent) 56 default: 57 t.Errorf("Request with unexpected marker: [%v]", ms) 58 } 59 }) 60 61 client := createClient() 62 63 createPage := func(r pagination.PageResult) pagination.Page { 64 p := MarkerPageResult{pagination.MarkerPageBase{PageResult: r}} 65 p.MarkerPageBase.Owner = p 66 return p 67 } 68 69 return pagination.NewPager(client, th.Server.URL+"/page", createPage) 70 } 71 72 func ExtractMarkerStrings(page pagination.Page) ([]string, error) { 73 content := page.(MarkerPageResult).Body.([]uint8) 74 parts := strings.Split(string(content), "\n") 75 results := make([]string, 0, len(parts)) 76 for _, part := range parts { 77 if len(part) > 0 { 78 results = append(results, part) 79 } 80 } 81 return results, nil 82 } 83 84 func TestEnumerateMarker(t *testing.T) { 85 pager := createMarkerPaged(t) 86 defer th.TeardownHTTP() 87 88 callCount := 0 89 err := pager.EachPage(context.TODO(), func(_ context.Context, page pagination.Page) (bool, error) { 90 actual, err := ExtractMarkerStrings(page) 91 if err != nil { 92 return false, err 93 } 94 95 t.Logf("Handler invoked with %v", actual) 96 97 var expected []string 98 switch callCount { 99 case 0: 100 expected = []string{"aaa", "bbb", "ccc"} 101 case 1: 102 expected = []string{"ddd", "eee", "fff"} 103 case 2: 104 expected = []string{"ggg", "hhh", "iii"} 105 default: 106 t.Fatalf("Unexpected call count: %d", callCount) 107 return false, nil 108 } 109 110 th.CheckDeepEquals(t, expected, actual) 111 112 callCount++ 113 return true, nil 114 }) 115 th.AssertNoErr(t, err) 116 th.AssertEquals(t, callCount, 3) 117 } 118 119 func TestAllPagesMarker(t *testing.T) { 120 pager := createMarkerPaged(t) 121 defer th.TeardownHTTP() 122 123 page, err := pager.AllPages(context.TODO()) 124 th.AssertNoErr(t, err) 125 126 expected := []string{"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii"} 127 actual, err := ExtractMarkerStrings(page) 128 th.AssertNoErr(t, err) 129 th.CheckDeepEquals(t, expected, actual) 130 }