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  }